Java知识总结-内部类

来源:互联网 发布:网络词不鸽是什么意思? 编辑:程序博客网 时间:2024/06/01 10:30


说明:在学习过程中内部类的运用感觉还是相对比较少的,所以自己对内部类的很多细节都掌握的不够,所以这里特意写一篇关于内部类的文章对这个知识点进行总结,加深印象。

内部类:当在一个类中再定义一个类,则将在类中定义的那个类称为内部类。内部类可以分为成员内部类和局部内部类。

一,成员内部类

成员内部类格式:

class OuterClass{              //外部类class InnerClass{          //内部类//……}}
1.1访问规则

1.1.1  内部类可以直接访问外部类的成员,包括私有。

public class Test {public static void main(String[] args) {OuterClass.InnerClass in=new OuterClass().new InnerClass();in.funDemo();              }}class OuterClass{ String s="成员变量";                  void fun(){System.out.println("成员方法");}class InnerClass{          void funDemo(){fun();                   //内部类访问外部类成员方法System.out.println(s);   //内部类访问外部类成员变量}}}
运行结果:

成员方法成员变量
通过上例,内部类成功访问外部类成员。当外部类的成员私有时:

public class Test {public static void main(String[] args) {OuterClass.InnerClass in=new OuterClass().new InnerClass();in.funDemo();}}class OuterClass{ private String s="成员变量";            //外部类私有成员变量private void fun(){System.out.println("成员方法");  //外部类私有成员方法}class InnerClass{          void funDemo(){                        fun();                   //内部类访问外部类私有成员方法System.out.println(s);   //内部类访问外部类私有成员变量}}}
运行结果不变:

成员方法成员变量

由此可知内部类可以直接访问外部类的所有成员。

当内部类成员和外部类成员名称相同时,直接访问的这些成员名称表示是在对内部类的成员进行访问。如:

public class Test {public static void main(String[] args) {OuterClass.InnerClass in=new OuterClass().new InnerClass();in.funDemo();}}class OuterClass{ String s="外部类成员变量";           //外部类成员变量svoid fun(){                        //外部类成员方法fun()System.out.println("外部类成员方法");}class InnerClass{String s="内部类成员变量";   //内部类成员变量s   void fun(){                //内部类成员方法fun()System.out.println("内部类成员方法");}void funDemo(){fun();             //访问方法fun()System.out.println(s);  //访问变量s}}}

运行结果

内部类成员方法内部类成员变量

由结果可知,此时内部类访问到的成员都是内部类的成员。同时,当内部类与外部类具有同一成员变量或成员方法时。

我们可以通过:外部类名.this.成员名:的格式直接在内部类访问到外部类的指定成员,例如:

class OuterClass{ String s="外部类成员变量";               //外部类成员变量void fun(){                            //外部类成员犯法System.out.println("外部类成员方法");}class InnerClass{String s="内部类成员变量";       //内部类成员变量void fun(){                    //内部类成员放阿飞System.out.println("内部类成员方法");}void funDemo(){//通过:外部类名.this.变量名;的格式在内部类直接访问外部类变量OuterClass.this.fun();     //通过:外部类名.this.方法名;的格式直接在内部类访问外部类方法System.out.println(OuterClass.this.s);   }}}

运行结果:

外部类成员方法外部类成员变量

可以看到,在内部类与外部类成员名相同时顺利访问到了外部类的成员变量和成员方法。

1.1.2  外部类访问内部类,需要创建内部类对象,然后获取。如:

public class Test {public static void main(String[] args) {OuterClass out=new OuterClass();      //创建外部类对象   out.print();                          //调用外部类方法}}class OuterClass{ void print(){InnerClass in=new InnerClass();    //在外部类中创建内部类对象in.fun();                          //通过内部类对象调用内部类方法System.out.println(in.s);          //获取内部类变量}class InnerClass{String s="内部类成员变量";          void fun(){System.out.println("内部类成员方法");}} }

运行结果:

内部类成员方法内部类成员变量

程序顺利获取了内部类的成员变量和成员方法。

1.1.3  直接在其他类访问内部类的途径

上面的例子是在外部类获取的内部类对象的例子,下面介绍在其他类直接创建内部类对象的过程。

一般在其他类直接创建内部类对象的方法为:

OuterClass.InnerClass in=new OuterClass().new InnerClass();

外部类名.内部类名   标识符=外部类对象.内部类对象;

 示例:

public class Test {public static void main(String[] args) {                   //直接在其他类创建内部类对象OuterClass.InnerClass in=new OuterClass().new InnerClass(); in.fun();         //获取内部类方法System.out.println(in.s);   //获取内部类变量}}class OuterClass{                                  //外部类class InnerClass{                             //内部类String s="内部类成员变量";void fun(){System.out.println("内部类成员方法");}} }

运行结果:

内部类成员方法内部类成员变量

1.1.4  静态内部类

当内部类定义了静态成员,该内部类必须能为静态。

示例:

class OuterClass{ static class InnerClass{                     //静态内部类static String s="内部类成员变量";      //静态成员变量void fun(){System.out.println("内部类成员方法");}} }

当内部类为静态时,在其他类直接创建内部类的格式也发生变化,如下所示:

OuterClass.InnerClass in=new OuterClass.InnerClass();
外部类名.内部类名   标识符=外部类.内部类对象;
示例:

public class Test {public static void main(String[] args) {                //在其他类直接访问静态内部类OuterClass.InnerClass in=new OuterClass.InnerClass();in.fun();System.out.println(in.s);}}class OuterClass{ static class InnerClass{          //静态内部类static String s="内部类成员变量";void fun(){System.out.println("内部类成员方法");}} }

在静态内部类中,如果存在静态方法,可以通过:外部类名.内部类名.方法名;的方式直接在其他类调用该静态方法。如:

public class Test {public static void main(String[] args) {                //直接在其他类调用静态内部类的静态方法OuterClass.InnerClass.fun();                //直接在其他类调用静态内部类的静态变量String str=OuterClass.InnerClass.s;System.out.println(str);}}class OuterClass{ static class InnerClass{         //静态内部类static String s="静态内部类中的静态成员变量";       //静态变量static void fun(){                              //静态方法System.out.println("静态内部类中的静态成员方法");}} }

补充:静态内部类不访问外部类的非静态成员。

二,局部内部类

内部类不仅可以在类中进行定义,也可以在类的局部位置定义,如在类的的方法或任意区间中。

示例:

class OuterClass{         //外部类void method(){            //方法class InnerClass{      //方法内定义的内部类String s="变量";void fun(){System.out.println("方法");}}}}

如上面被定义在方法内的类InnerClass就是一个局部内部类。该内部类比定义在了method()方法内部,所以内部类是方法method()的一部分,方法外部不能访问该内部类,但是内部类可以访问当前方法中的常量以及对应外部类的所有成员。这时可以通过在该方法内创建这个局部内部类对象的方式来调用。

当内部类所在方法中含有变量时,内部类无法访问这些变量。而只能访问方法中的常量。

示例:

public class Test {public static void main(String[] args) {        OuterClass out=new OuterClass();        out.method();}}class OuterClass{void method(){String s="变量";final String str="常量";class InnerClass{void fun(){//System.out.println(s);  错误,s不是常量,局部内部类无法调用System.out.println(str);  //调用方法中定义的常量}}InnerClass in=new InnerClass();  //在方法内创建局部内部类对象in.fun();       //调用内部类的方法}}


同时局部内部类也可以方法外部类的所有成员,如下例所示:

public class Test {public static void main(String[] args) {        OuterClass out=new OuterClass();  //创建外部类对象        out.method();             //调用外部类方法}}class OuterClass{String s="外部类成员变量";          void print(){System.out.println("外部类成员方法");}void method(){class InnerClass{      //局部内部类void fun(){System.out.println(s);   //调用外部类成员变量print();   //调用外部类成员方法}}InnerClass in=new InnerClass();  //在方法内创建局部内部类对象in.fun();   //调用局部内部类对象的方法}}

运行结果:

外部类成员变量外部类成员方法

与成员内部类一样,当局部内部类具有和成员相同的成员时,局部内部类会直接调用内部类自身的成员,示例:

public class Test {public static void main(String[] args) {        OuterClass out=new OuterClass();        out.method();}}class OuterClass{String s="外部类成员变量";    //外部类成员变量svoid print(){              // 外部类成员方法print()System.out.println("外部类成员方法");}void method(){class InnerClass{String s="内部类成员变量";   //内部类成员变量svoid print(){              //内部类成员方法print()System.out.println("内部类成员方法");}void fun(){System.out.println(s);   //内部类调用变量sprint();      //内部类调用方法print()}}InnerClass in=new InnerClass();in.fun();}}

运行结果:

内部类成员变量内部类成员方法



 通过结果可以看到内部类中调用的成员都是内部类本身的成员。此时可以通过:

外部类名.this.成员名;的方式调用外部类成员:


public class Test {public static void main(String[] args) {        OuterClass out=new OuterClass();        out.method();}}class OuterClass{String s="外部类成员变量";void print(){System.out.println("外部类成员方法");}void method(){class InnerClass{String s="内部类成员变量";void print(){System.out.println("内部类成员方法");}void fun(){System.out.println(OuterClass.this.s);OuterClass.this.print();}}InnerClass in=new InnerClass();in.fun();}}

运行结果:

外部类成员变量外部类成员方法


0 0