内部类的应用
?
??????? 一、內部類的概念:
1.將一個類定義在另一個類的里面,對里面那個類就稱為內部類,或者叫做內置類,嵌套類。
2.訪問特點:內部類可以直接訪問外部類中的成員,包括成員變量和成員方法,也包括私有成員;而外部類要訪問內部類中的成員必須要建立內部類的的對象:代碼體現如下:
class InnerclassDemo
{
?public static void main(String[] args)
?{
?? Outer ou=new Outer();
?? ou.method();
?}
}
class Outer
{
?private int age=25;
?class Inner
?{
??int age=19;
??void show()
??{
???System.out.println("age="+Outer.this.age);//直接訪問內部類中成員
???//如果本類中有局部變量,就訪問本類,如果沒有就訪問父類中
??//成員變量,因為有一條默認語句Outer.this.age
??}
?}
?void method()
?{
??System.out.println("Outer method");3
??Inner in=new Inner();//建立內部類對象,訪問內部類方法
??in.show();
Outer.Inner in=new?Outer().new Inner();
in.show();//直接訪問內部類的方法
?}
}
?????????二、內部類的位置
1、成員變量位置上,那么可以被private static成員修飾符修飾,具體功能屬性等可以參考成員變量。而且被static修飾后的內部類只能訪問外部類中的靜態變量,就是你是靜態的,你只能訪問靜態的,因為靜態的是隨著類的加載而被加載的,而非靜態的是隨著對象的建立而被封裝的,所以它優先于靜態而存在。
static:訪問受到限制:
private:將內部類封裝在了外部類中,不能為外部其他類之間訪問
如果沒有私有化,外部類可以直接訪問到內部類,格式如下:
外部類名、內部類名變量名=外部類對象、內部類對象;
Outer.Inner in=new Outer().new Inner();
外部類直接訪問靜態內部類中的非靜態成員:
new Outer.Inner.function();注意創建的是內部類的對象
外部類直接訪問靜態內部類中的靜態變量:
Outer.Inner.function();可以直接用類名訪問靜態成員;
注意:該內部類中的成員是靜態的,那么類也應該是靜態的。
如果外部類靜態成員訪問該內部類成員時,內部類必須是靜態的,否則無法訪問;
2.在局部位置上,可以直接訪問外部類中的成員,同時可以訪問所有局部中的局部變量,但必須是被final修飾的,具體代碼如下:
class InnerDemo
{
?public static void main(String[] args)
?{
?? Outer ou=new Outer();
?? ou.show();
?}
}
class Outer
{
?private int age;
?public void show()
?{
??
??class Inner
??{
???final int num=9;
???void method(){
???System.out.println("num="+num);
???}
??}
??new Inner().method();
?}
}
//程序執行過程:首先main主函數、外部類Outer()構造方法,創建一個對象,將地址給引用ou,然后該對象調用Outer中的方法show();然后程序執行show(),內部類創建了一個對象,然后調用里面的method()方法,然后method()方法用調用被final修飾的局部變量。
也可以向show(final int a)傳遞一個final類型的參數,一樣打印,因為都是局部變量:
3.匿名內部類,其實就是一種簡寫形式,它的前提是內部類必須繼承一個其他外部父類或者接口,它是一個帶內容的對象。代碼體現如下:
class InnerclassDemo1
{
?public static void main(String[] args)
?{
??Outer ou=new Outer();
??ou.method();
?}
}
abstract class Abs
{
?abstract void show();
?abstract void abs();
}
class Outer
{
?private int age;
?
?public void method()
?{
??
??
??Abs b=new Abs()
??{
???int num=9;
???void show()
???{
????System.out.println("show1");
???}
???void abs()
???{
????System.out.println("abs 1");
???}
??};//這是一個帶內容的匿名對象,使用父類的名稱創建。
??b.show();//自己在創建對象的同時又重寫了父類中的內容,然后自己再調用
??b.abs();
?}
}
總結
- 上一篇: ECShop替换FCKeditor编辑器
- 下一篇: 微信公众平台开发(26) ACCESS