實訓11 2018.03.31
final:
final修飾類:該類不能被繼承;
final修飾方法:該方法不能被繼承;
final修飾變量:形式上的常量,不能修改引用。final修飾的基本類型不能被修改,final修飾的引用類型不能修改引用。必須在對象創建之前對其進行賦值:創建時賦值或者在構造函數中進行賦值。
為被final修飾的變量提供setter方法是沒有意義的,並且會報錯,因為setter是在對象創建後進行修改。
static:
在方法和數據共享區中存在一個區域—靜態區,用於存儲static修飾的成員變量和方法。因為該區域是共享的,所以如果該區域的值被修改,那麽其他對象訪問該區域時,得到的值都是被修改後的值,所以也可以使用類名直接調用,因為static修飾後不再輸入某個對象而是屬於該類。建議使用類名直接調用靜態成員。
因為static方法先創建,所以不能訪問未創建的非靜態成員變量和方法,也不能在static方法中使用this,super去取變量和方法,即使是靜態成員變量也不可以,因為在類創建完成之前不能使用這兩個關鍵字。如果要訪問靜態成員,直接使用它的名字。
靜態方法在子類中不存在“重寫”(“覆蓋”)的說法,用static關鍵字修飾的方法和變量都屬於類本省,即使存在繼承關系,子類並沒有繼承父類的static修飾的變量和方法,所以說即使子類和父類中都有static 方法和變量(即方法名、返回值類型、參數列表和限制符等各方面都相同),他們也是沒有任何關系的,他們是相互獨立的,他們屬於各自類本身的。因此也就不存在多態特性。對於static修飾的變量,當子類和父類中存在同樣的static變量時,也是根據“靜態引用”而不是“動態引用”來調用相應的變量的。(如何證明子類中的方法不是覆蓋的父類中的方法呢?—使用@Override)所以,類中的靜態變量和方法是被“靜態調用”的而非“動態調用”。
子類可以通過向上轉型來訪問父類中的靜態變量和方法。
匿名對象:
特點:沒有變量名,只能使用一次。比如:System.out.println( (new Scanner(System.in)).next() );其中new Scanner(System.in)就是匿名對象。
內部類(類的嵌套):
可以寫在類內甚至方法內
成員內部類:向成員變量一樣寫在其他類中的類,比如:class A{ class B{}},這個B類就是成員內部類。如果想使用B創建實例化對象,那麽寫法如下:A.B b=new A().new B();
局部內部類:在方法中定義的類,比如:class C{void eat( class D{}
//Outter.java public class Outter{ public void out(){ class Inner{public void in(){}} Inner i=new Inner(); } } //Test.java main(){ Outter o=new Outter(); o.out();//這樣就能使用Inner }
內部類調用外部類的成員變量:
對於一般的成員變量,可以通過this調用,而對於成員內部類而言,如class A{ int i=8; class B{ ...A.this.i...}},這樣就可以調用到A的成員變量 i 了(外部類.this.變量名)!
匿名內部類:接口也可以創建匿名內部類(即接口的一個實現類)
package day0331; public class Test { public static void main(String[] args) { //匿名內部類 new Smoking() { @Override public void smoke() { System.out.println("smoking"); } @Override public void eat() { System.out.println("eat banana"); } }.eat(); } } interface Smoking { public abstract void smoke(); public abstract void eat(); }
匿名內部類的局限性在於只能使用一次,如果想取到裏面的smoke方法就需要在創建一個匿名內部類,解決辦法是:可以通過向上轉型來調用方法。
package day0331; public class Test { public static void main(String[] args) { //匿名內部類,局限性在於 Smoking s=new Smoking() { @Override public void smoke() { System.out.println("smoking"); } @Override public void eat() { System.out.println("eat banana"); } }; s.smoke(); s.eat(); } } interface Smoking { public abstract void smoke(); public abstract void eat(); }
聲明包的語句必須寫在文件有效代碼(即忽略註釋)的第一行。
導包時要導到java文件所在文件的的那一層。不導包則需要使用 packagename.classname。
代碼塊:
普通代碼塊:寫在方法中的代碼塊。
構造代碼塊:類中使用的代碼塊,如:class A{ {//構造代碼塊} }
靜態代碼塊:用static修飾的構造代碼塊,如: class A{ static{//靜態代碼塊} }。不管類生成多少個對象,靜態代碼塊只執行一次。
類被調用或該類的對象初始化時,存在以下順序:靜態代碼塊->構造代碼塊->構造方法
package day0331; //TestCon public class TestCon { static {System.out.println("static block");} {System.out.println("construct block");} public TestCon() { System.out.println("constructor"); } public static void main(String[] args) { TestCon t=new TestCon(); } }
運行結果為:
static block
construct block
constructor
實訓11 2018.03.31