最近把自己比較犯暈的幾個小的JAVA知識點(diǎn)整理出來,一是回顧一下JAVA的知識,而是方式以后忘記
1、構(gòu)造函數(shù)的使用
類有哦一個特殊的成員方法叫做構(gòu)造方法,它的作用是創(chuàng)建對象并初始化成員變量。在創(chuàng)建對象時,會自動調(diào)用類的構(gòu)造方法。
JAVA中構(gòu)造方法必須與該類具有相同的名字,并且沒有方法的返回類型(包括沒有void)。另外,構(gòu)造方法一般都應(yīng)用public 類型來說明,這樣才能在程序的任意位置創(chuàng)建類的實(shí)例---對象。
每個類至少有一個構(gòu)造方法。如果不寫一個構(gòu)造方法,JAVA將提供一個默認(rèn)的,該構(gòu)造方法沒有參數(shù),而且方法體為空。
注意:如果一個類中已經(jīng)定義了構(gòu)造方法則系統(tǒng)不再提供默認(rèn)的構(gòu)造方法
例子:
Java代碼
- package test01;
-
- public class Hello {
- int id;
- String username;
- String password;
- public Hello(int id)
- {
- this.id = id;
- System.out.println("構(gòu)造函數(shù)1:id=" id);
-
- }
- public Hello(int i,String username,String password)
- {
- //此時,i這個局部變量沒有和成員變量重名,所以不用指定
- this.username = username;
- this.password = password;
- System.out.println("構(gòu)造函數(shù)2:username=" username " password=" password);
- }
- public Hello()
- {
- //用this調(diào)用上面的構(gòu)造函數(shù),必須上面有定義下面才能使用。
- this(5,"hualang","123456");
- }
-
- public static void main(String args[])
- {
- Hello hello1 = new Hello(3);
- Hello hello2 = new Hello(4,"loulijun","666666");
- Hello hello3 = new Hello();
-
- }
-
- }
輸出結(jié)果:
Java代碼
- 構(gòu)造函數(shù)1:id=3
- 構(gòu)造函數(shù)2:username=loulijun password=666666
- 構(gòu)造函數(shù)2:username=hualang password=123456
2、super,this的區(qū)別及使用
JAVA的this關(guān)鍵字只能用于方法體內(nèi),JAVA虛擬機(jī)(JVM)會給這個對象分配一個引用紫森的指針,這個指針的名字就是this,因此,this只能在類中的非靜態(tài)方法中使用,靜態(tài)方法和靜態(tài)的代碼塊中不能使用this,比如main方法中是不能使用this的,并且this只和特定的對象關(guān)聯(lián),而不和類關(guān)聯(lián),同一個類中的的不同對象有不同的this。
注意:函數(shù)參數(shù)或者函數(shù)中的局部變量和成員變量同名的話,成員變量被屏蔽,此時要訪問成員變量則需要使用
"this.成員變量"的方式引用成員成員變量,如果沒有同名的情況下,可以直接使用。
Java代碼
- package test01;
-
- public class ThisTest {
- private int number;
- private String username;
- private String password;
- final private int x = 6;
- public ThisTest(int number)
- {
- this.number = number;
- }
- public ThisTest(int number, String username, String password)
- {
- //成員變量和參數(shù)同名,成員變量被屏蔽,用“this.成員變量”的方式訪問成員變量
- this.number = number;
- this.username = username;
- this.password = password;
- }
- public ThisTest()
- {
- this(1,"通過this調(diào)用另一個構(gòu)造方法(3個參數(shù))","111111");
- }
- public ThisTest(String name)
- {
- this(2,name,"通過this調(diào)用另一個構(gòu)造方法");
- }
-
- public void test()
- {
- //局部變量與成員變量同名,成員變量被屏蔽,用"this.成員變量"的方式訪問成員變量
- int x;
- x = this.x 6;
- System.out.println("局部變量x=" x);
- System.out.println("成員變量this.x=" this.x);
- }
-
- public void showMessage(ThisTest t)
- {
- System.out.println("-----------------------");
- System.out.println(t.number);
- System.out.println(t.username);
- System.out.println(t.password);
- System.out.println("-----------------------");
- test();//可以使用this.test()調(diào)用
- }
- public static void main(String args[])
- {
- ThisTest t1 = new ThisTest();
- ThisTest t2 = new ThisTest("loulijun");
- t1.showMessage(t1);
- t2.showMessage(t2);
- }
- }
運(yùn)行結(jié)果如下:
Java代碼
- -----------------------
- 1
- 通過this調(diào)用另一個構(gòu)造方法(3個參數(shù))
- 111111
- -----------------------
- 局部變量x=12
- 成員變量this.x=6
- -----------------------
- 2
- loulijun
- 通過this調(diào)用另一個構(gòu)造方法
- -----------------------
- 局部變量x=12
- 成員變量this.x=6
運(yùn)行結(jié)果分析:
main函數(shù)中首先創(chuàng)建兩個ThisTest對象,t1、t2,然后調(diào)用用著兩個對象調(diào)用showMessage()方法,并且將自己作為參數(shù)傳遞給showMessage(),比如t1.showMessage(t1):這個方法會以這個對象調(diào)用number,username,password,以及test()方法,從而打印出數(shù)據(jù)
下面是super的使用及說明
super和this作用類似,使被屏蔽的成員變量或者成員方法課件,或者說用來引用被屏蔽的成員變量和成員方法。
不過super是用在子類中,目的是訪問直接父類中被屏蔽的成員,注意是直接父類(類之上最近的超類)。
1、在使用super的時候,一般盡可能的使用private私有化
2、子類構(gòu)造方法調(diào)用父類的構(gòu)造方法一般用super(參數(shù)列表)的方式調(diào)用,參數(shù)不是必須的。同時還要注意,super(參數(shù)列表)這條語句只能用在子類構(gòu)造方法體中的第一行
3、當(dāng)子類方法中的局部變量或者子類的成員變量與父類成員變量同名時,也就是子類局部變量覆蓋父類成員變量時,用
"super.成員變量名"來引用父類的成員變量。當(dāng)然,如果父類的成員變量沒有被覆蓋,也可以用"super.成員變量名"來引用父類成員變量,不過這是不必要的
4、當(dāng)子類的成員方法覆蓋了父類的成員方法時,也就是子類和父類有完全相同的方法定義(但方法體可以不同),此時,用"super.方法名(參數(shù)列表)"的方式訪問父類的方法
父類Father.java
Java代碼
- package test01;
-
- public class Father {
- public String v = "父類Father";
- public String x = "父類的成員變量";
-
- public Father()
- {
- System.out.println("Father無參構(gòu)造方法被調(diào)用");
- }
- public Father(String v)
- {
- this.v = "Father有參構(gòu)造方法被調(diào)用";
- }
- public void showMessage()
- {
- System.out.println("Father的showMessage()方法被調(diào)用");
- }
-
- public static void main(String args[])
- {
- //自動生成存根方法
- }
- }
子類Son.java
Java代碼
- package test01;
-
- public class Son extends Father {
- public String v = "子類Son";
- public Son()
- {
- //調(diào)用父類的構(gòu)造方法,且只能放在第一行
- super();
- System.out.println("Son的無參構(gòu)造方法被調(diào)用");
- }
- public Son(String str)
- {
- super(str);
- System.out.println("Son的有參構(gòu)造方法被調(diào)用");
- }
- //覆蓋了父類的成員方法showMessage()
- public void showMessage()
- {
- System.out.println("Son的showMessage()方法被調(diào)用");
- }
-
- public void test()
- {
- String v = "局部變量v覆蓋了成員變量v和超類變量v";
-
- System.out.println("---------------------------");
- System.out.println("子類局部變量v=" v);
- System.out.println("子類成員變量v=" this.v);
- System.out.println("父類成員變量v=" super.v);
- System.out.println("子類繼承而來的超類成員變量x=" x);
- System.out.println("超類成員變量x=" super.x);
- System.out.println("---------------------------");
- showMessage();//調(diào)用子類的showMessage()方法
- this.showMessage();//調(diào)用子類的showMessage()方法
- super.showMessage();//調(diào)用父類的showMessage()方法
- }
-
- public static void main(String args[])
- {
- Son son =new Son();
- son.test();
- }
- }
運(yùn)行Son.java,結(jié)果如下:
Java代碼
- Father無參構(gòu)造方法被調(diào)用
- Son的無參構(gòu)造方法被調(diào)用
- ---------------------------
- 子類局部變量v=局部變量v覆蓋了成員變量v和超類變量v
- 子類成員變量v=子類Son
- 父類成員變量v=父類Father
- 子類繼承而來的超類成員變量x=父類的成員變量
- 超類成員變量x=父類的成員變量
- ---------------------------
- Son的showMessage()方法被調(diào)用
- Son的showMessage()方法被調(diào)用
- Father的showMessage()方法被調(diào)用
|