内部类分类

 非静态内部类

  1. 非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员。

  2. 非静态内部类不能有静态方法、静态属性和静态初始化块。

  3. 成员变量访问要点:

    • 内部类属性:this.变量名。

    • 外部类属性:外部类名.this.变量名。

      /**外部类Outer1*/
      class Outer1 {
        private int age = 10;
        public void show(){
         System.out.println(age);//10
        }
        /**内部类Inner*/
        public class Inner1 {
         //内部类中可以声明与外部类同名的属性与方法
         private int age = 20;
         public void show(){
           System.out.println(age);//20
           System.out.println(Outer1.this.age); //10  访问外部类的普通属性
          }
        }
      }
      

      \1. 外部类中定义内部类:new Inner()。

      \2. 外部类以外的地方使用非静态内部类:

      Outer.Inner varname = new Outer().new Inner()。

      /**
       * 测试非静态内部类
       */
      public class TestInnerClass1 {
        public static void main(String[ ] args) {
         //先创建外部类实例,然后使用该外部类实例创建内部类实例
         Outer1.Inner1 inner = new Outer1().new Inner1();
         inner.show();
        }
      }
      
      

静态内部类

  1. 静态内部类可以访问外部类的静态成员,不能访问外部类的普通成员。
  2. 静态内部类看做外部类的一个静态成员。
    /*
    测试静态内部类
     */
    class Outer2{
      private int a = 10;
      private static int b = 20;
      //相当于外部类的一个静态成员
      static class Inner2{
       public void test(){
    //    System.out.println(a);  //静态内部类不能访问外部类的普通属性
         System.out.println(b); //静态内部类可以访问外部类的静态属性
        }
      }
    }
    public class TestStaticInnerClass {
      public static void main(String[ ] args) {
       //通过 new 外部类名.内部类名() 来创建内部类对象
       Outer2.Inner2 inner =new Outer2.Inner2();
       inner.test();
      }
    }
    

    匿名内部类

    适合那种只需要使用一次的类。比如:键盘监听操作等等。在安卓开发、awt、swing开发中常见。

    /**
     * 测试匿名内部类
     */
    public class TestAnonymousInnerClass {
    
    
      public void test1(A a) {
        a.run();
       }
    
    
      public static void main(String[] args) {
        TestAnonymousInnerClass tac = new TestAnonymousInnerClass();
        tac.test1(new A() {
          @Override
          public void run() {
            System.out.println("匿名内部类测试!  我是新定义的第一个匿名内部类!");
           }
         });
    
    
    
    
        tac.test1(new A() {
          @Override
          public void run() {
            System.out.println("我是新定义的第二个匿名内部类");
           }
         });
    
    
       }
    
    
    }
    
    
    interface A {
      void run();
    }
    
  3. 匿名内部类没有访问修饰符。
  4. 匿名内部类没有构造方法。因为它连名字都没有那又何来构造方法呢

局部内部类

定义在方法内部的,作用域只限于本方法,称为局部内部类。

局部内部类在实际开发中应用很少。

/**
 * 测试局部内部类
 */
public class TestLocalInnerClass {
  public void show() {
    //作用域仅限于该方法
    class Inner3 {
      public void fun() {
        System.out.println("helloworld");
       }
     }
    new Inner3().fun();
   }
  public static void main(String[ ] args) {
    new TestLocalInnerClass().show();
   }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值