1. 程式人生 > >內部類 外部類區別與聯絡

內部類 外部類區別與聯絡

內部類作用主要實現功能的隱藏、減少記憶體開銷,提高程式的執行速度

內部類和外部類聯絡:內部類可以訪問外部類所有的方法和屬性,如果內部類和外部類有相同的成員方法和成員屬性,內部類的成員方法呼叫要優先於外部類即內部類的優先順序比較高(只限於類內部,在主方法內,內部類物件不能訪問外部類的成員方法和成員屬性),外部類只能訪問內部類的靜態常量或者通過建立內部類來訪問內部類的成員屬性和方法

內部類定義的靜態常量可以全域性訪問

建立內部類

第一種方式

假設A是外部類,B是內部類

A a=new A();

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

或者用A類的匿名物件來訪問

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

普通類許可權

public和default

而內部類具有四種許可權

A.this.name(反射機制建立當前物件)

類優先於位元組碼檔案執行,編譯完類才生成位元組碼檔案

位元組碼檔案可以通過反射機制來改變

類中的私有屬性可以通過發射機制在類外訪問,通過反射機制改變位元組碼檔案中的東西

編譯時和執行時

反射機制工作在執行時

靜態內部類.

public class StaticInner {
//{
/*static class hello
{
普通程式碼塊內不能定義靜態內部類
}*
/
}*/
static
{
class hello
{
//靜態程式碼塊內可以定義靜態內部類
public void test()
{
System.out.println("it's a inner class");
}
public void practice()//靜態程式碼塊內不能定義靜態方法
{
System.out.println("it's a demo");
//System.out.println(a);
//method();這兩句編譯報錯,可看出靜態內部類不能訪問外部類的普通成員和方法
System.out.println(a1);
test1();
//從這兩句可以看出,靜態內部類只能訪問外部類的靜態成員和靜態方法
}
//從上看出靜態內部類可以定義普通方法和靜態方法


}
}
private int a;
private void method()
{
System.out.println("hello");
}
private static String a1;
private static void  test1()
{
System.out.println("you can access this method,because it is static");
}
//靜態內部類
static class Inner{
public void test()
{
System.out.println("it's a inner class");
}
public static void practice()
{
System.out.println("it's a demo");
//System.out.println(a);
//method();這兩句編譯報錯,可看出靜態內部類不能訪問外部類的普通成員和方法
System.out.println(a1);
test1();
//從這兩句可以看出,靜態內部類只能訪問外部類的靜態成員和靜態方法
}
//從上看出靜態內部類可以定義普通方法和靜態方法

}

}

靜態內部類建立物件

StaticInner.Inner inn=new StaticInner.Inner();

這裡可以把內部類當做外部類的一個靜態成員

區域性內部類

定義在方法體內

定義在普通程式碼塊內

例項如下

public class Outer {
private int a;
private void practice()
{
System.out.println("This is a outer class method");
}
public void method()
{
int a1;
final int a2=0;
class inner
{
public void test()
{
//能訪問外部類任何屬性和方法
System.out.println(a);
practice();
//
//System.out.println(a1);//這句話出現編譯錯誤--報錯--不能訪問外部類方法中定義的變數
System.out.println(a2);//把變數宣告為final常量,final的另一用法
//final 提高區域性變數的可見性   宣告時需要同時賦值並初始化
}
}
//類的作用範圍為這個方法體內,所以物件的建立在這個類宣告以後
inner in=new inner();

{
class a{}//程式碼塊中的內部類
}

}
//inner in=new inner();//因為在方法體之外所以報錯
//總結:區域性內部類具有普通類的功能
//內部類如果訪問它所在方法中的區域性變數是無法獲取的
//解決辦法加上final關鍵字,提高變數的可見性
//區域性內部類的物件只能在該方法體的區域性建立只能在區域性類定義的後面建立物件
}

匿名內部類

出現背景

經常出現在使用其他技術時,出現介面類的情況,此時無法建立介面型別的實現

例項如下

public interface Fruit {
void seed();
void grow();
}

public class Worker {


public void getFruit(Fruit fruit)
{
System.out.println("this is a no name class");
fruit.grow();
fruit.seed();
}
}

public class Test1 {
public static void main(String[] args) {
Worker w=new Worker();
w.getFruit(new Fruit(){


@Override
public void seed() {
// TODO Auto-generated method stub
System.out.println("the seed is planted");

}


@Override
public void grow() {
// TODO Auto-generated method stub
System.out.println("it's growing");

}});
//1.匿名類沒有名字
//2.匿名類是一個子類
//3.匿名類用它父類(介面,抽象)當名字,父介面的名字
//4.執行效率奇高
//多用在android開發中

//匿名類實現父類(介面,抽象)中的方法
}

}

//總結在程式碼中寫了,有錯請批評指出,謝謝哈