Java内部类

格式:
public class 外部类名{
    修饰符 class 内部类名{
        ......
    }
}
访问特点:
  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须创建对象
按照内部类在外部类中定义的位置不同,可以分为如下两种形式:
  1. 在类的成员位置定义:成员内部类
  2. 在类的局部位置定义:局部内部类

成员内部类

对于成员内部类,外界如何创建对象使用呢?
  • 格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;

    • 范例:

      • ①当内部类的修饰符是public
      // 定义
      public class Outer{
          private int num = 10;
          public class Inner{
              public void show(){
              	System.out.println(num);
              }
          }
      }
      // 外界访问
      Outer.Inner oi = new Outer().new Inner();
      oi.show()
      // 输出结果
      10
      
      • ②当内部类的修饰符是private
      // 定义
      public class Outer{
          private int num = 10;
          private class Inner{
              public void show(){
              	System.out.println(num);
              }
          }
          public void visitInnerMethod(){
              Inner i = new Inner();
              i.show()
          }
      }
      // 外界访问
      Outer o = new Outer();
      o.visitInnerMethod();
      // 输出结果
      10
      

局部内部类

局部内部类是在方法中定义的类,所以外界是无法直接访问使用的,需要在方法内部创建对象并使用。该局部内部类可以直接访问外部类的成员,也可以访问外部类中方法内的局部变量。
  • 范例:

    // 定义
    public class Outer{
        private int num = 10;
        public void visitInnerMethod(){
            int num2 = 20;
            // 局部内部类 定义
            class Inner{
            	public void show(){
            		System.out.println(num);
                    System.out.println(num2);
            	}
        	}
            
            Inner i = new Inner();
            i.show()
        }
    }
    // 外界访问
    Outer o = new Outer();
    o.visitInnerMethod();
    // 输出结果
    10
    20
    

特殊的内部类:匿名内部类

本质:是一个继承了该类或者实现了该接口的子类匿名对象

前提:存在一个类或者接口,这里的类可以是具体类也可以是抽象类
  • 格式:
new 类名或者接口名(){
    // 重写方法;
    ......
};
  • 范例:
new Inter(){
    public void show(){
        ......
    }
};
    public interface Inter{
        public abstract void show();
    }
    
    public class Outer{
        public void method(Inter i){
            i.show();
        }
    }
    
    public class OuterDemo{
        public static void main(String[] args){
            Outer o = new Outer();
            o.method(new Inter(){
               	@Override
                public void show(){
                    System.out.println("匿名内部类1");
                }
            });
            o.method(new Inter(){
               	@Override
                public void show(){
                    System.out.println("匿名内部类2");
                }
            });
        }
    }
    // 输出结果
    匿名内部类1
    匿名内部类2
    
posted @   早晨9点  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示