java筆記--接口和內部類

1、接口
(1)、接口的定義
定義一個接口使用interface關鍵詞,它只能被默認或者public修飾,使用其他修飾符都將報錯。一般來講,接口的內部定義了一些被隱式指定爲public abstract的方法,也可以定義(很少這樣定義)一些變量(只能被public static final修飾)。接口內部定義的方法不能有具體的實現,也就是說接口中的方法只能是抽象方法。
[public] interface InterfaceName
{
void method();//該方法爲抽象方法,沒有具體的實現
}
那麼如何使用接口呢?要使用一個接口,需要定義一個類,讓該類實現這個接口。
class ClassName implements InterfaceName1,InterfaceName2...
{
//具體實現接口中定義的抽象方法
public void method();
...
}
由此可以看出,雖然java不支持多繼承,但是支持多實現,一個類可以實現多個接口。
(2)接口與抽象類的區別
(a)抽象類中可以定義非抽象的方法(有具體實現),而接口中只能有抽象方法。
(b)抽象類中定義的成員變量可以是多類型的,而接口中的變量只能是public static final。
(c)一個類可以實現多個接口,而一個類只能繼承一個抽象類。
(d)抽象類是對類的抽象,接口是一種行爲規範,是對行爲的抽象,它是類的附加的功能,是作爲類的補充而設計的。接口比抽象類更加抽象
一個實例:
現在有一個門類(Door)它有打開(open)、關閉(close)的功能,這是門固有的屬性,則可以定義一個類Door:
class Door
{
void open();
void close();
}
假如還需要加入一個報警的功能(Alarm),則這個報警的方法應該定義爲抽象方法還是接口呢?答案是定義爲接口較好。原因是,如果定義爲抽象方法放進Door類中,則繼承於Door的所有子類都需要實現這個報警的方法,然而,並不是所有門都有報警的功能。相反,如果定義爲接口,就可以讓那些具有報警的功能的門去自己實現接口。


2、內部類
(1)成員內部類
這種內部類可以理解爲非靜態的成員變量,成員內部類既可以訪問本內部類的成員,還可以訪問外部類的成員,這是因爲內部類存在一個指向外部對象的引用
OuterClass.this。創建成員內部類時使用(new Outerclass()).new Innerclass();的方式創建。
例子:
class MemberInnerTest
{
public static void main(String[] args)
{
MemberInner.Inner Mii=new MemberInner().new Inner();
Mii.doSomething();
}
}
class MemberInner
{
private int a=1;
private int b=3;
//成員內部類
class Inner
{
private int a=2;
public void doSomething()
{
System.out.println(a);   //這裏的a實際上是this.a
System.out.println(b);   //這裏的b實際上是MemberInner.this.b,因爲內部類沒有變量b,繼續向外搜索。
System.out.println(MemberInner.this.a);
}
}
}


(2)靜態內部類
那麼靜態內部類可以理解爲靜態的成員變量,靜態內部類只能訪問外部的靜態成員和靜態方法。若要訪問外部類的非靜態成員,則需要先創建外部類的對象,用對象進行訪問。
創建靜態內部類對象使用OuterClass.InnerClass inner = new OuterClass.InnerClass();的方式創建。
例子:
class StaticInnerTest
{
public static void main(String[] args)
{
StaticInner.Inner Mii=new StaticInner.Inner();
Mii.doSomething();
}
}
class StaticInner
{
    private static int a=1;
    private int b=3;
//靜態內部類
static class Inner
{
public void doSomething()
{
System.out.println(a); //這裏的a相當於MemberInner.a
System.out.println(new MemberInner().b);//非靜態成員需要先創建外部對象再訪問。
}
}
}


(3)局部內部類
局部內部類定義在方法中,比方法的範圍還小。是內部類中最少用到的一種類型。像局部變量一樣,不能被public, protected, private和static修飾。只能訪問方法中定義的final類型的局部變量(jdk1.8沒問題)。局部內部類在方法中定義,所以只能在方法中使用,即只能在方法當中生成局部內部類的實例並且調用其方法。
例子:
class LocalInnerTest
{
public static void main(String[] args)
{
LocalInner mi=new LocalInner();
mi.Test();
}
}
class LocalInner
{
    private static int a=1;
    private int b=3;
    public void Test()
    {
    int c=3;
    final int d=3;
    class Inner
{
public void doSomething()
{
System.out.println(c); //error,jdk1.8沒問題
System.out.println(d);
}
}
new Inner().doSomething();
    }

}
(4)匿名內部類
匿名內部類就是沒有名字的局部內部類,不使用關鍵字class, extends, implements, 沒有構造方法。匿名內部類隱式地繼承了一個父類或者實現了一個接口。匿名內部類使用得比較多,通常是作爲一個方法參數。
例子:
class AnonymouseInnerTest
{
public static void main(String[] args)
{
//Person p=new Child();//常規做法
//使用匿名內部類
Person p=new Person()
{
public void eat()
{
System.out.println("eat");
}
};
p.eat();


}
}
interface Person
{
void eat();

}

/*

class Child implements Person
{
public void eat()
{
System.out.println("eat");
}

}

*/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章