java关于包的叙述_Java中构造方法,包的引用,final,super等词的概括
final修飾的類不允許被繼承。
一個類不能既是final的,又是abstract的。因為abstract的主要目的是定義一種約定,讓子類去實現這種約定,而final表示該類不能被繼承,兩者矛盾。
final修飾方法
final修飾方法,表示該方法不能被子類中的方法覆寫Override。
final方法
將方法聲明為final,那就說明你已經知道這個方法提供的功能已經滿足你要求,不需要進行擴展,并且也不允許任何從此類繼承的類來覆寫這個方法,但是繼承仍然可以繼承這個方法,也就是說可以直接使用。另外有一種被稱為inline的機制,它會使你在調用final方法時,直接將方法主體插入到調用處,而不是進行例行的方法調用,例如保存斷點,壓棧等,這樣可能會使你的程序效率有所提高,然而當你的方法主體非常龐大時,或你在多處調用此方法,那么你的調用主體代碼便會迅速膨脹,可能反而會影響效率,所以你要慎用final進行方法定義。
final類
當你將final用于類身上時,你就需要仔細考慮,因為一個final類是無法被任何人繼承的,那也就意味著此類在一個繼承樹中是一個葉子類,并且此類的設計已被認為很完美而不需要進行修改或擴展。對于final類中的成員,你可以定義其為final,也可以不是final。而對于方法,由于所屬類為final的關系,自然也就成了final型的。你也可以明確的給final類中的方法加上一個final,但這顯然沒有意義。
final修飾變量
final成員變量表示常量,只能被賦值一次,賦值后值不再改變。
當final修飾一個原生數據類型時,表示該原生數據類型的值不能發生變化;
如果final修飾一個引用類型時,表示該引用類型不能再指向其他對象了,但該引用所指向的對象的內容是可以發生變化的。
本質上是一回事,因為引用的值是一個地址,final要求值,即地址的值不發生變化。
final修飾一個成員變量(屬性),必須要顯示初始化。
這里有兩種初始化方式,一種是在變量聲明的時候初始化;第二種方法是在聲明變量的時候不賦初值,但是要在這個變量所在的類的所有的構造函數中對這個變量賦初值。
當函數的參數類型聲明為final時,說明該參數是只讀型的。
super的用法
昨天寫this用法總結的時候,突然產生了一個問題,請教別人之后,有了自己的一點認識。還是把它寫下來,為大家更好的認識提供一點思路。
1)有人寫了個很好的初始化屬性的構造函數,而你僅僅想要在其中添加另一些自己新建屬性的初始化,這樣在一個構造函數中調用另外一個構造函數,可以避免重復的代碼量,減少工作量;
2)在一個構造函數中調用另外一個構造函數的時候應該用的是同一塊內存空間,在默認的構造函數中先初始化變量,調用另一個的時候覆寫已經初始化的變量的值;
3)整個調用的過程和遞歸調用函數有點類似,不斷充氣球,直到整個氣球膨脹起來,不斷的深層遞進,遇到停止標記,逐層的跳出來。
寫了段代碼,解釋我上面的敘述:
1 class JavanTiger {
2 int age; // 年齡
3 int hight; // 身體高度
4
5 public JavanTiger() {
6 print();
7 this.age=2; //這里初始化 age 的值 ,但遞歸返回的時候,這個值會被覆寫
8 }
9
10 public JavanTiger(int age) {
11 this(); // 調用自己的第一個構造函數,下面的兩個語句數不執行的
12 this.age = age;
13 print();
14 }
15
16 public JavanTiger(int age, int hight) {
17 this(age); // 調用自己第二個構造函數 ,下面的兩個語句數不執行的
18 this.hight = hight;
19 print();
20 }
21
22 public void print() { //打印函數
23 System.out.println("I'am a " + age + "歲 " + hight + "尺高 tiger!");
24 }
25 public static void main(String[] args) {
26 new JavanTiger(3,3);
27 }
28 }
29 //output
30 //I'am a 0歲 0尺高 tiger!
31 //I'am a 3歲 0尺高 tiger!
32 //I'am a 3歲 3尺高 tiger!
個人理解就是這樣了,可能里面還有問題,比如構造函數遞歸調用和程序函數遞歸調用的機制是否似乎相同的?構造函數同對象一起產生,也就是同時會分配內存空間出來,那門這樣的遞歸調用會不會打亂分配內存的順序?希望看到的大牛們拍板,給個最好的解釋。
今天要總結的是 super 這個關鍵字的使用,super 在構造函數中出現的時候一般是當前這個類繼承了其他的類,super 的出現就是為了調用父類的構造函數,貼段代碼先
1 class Tiger {
2 int age; // 年齡
3 int hight; // 身體高度
4
5 public Tiger() {
6 print();
7 }
8
9 public void print() {
10 System.out.println("I'am a " + age + "歲 " + hight + "尺高 tiger!");
11 }
12 }
13 public class JavanTiger extends Tiger {
14 public JavanTiger() {
15 super(); // 調用父類無參數的構造函數
16 }
17 public static void main(String[] args) {
18 new JavanTiger();
19 }
20 }
其實在類JavanTiger 中的構造函數中的 super()可以不寫,JAVA會默認調用父類的無參數的構造函數,但如果父類沒有定義無參數的構造函數,沒有語法錯誤,程序會自動退出,沒有任何打印語句,這時候你需要手動調用其他父類的構造函數,貼段代碼:
1 class Tiger {
2 int age; // 年齡
3 int hight; // 身體高度
4
5 public Tiger(int age) {
6 this.age = age;
7 print();
8 }
9 public void print() {
10 System.out.println("I'am a " + age + "歲 " + hight + "尺高 tiger!");
11 }
12 }
13 public class JavanTiger extends Tiger {
14 public JavanTiger() {
15 super(1); // 調用父類有參數的構造函數
16 }
17 public static void main(String[] args) {
18 new JavanTiger();
19 }
20 }
這段代碼中的 super(1)必須要寫進去,否則編譯器會報錯。所以我簡單的總結了一下,“this()是調用自己其他的構造函數,super()是調用自己繼承的父 類的構造函數“,如果只想調用默認無參數的父類構造函數,不用在子類的構造函數當中寫出來,但是實際編程的時候,總是會忽略這一點。
那門這兩個關鍵字能不能同時出現在子類的一個構造函數當中納?答案肯定是不能。先說下自己的理解:
1)在新建一個基類的時候,不論遞歸調用幾次自身的構造函數,最終你都會去調用父類的構造函數,(不是顯式調用的話,系統會調用默認無參數的父類構造函數);
2)JAVA 中規定使用 this 和 super 時必須放在構造函數第一行,只有一個第一行;只能使用一個要不然死循環
轉載:http://www.cnblogs.com/java-class/archive/2012/12/20/2826499.html
This的用法
用類名定義一個變量的時候,定義的應該只是一個引用,外面可以通過這個引用來訪問這個類里面的屬性和方法,那們類里面是夠也應該有一個引用來訪問自己的屬 性和方法納?呵呵,JAVA提供了一個很好的東西,就是 this 對象,它可以在類里面來引用這個類的屬性和方法。先來個簡單的例子:
public classThisDemo {
String name="Mick";
public voidprint(String name){
System.out.println("類中的屬性 name="+this.name);
System.out.println("局部傳參的屬性="+name);
}
public static voidmain(String[] args) {
ThisDemo tt=newThisDemo();
tt.print("Orson");
}
}
關于返回類自身的引用,Thing in Java有個很經典的例子,通過this 這個關鍵字返回自身這個對象然后在一條語句里面實現多次的操作,還是貼出來。
public classThisDemo {
intnumber;
ThisDemo increment(){
number++;
return this;
}
private voidprint(){
System.out.println("number="+number);
}
public static voidmain(String[] args) {
ThisDemo tt=newThisDemo();
tt.increment().increment().increment().print();
}
}
那也應該在一個類中定義兩個構造函數,在一個構造函數中通過 this 這個引用來調用另一個構造函數,這樣應該可以實現,這樣的實現機制在實際做應用開發的時候有會有什么樣子的用處納?貼下寫的代碼:
public classThisDemo {
String name;
intage;
publicThisDemo (){
this.age=21;
}
public ThisDemo(String name,intage){
this();
this.name="Mick";
}
private voidprint(){
System.out.println("最終名字="+this.name);
System.out.println("最終的年齡="+this.age);
}
public static voidmain(String[] args) {
ThisDemo tt=new ThisDemo("",0); //隨便傳進去的參數
tt.print();
}
}
看上面這段代碼雖然很短,理解起來似乎也很順理成章,在有參數的構造函數中賦值name 在無參數的當中賦值age屬性。但我個人覺得其中有點問題,實例化一個類應該先為對象ThisDemo分配內存,先調用構造函數 ThisDemo(String name,int age),執行到第一行的時候,調用ThisDemo()構造函數,也就是說這里應該會有兩個內存空間的,一個是ThisDemo(String name,int age)執行到一點的空間和另一個是ThisDemo()執行空間,為什么最后打印出來的結果是都實例化了一個對象中的兩個屬性name和age納?請大 牛賜教!
總結一下:
1) this 關鍵字是類內部當中對自己的一個引用,可以方便類中方法訪問自己的屬性;
2)可以返回對象的自己這個類的引用,同時還可以在一個構造函數當中調用另一個構造函數(這里面上面有個問題)
轉載:http://www.cnblogs.com/java-class/archive/2012/12/19/2825463.html
總結
以上是生活随笔為你收集整理的java关于包的叙述_Java中构造方法,包的引用,final,super等词的概括的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记本开机u盘启动项怎么设置 设置笔记本
- 下一篇: java 递归 堆栈_尾递归函数仍在Ja