内部类(1)

来源:互联网 发布:淘宝评价如何上传视频 编辑:程序博客网 时间:2024/06/11 03:42

内部类定义在一个外部类的内部

public class A{  class B{      B(){         System.out.println("Inner class B");      }  }}  

A为外部类,B为内部类

每个内部类都自动拥有一个指向外部类实例的引用,使用 外部类名.this

eg:在class B 中,可以使用A.this,表示指向外部类的引用。

创建一个普通内部类

使用 OuterClassName.new 创建一个普通内部类实例

public class C{   public static void main(String[] args){       A a = new A();       A.B b = a.new B();     //B b = new B() 错误,无法找到B的类型   }}ly@HP:~/TIJ4/exercise$ javac C.java ly@HP:~/TIJ4/exercise$ java C Inner class B

使用外部类实例方法创建一个内部类,然后返回内部类实例

public class Outer{   class Inner{      public Inner(){System.out.println("Outer.Inner");}   }   public Inner getInner(){      return new Inner();   }   public static void main(String[] args){      Outer a = new Outer();      Inner b = a.getInner();//在外围类可以找到Inner类,因此不必声明为Outer.Inner   }}ly@HP:~/TIJ4/exercise$ javac Outer.java ly@HP:~/TIJ4/exercise$ java OuterOuter.Inner

Note:一个普通内部类(不添加static修饰符)的域和方法只能是实例类型,不能出现static的域和方法.

所以,想要创建一个普通内部类,必须创建一个外部类的声明

嵌套类(nested class)

声明为static的内部类就是嵌套类

public class Outer{   static class Inner{      public Inner(){         System.out.println("static Inner");      }   }   public static void main(String[] args){      Inner a = new Inner();//直接调用Inner类的构造器   }}ly@HP:~/TIJ4/exercise$ javac Outer.java ly@HP:~/TIJ4/exercise$ java Outer static Inner

如果在外部类外创建嵌套类

public class Test{   public static void main(String[] args){      Outer.Inner a = new Outer.Inner();    /*complier error:     *Test.java:5: error: cannot find symbol     *          Outer.Inner a = Outer.new Inner();     *     symbol:   variable Outer     *       location: class Test     * 1 error     */    //Outer.Inner a = Outer.new Inner();//不能)将外部类名写在new前面,与普通内部类不一样   }}ly@HP:~/TIJ4/exercise$ javac Test.java ly@HP:~/TIJ4/exercise$ java Teststatic Inner

普通内部类(Inner class)和嵌套类(nested class)的区别

1.普通内部类不能包含static数据和方法,而嵌套类不仅可以包含实例数据和方法,也可以包含static数据和方法

    public class Outer{       class Inner{        /*complier error         *Outer.java:3: error: Illegal static declaration in inner class Outer.Inner         *          static int i1 = 0;         *           ^         *        modifier 'static' is only allowed in constant variable declarations         *1 error         */        //static int i1 = 0;          int i2 = 1;          public Inner(){             System.out.println("i2="+i2);          }       }       static class Nest{          static int k1 = 2;          int k2 = 3;          public Nest(){             System.out.println("k1="+k1+" k2="+k2);          }       }       public static void main(String[] args){          Outer a = new Outer();          Inner b = a.new Inner();          Nest c = new Nest();       }    }ly@HP:~/TIJ4/exercise$ javac Outer.java ly@HP:~/TIJ4/exercise$ java Outer i2=1k1=2 k2=3

2.普通内部类有指向外部类的实例的引用,而嵌套类没有(因为嵌套类的创建不需要外部类的实例)

0 0
原创粉丝点击