內部類,類修飾符,上轉型物件,多型,介面回撥

shuaishuai3409發表於2016-05-12

內部類:
java支援在一個類中宣告另一個類,這樣的類稱之為內部類,而包含內部類的類稱為外部類。

內部類的使用方法:可以訪問外部類的成員變數和方法。但不可以在自己的類體中宣告類變數和類方法。
外部類使用內部類:外部類要想使用內部類裡的方法,是通過例項化內部類的物件,然後通過外部類的物件去呼叫內部類的物件的成員變數和方法。

如果我在main函式中,執行Tree tree=new Tree();就會出現no enclosing instance of type TT is accessible. Must qualify the allocation with an enclosing instance of type TT問題。(原因)解決方法:把Tree宣告為static的就可以了。

不過使用的時候,最好還是通過外部類使用內部類的方法去用,如下:

TT tt=new TT();
tt.tree.ff();/

完整呼叫格式:

public class TT {
    Tree tree;
    int val;
    void f1(){

    }
class Tree{//內部類
        int value;
        void ff(){
        val=2;//內部類中是可以訪問外部類的成員變數的。
        f1();//內部類也可以呼叫外部類的方法。
        }
    }
public static void main(String[] args) {
        // TODO Auto-generated method stub
        TT tt=new TT();
        tt.tree.ff();//通過外部類的物件,來訪問內部類物件裡面的變數和方法;
        tt.tree.value=1;

    }

}

類修飾符:

普通類前面可以有public,友好,abstract,final修飾符。類不能被protected和private修飾。

  • public:公共類。可以在任何另外一個類中(任何包),使用該類建立物件。

  • 友好:友好類。只能在同一包中,用該類建立物件

  • abstract:抽象類。內部可以有抽象方法,繼承時,父類中的抽象方法必須在子類中重寫,故抽象方法不能被final修飾。抽象類除可含有抽象方法外,其餘和普通類相似,也可被public、友好修飾,相當於公共抽象類,友好抽象類。但不能被final修飾,因為該類還要被繼承重寫;也不能用new建立該類的物件;另外子類繼承抽象類時不能降低方法的訪問許可權。子類不能繼承父類中的構造方法。

  • final:final類不能被繼承,即不能有子類。java中的String就是final類,不能被改變。final修飾方法,表示這個方法不能被重寫,final修飾成員變數,就是常量,java中常量必須賦給其初值,不能在改變。final修飾方法的引數時,該引數值不能在該函式體中被改變,只於傳參的函式傳參值有關。


物件的上轉型物件:

上轉型物件必須存在繼承,把子類建立物件的引用賦給父類的物件。上轉型物件特點:
父類A,子類B:

A a=new B();A a;
B b=new B();
a=b;

這裡寫圖片描述


多型:

父類中的某個方法被子類重寫時,可以產生各自的功能行為。


介面回撥

介面:多繼承時使用。類實現介面時,必須重寫介面的全部方法。介面和類類似,有介面的宣告和介面體。介面中的方法都是抽象方法,且預設都是pubic abstract形式。所以在類實現介面時,類中實現介面的方法必須加public修飾(不降低訪問許可權原則)。介面中無變數,全是常量,預設用public stactic final修飾。

inteface A{
    int a=100;//預設public static final修飾,常量必須賦初值。
    int f();//預設public abstract修飾,必須在類中重寫。
}
  • 介面可以被public和友好修飾,這點和普通類相同,都是同包的問題
  • 如果父類實現了介面,那麼繼承該父類的子類不必在使用關鍵字implements宣告自己使用這個介面
  • 介面可以被介面繼承,是繼承全部的方法和常量。
  • 如果一個類實現了一個介面,卻沒有實現介面中的所有方法,該類必為抽象類。

介面回撥:把實現某介面的類建立的物件的引用賦給該介面宣告的介面變數,那麼該介面變數可以呼叫被類實現的介面中的方法。

iterface A{
    void f();
}
class B implements A{
    public void f(){
        system.out.println("haha")
    }
}
pulic class C{
    pubic static void main(String[]args){
        A a;
        a=new B();
        a.f();
    }
}
//輸出haha

介面做引數:某方法引數是介面型別,那麼可以將實現該介面的類物件的引用傳遞給該介面引數,此時該介面引數可以回撥該類實現的介面中的方法。

“`
iterface A{
void f();
}
class B implements A{
public void f(){
system.out.println(“haha”)
}
}
class D{
pubic void g(A a1){
a1.f();
}
}
pulic class C{
pubic static void main(String[]args){
D d=new D();
d.g(new B());
}
}
//同樣輸出haha


相關文章