内部类(1)

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

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 Outer
Outer.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 Test
static 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=1
k1=2 k2=3

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值