1. 程式人生 > >實訓11 2018.03.31

實訓11 2018.03.31

引用類型 靜態 src nal 意義 不能訪問 ... 其他 str

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{}

)},這個D類就是局部內部類。局部內部類的對象的創建:在該方法(eat())中實例化該內部類(D)的一個對象,並調用該內部類(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