學習java---面向對象(下)

知識回顧:

1) 面向對象,面向過程,面向接口

a) 老牌,傳統,思考方式:面向過程,思考方式和日常我們考慮問題一樣。遇到需求頻繁修改時,設計就崩潰。因爲用戶他不是軟件人員,他說不清一些潛在需求,導致做出來的東西和他理解是不同。軟件返工,甚至軟件失敗。
b) 面向對象是主流思考方式,它想的“多”,超出用戶需求,從而提前做了些用戶潛在需求中內容。所以當用戶提出需求變更,新的需求時,其實我們提前做好了。這就是面向對象優勢。
c) 舉例:用戶第一次需求,查詢出現在講課的老師姓名。面向過程思考,就把老師姓名給他完成任務。面向對象思考,它會做很多事情。老師姓名、年齡、籍貫、工作單位、家庭地址、家庭成員。。。。思考準備內容更多。新的需求,用戶又說,我想知道這個老師他的家庭情況。第一種面向過程都加入新的代碼,第二種思考已經做好了,直接返回就可以。
d) 面向接口和麪向過程、面向對象根本不是一回事,不能一起比較。它們描述不同東西。面向過程、面向對象是一種軟件設計思考方式,關注問題點不同。而面向接口只是具體編程一個策略。比如:接口來定義規範,廠商去實現規範。它的作用規範,例如:JDBC規範,sun公司java就提供很多接口,mysql數據庫廠商根據這些接口規範要求,去實現具體數據庫訪問。

2) 面向對象是設計思想,具體要完成軟件需要載體。在java中稱爲class。

a) 類,描述一類事物抽象,People,Cat(藍圖,圖紙,死的) b) 對象,具體的事物,哪個人?哪個貓。(實例,活動) c) 類 對象
= new 類();Cat cat = new Cat();

3) 類的結構

a) 成員變量,保存類中數據,name=”tony”,tony是數據,name保存數據 b) 普通方法,加工處理,work(),算法
c) 構造方法,用來創建對象(new)和設置成員變量初始化值,構造方法只執行一個
i. 默認無參構造,如果沒有其他方法java編譯器會自動加默認構造,死記;自己寫默認構造可以。
ii. 有參構造,不但創建對象,而且設置成員變量初始化值

4) 成員變量和局部變量(聲明週期)

a) 在類同級聲明的這些變量,稱爲成員變量。類在創建時,這些成員變量也被創建,類(對象)沒有其他地方調用,當對象結束時,這些成員變量也隨之消亡。
b) 在方法體內,包括方法的參數,都是局部變量。當方法結束局部變量就消失。
c) 應該定義儘量小生命週期(作用域)變量早消亡,它所佔用的內存就早騰出來。就可以放其他的應用程序的變量。

5) 方法:實參和形參

a) 實際的參數,具體的值。work(“tony”); b) 形式的參數,臨時中間變量,不是具體值。public void
work(String name){ name }

6) static和非靜態方法調用

a) 少於static b) static可以不用new創建對象,而直接調用,HelloWorld.hello();
c) 非static就必須先創建對象,纔可以調用 new HelloWorld(); hw.hello();

7)this上下文變量,單純的看this不知道它是哪個類?

People,Cat類,在Cat類中使用this,this就代表Cat,在People類中使用this,this就代表People
一般情況下是隱性使用,聲明成員變量name,就可以在類中各個普通、構造方法中使用name,此時這個name,真實this.name。
當一個方法內,它的參數和成員變量同名。要區分它們:this.name=name;前面name就是成員變量,後面name是參數。

8) pojo 簡單的java對象(純粹java對象)

a) 一堆的私有屬性,用戶不能直接訪問這些成員變量,必須通過set去設置,通過get去獲取。好處封裝細節,set過程和get過程都是開發者控制的,對於使用用戶根本不知道過程中幹了什麼事情?如果直接使用成員變量,用戶乾的過程都是透明。你設置什麼它就是什麼name=”abc”。如果通過set後,判斷如果是abc,改成a1b2c3(假定),用戶是不知道實際值被篡改。
b) 一堆get/set方法,擴展性很好,安全性,結構松耦合。程序更加靈活
c) 爲了測試方便,觀察對象中成員變量的值是否正確,可以toString()方法

今天內容:

  1. ) 字符串處理,日期、浮點數
  2. ) 自己寫一些轉換工具類(方法)api
  3. ) 字符串和字符差異
    a) String,存儲多個字符
    b) Char,存儲一個字符

2) Jdk/jre

  • Java提供非常豐富基礎工具類,在jdk,一部分jre。 JDK,java deveploer

  • kit,java語言開發者工具包 JRE,java runtime enverment,java運行時環境

  • JAVA_API_CN.CHM

  • Java 2 SE(標準工具庫,直接利用寫好的工具類,開發就更加快速,不用自己寫)jdk java 2

  • EE(javaWeb、tomcat web中間件、三大框架、微服務)企業級開發 java 2 ME(嵌入式,智能家居)

  • java自身已經有些沒落,但是java是一個開放平臺,指定很多規範j2ee,各個廠家爲之實現替代jdk很多功能,擴展它的很多功能。自身狹義java沒落,但是廣義java方興未艾,非常類。互聯網架構,擴展java,根在java,調用javase/ee,Dubbo阿里,MyCat數據庫增強,lucene+solr全文檢索,Haddop、Spark、Storm、Flink等都是java語言寫的,必須依賴使用java
    api,JDK

2)在java世界中萬物皆對象?

package cn.tedu;
public class TestArea {
	public static void main(String[] args) {
		//包裝類似父類
		Byte b = 10;		
		//打印b的類名
		System.out.println( b.getClass().getName());		
		//打印b的父類(superClass)
		System.out.println( b.getClass().getSuperclass());
		System.out.println( b.getClass().getSuperclass().getSuperclass());		
		Integer i = 10;
		System.out.println( i.getClass().getName() );
		System.out.println( i.getClass().getSimpleName() );
		System.out.println( i.getClass().getSuperclass() );
		System.out.println( i.getClass().getSuperclass().getSuperclass());
			Double d = 10D;		//d明確告知它是一個浮點數,大小寫都可以
		System.out.println( d.getClass().getName() );
		System.out.println( d.getClass().getSuperclass() );
		System.out.println( d.getClass().getSuperclass().getSuperclass() );		
		Character c = 'a';	//它就直接繼承Object類,就沒有爺爺了
		System.out.println( c.getClass().getName() );
		System.out.println( c.getClass().getSuperclass() );
		System.out.println( c.getClass().getSuperclass().getSuperclass());		
		Cat cat = new Cat();		//自己定義類,它有父親嗎?
		System.out.println( cat.getClass().getSuperclass() );
	}
}

在java中所有類它都是繼承自Object類,它的父類也叫超類,SuperClass 問題:java中爲何這樣設計呢?從一個點去看
我們寫的Cat沒有寫toString()方法,但是它怎麼有呢? 但是cat對象有toString()方法

cn.tedu.Cat@659e0bfd cn.tedu.Cat,類的全路徑,包名.類名 @
659e0bfd(0x11),就可以理解爲它在內存中的地址
我們自己寫的類,悄悄繼承Object類,繼承後,Object的一些方法(財產)直接我們也可以使用。在Object類中定義toString方法。

3) 字符串處理一些工具類方法

  • …可變參數,可以支持2個參數,3個參數,n個參數(新版本才支持方式)
package cn.tedu;
public class TestArea {
	public static void main(String[] args) {
		Integer i = 100;
		//最普通方法,結構不清晰,4個部分在拼串
		System.out.println("整數的值是"+i+",它的父類是:"+i.getClass().getSuperclass());		
		//清晰結構format,這種方式術語叫做佔位符
		System.out.println(  
				String
				.format("整數的值是%s,它的父類是:%s", i , i.getClass().getSuperclass() ) 
		);
	}
}

Concat字符串連接

package cn.tedu;
public class TestArea {
	public static void main(String[] args) {
		String s1 = "中國"; // u8
		String s2 = "deflaskdfjalwkejfoaiwjef;oaiwjefoaijeoijeofaiwjefoaijweofiajeoi";
		System.out.println(s1 + s2); // 連接符,字符串拼接
		System.out.println(s1.concat(s2));
		System.out.println(s1.length());
		System.out.println(s2.length());
		// 這個字符串中前後有空格,中間有空格
		String s = "     中國這次疫情發展非常快,         策略實施也非常快 ,封城,封街道,封小區,避免病毒傳播            ";
		System.out.println(s);
		System.out.println(s.trim());
		String c = "中國新疫情";
		System.out.println(c.charAt(0)); // java規定第一個0
		System.out.println(c.charAt(1));
		System.out.println(c.charAt(4));
		String e = "cat";
		// 獲的首字母
		System.out.println(e.charAt(0));
		System.out.println(e.toUpperCase());
		System.out.println(e.toLowerCase());
		// 截取字符串 sub子串,從開始位置到最後at
		System.out.println(e.substring(1));
		// 首字母大寫 Cat
		e = "tonychen";		
		// 第一步:獲取首字母
		System.out.println(); // 換行,空一行
		String a1 = e.charAt(0) + ""; // 技巧,java會自動按字符串來轉換
		System.out.println(a1);
		// 第二步:首字母大寫
		String a2 = a1.toUpperCase();
		System.out.println(a2);
		// 第三步:截取後面字符串
		String a3 = e.substring(1);
		System.out.println(a3);
		// 第四步:拼接字符串
		System.out.println(a2 + a3);
	}
}
package cn.tedu;
public class TestArea {
	public static void main(String[] args) {
		//要求:135-728-01415
		String phone = "13572801415";
		
		//第一步截取字符串,3個子串,中間使用-連接
		String s1 = phone.substring(0,3);
		String s2 = phone.substring(3,6);
		String s3 = phone.substring(6);
		String s = s1 + "-" + s2 + "-" + s3;
		System.out.println(s);
	}
}
package cn.tedu;
public class TestArea {
	public static void main(String[] args) {
		String email = "[email protected]";
		//不能固定位置截取字符串,找特徵地方		
		//先找到@不固定位置,格式是固定
		int pos = email.indexOf("@");
		System.out.println(pos);		
		String s1 = email.substring(0, pos);		//@前面位置
		String s2 = email.substring(pos+1);		//@後面位置
		System.out.println( s1 );
		System.out.println( s2 );
	}
}
package cn.tedu;
public class TestArea {
	public static void main(String[] args) {
		String filename = "girl.gif";
		//需求:獲取後綴名稱,帶.mp4		
		//獲取最後一個點的位置
		int pos = filename.lastIndexOf(".");
		System.out.println(pos);		
		System.out.println( filename.substring(pos) );
	}
}

小結:

  • 萬物皆對象,在java中所有類都是Object的子類,都是它兒孫。如果自己創建類沒有寫,java會自動默認Object是它的超類Superclass
  • 包裝類型,Number(byte/short/int/long/float/double),Object(char/boolean)
  • 字符串,在開發中使用最頻繁。Jdk有很多佔用方法來支持字符串處理(jdk/jre)java.lang.*
package cn.tedu;
public class TestArea {
	public static void main(String[] args) {
		String phone = "13572801415";
		String s1 = phone.substring(6);
		System.out.println(s1);	
		String s2 = phone.substring(6,11);
		System.out.println(s2);
	}
}

3) this是誰,是類還是對象

this代表對象,習慣this代表類。(兩種說法都可以) Cat cat = new Cat();
this代表cat,習慣說法this代表Cat類。

4) 包裝類型和基本類型區別?

基本類型就沒有額外方法,哪裏來的getClass方法? 包裝類型 Charater c,包裝類型,它帶有getClass()

5) java沒有數據庫,說法錯誤,

java訪問數據庫,通過jdbc,標準結構方式去訪問mysql,oracle
阿里雲,它提供電腦,你遠程使用,阿里雲上可以部署數據庫,你就可以訪問數據庫,但是它可以部署很多東西,nginx、redis、rabbitmq、kafka等等,這些都可以放在阿里雲上。它可以提供服務,也可以提供這些程序。
阿里雲和數據庫沒有本質關係,不可直接進行比較。沒有可比性。

6) get方法裏的return作用?

public Integer get(Integer x, Integer y){ return x+y; } return
就是返回的作用。把x+y結果返回給調用這個方法的地方。 Integer z = get(10,20);,把30賦值給z變量

7)pos爲什麼要+1

package cn.tedu;
public class TestArea {
	public static void main(String[] args) {
		String email = "[email protected]";
		int pos = email.indexOf("@");
		System.out.println(pos);		
		String name = email.substring(0, pos);
		System.out.println(name);		
		//注意我只要tedu.cn,不要@
		String mail = email.substring(pos+1);
		System.out.println(mail);
	}
}

7) Integer I = new Integer(10);
8) String.format格式化

a) 一般情況下都使用字符串拼接(汽車) b) Java又提供一種方式format(騎自行車) c) Format通過佔位符表達
%s,有幾個佔位符,必須有幾個參數 d) Jdk高版本,1,7、1.8才提供這種方式支持,參數個數不固定,String, Object …
args

package cn.tedu;

public class TestArea {
	public static void main(String[] args) {
		String who = "小王";
		String something = "喫香蕉"		
		String s = "%s回家%s";		//根據參數順序挨個替換		
		//拼寫字符串方式
		//方式一
		System.out.println( who + "回家" + something);		
		//方式二
		System.out.println( String.format(s, who, something ) );
	}
}
package cn.tedu;
public class TestArea {
	public static void main(String[] args) {
		String  song = "liuyu.ly.mp4.123";
		//需求:獲取.mp4
		int pos = song.lastIndexOf(".");		//找出最後一個位置
		String s = song.substring(0, pos);
		//s="liuyu.ly.mp4"		
		System.out.println(s);		
		pos = s.lastIndexOf(".");
		String s1 = s.substring(pos);
		System.out.println(s1);
	}
}

9) 什麼時候用int,什麼時候用Integer

Int 基本類型,它沒有額外方法,它佔內存小 Integer 保證類型,它有很多額外方法,它佔用內存大。
在開發中儘量使用基本類型,運算速度快, 一般的原則: 在類的成員變量使用包裝類型Integer 在方法中的變量使用基本類型 public
int add(int x, int y){} public Integer add(Integer x, Integer y){}

10)work是一個普通方法,newPeople(構造方法參數)
11)endsWith和startsWith

package cn.tedu;
public class TestArea {
	public static void main(String[] args) {
		//需求:判斷文件是否以.class結尾,答案:是true,否false
		String className = "HelloWorld.class";		
		boolean b1 = className.endsWith(".class");
		boolean b2 = className.endsWith(".java");		
		if(b1) {
			System.out.println( className+" 這個文件是一個字節碼文件");
		}else if(b2) {
			System.out.println( className+" 這個文件是一個源代碼文件");
		}		
		//需求:以tony開頭
		String name = "xtonychen";
		boolean b = name.startsWith("tony");
		System.out.println(b);
	}
}

12)repalce

package cn.tedu;

public class TestArea {
	//實現磁盤文件獲取它對應類的包路徑+類名
	public static void main(String[] args) {
		//需求:替換,把.替換/
		String name = "cn.tedu.Cat";	//包路徑,類名
		name = name.replace(".", "/");
		System.out.println(name);		
		//需求:把\\斜槓替換成/,
		String path = "D:\\java\\ws\\power7\\hello\\src\\cn\\tedu\\Cat.java";
		path = path.replace("\\", "/");
		System.out.println(path);		
		//D:/java/ws/power7/hello/src/cn/tedu/Cat.java,把前面src之前目錄包括src都去掉
		int pos = path.indexOf("src/")+4;
		System.out.println(pos);		
		path = path.substring(pos);
		System.out.println(path);		
		pos = path.lastIndexOf(".");
		path = path.substring(0,pos);
		System.out.println(path);		
		path = path.replace("/",".");
		System.out.println(path);
	}
}

13)split拆分,它的參數regex,不是普遍字符串,正則表達式
正則表達式,裏面.是有自己含義,代表每個字符,java中提供轉義字符,
告訴代碼,這是一個普通.不是正則表達式中的.。
.就叫轉義字符,\.,又出現問題\是正則表達式特殊符號
記住結論:正則表達式中要表示是一個普通的.,就\.即可

14) 身份證解析

package cn.tedu;

public class TestArea {
	public static void main(String[] args) {
		//需求:解析身份證號碼
		//總共18,六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位校驗碼。
		String cardNo = "61011319801014214x";
		System.out.println("身份證號:" + cardNo);		
		String addressNo = cardNo.substring(0,6);
		System.out.println("地址碼:"+addressNo);		
		String birthday = "";		//中文格式:1980年3月4號
		//怎麼幹掉月和日前面可能是0		
		String year = cardNo.substring(6,10);
		//利用整數會自動把前面0去掉,字符串007,轉換整數7
		String month = cardNo.substring(10,12);
		int m = Integer.parseInt(month);		//這個parseInt方法把字符串轉換整數
		month = m+"";	//數值和字符串拼接,自動轉換成字符串類型		
		String day = cardNo.substring(12,14);
		int d = Integer.parseInt(day);
		day = d+"";		//這樣就把零去掉了
		birthday = year;
		System.out.println("出生年月:"+birthday+"年"+month+"月"+day+"日");		
		//又一個技巧,利用倒數4位,去掉最後一位
		String serNo = cardNo.substring( cardNo.length()-4, cardNo.length()-1);
		System.out.println("順序號:"+serNo);	//211		
		String sex = cardNo.substring( cardNo.length()-2, cardNo.length()-1 );	//順序號最後一位是奇數男,偶數女
		int i = Integer.parseInt(sex);		//把字符串轉換整型
		if(i%2==1) {				//取餘數,如果餘數1,說明是奇數
			sex = "男";
		}else if(i%2==0) {		//取餘數,如果餘數0,說明是偶數
			sex = "女";
		}		
		System.out.println("性別:"+sex);		
		String checkNo = cardNo.substring( cardNo.length()-1 );
		System.out.println("驗證碼:" + checkNo);
	}
}

15) 姓名隱蔽處理

package cn.tedu;

public class TestArea {
	public static void main(String[] args) {
		//需求:很多名字,把中間字變成*,如果是兩個把後面字變成*
		//生活中,有些重要人名信息不完全展現,把其中字變成*		
		//定義一個字符串數組,x[],中括號數組
		//等號右邊數組初始化,數組元素直接使用逗號隔開
		String[] names = {"周星馳","黃渤","孫儷","童安格","王傑","周華健"};		
		//數組遍歷foreach
		for(String s : names) {
			String s1 = s.substring(0,1);
			String s2 = s.substring(1,2);
			String s3 = s.substring(2);			
			//System.out.println(s1+","+s2+","+s3);			
			String name = s1+"*"+s3;
			System.out.println(name);
		}		
	}
}

問題:

1)valueOf和parseInt有什麼區別?

package cn.tedu;
public class TestArea {
	public static void main(String[] args) {
		int x = 100;		
		//把整數類型轉換字符串
		String s = String.valueOf(x);
		System.out.println(s);		
		String s1 = "1000";
				//把字符串s1,轉換整數類型int的y
		int y = Integer.parseInt(s1);
		System.out.println(y);
	}
}

2)foreach()

package cn.tedu;
public class TestArea {
	public static void main(String[] args) {
		int[] a = {1,2,3,6,7,8,10};	//聲明一個整形數組
		for(int i : a) {
			System.out.println(i);
		}		
		//怎麼知道for循環結束呢?
		//可以得到數組大小
		System.out.println("數組長度爲:" + a.length);
		//總共遍歷7次後,就結束for循環
	}
}
package cn.tedu;

public class TestArea {
	public static void main(String[] args) {
				String[] names = {"周星馳","黃渤"};		//,"孫儷","童安格","王傑","周華健"				
				for(String name : names) {
					//System.out.println(name.charAt(1));					
					//注意repalce支持,兩個參數都是char類型
					//name = name.replace( name.charAt(1) , '*');		//寫法1
					name = name.replace( name.charAt(1)+"", "***");	//寫法2,寫法2更加靈活
					System.out.println(name);
				}
	}
}

3)for和foreach循環

package cn.tedu;

public class TestArea {
	public static void main(String[] args) {
				String[] names = {"周星馳","黃渤","孫儷","童安格","王傑","周華健"};		//		
for(String name : names) {					
//System.out.println(name.charAt(1));	
					//注意repalce支持,兩個參數都是char類型
					//name = name.replace( name.charAt(1) , '*');		//寫法1
					name = name.replace( name.charAt(1)+"", "***");	//寫法2,寫法2更加靈活
					System.out.println(name);
				}				
				//使用for循環怎麼實現?
				for(int i=0; i<names.length; i++) {	//利用數組長度,作爲循環結束條件
					//數組是有下標值,names[0],0就叫做下標
					System.out.println(names[i]);
				}				
				//兩種實現都可以,寫哪個沒有太大區別,顯然foreach循環方式代碼更加簡潔!
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章