Java内部类

一、内部类的种类及特点

1.成员内部类
public class OuterClass {
   
   public class InnerClass {
       
   }
}
  • 实例化(需要有外部类的实例,才能对内部类进行实例化):
     OuterClass oc = new OuterClass();
     OuterClass.InnerClass ic = oc.new InnerClass();
    
  • 不允许定义静态成员变量
  • 高度依赖于外部类实例
2.静态内部类(只有内部类才能被静态修饰符所修饰)
public class OuterClass {

   public static class InnerClass {

   }
}
  • 实例化(无需外部类实例,可直接实例化):
     OuterClass.InnerClass ic = new OuterClass.InnerClass();
    
  • 允许定义静态成员变量
  • 外部类的非静态成员变量和成员方法对静态内部类不可见(类似静态方法块)
  • 与外部类趋于相互独立
  • 在外部类内部可以直接使用如下方式初始化内部类,仅限外部类内部,这点要跟静态内部类做区分
      OuterClass.InnerClass inner = new OuterClass.InnerClass();
      InnerClass inner2 = new InnerClass();
    
3.匿名内部类
public class OuterClass {

   Runnable thread = new Runnable() {
       @Override
       public void run() {
           System.out.println("hello world");
       }
   };
}
  • 无需单独创建类文件去实现接口,或者继承父类,简化代码

二、内部类的编译

1.成员内部类
  • 成员内部类编译过程中会生成一个独立于外部类的字节码文件,其名称格式: 外部类名 + $ + 内部类名.class

在这里插入图片描述

2.静态内部类
  • 静态内部类与成员内部类相似,产生一个独立于外部类的字节码文件,名称格式如上
  • 静态类之所以能访问外部类的静态成员变量,是因为在编译过程中,为外部类的静态成员变量提供了一个静态的入口方法,通过调用该静态入口方法,便能访问到外部类的静态成员变量
3.匿名内部类
  • 匿名内部类编译过程中也会生成一个独立于外部类的字节码文件,但是它的命名格式与非匿名内部类不同,因为它没有类名,所以生成的字节码文件名称格式:外部类名 + $ + 数字.class (数字从1开始累加)

在这里插入图片描述

三、内部类的意义

1.实现多继承
  •  Java多实现、单继承语言,利用内部类填补了多继承的空缺,例如:封装类有多个内部类,它们分别继承不同的父类,然后封装类内部调用内部类的实例便同时拥有了多个父类的全部属性
2.简化代码
  •   我们无需为内部类单独创建一个单独的类文件,简化了我们的代码
3.无需修改而实现同一个类中两个同名同参的方法调用
  •  当我们的类中有一个与所需实现接口同名同参的方法时,可用内部类实现该接口,再利用内部类的特性调用类中方法,实现同一个类对两个同名同参方法的调用
public class Frog {
    String move(int mile) {
        Tadpole tadpole = new Tadpole();
        String tm = tadpole.move(mile / 2);
        return "Frog move " + mile + " and " + tm;
    }

    class Tadpole implements Animal{
        @Override
        public String move(int mile) {
            return "Tadpole move " + mile;
        }
    }
}
总结:如果没有非常好的把控能力,一般不提倡使用内部类;而且内部类几乎都是基于服务外部类而存在,一般不推荐实例化内部类,这样违背了面向对象设计的原则,破坏了类的封装性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Match_h

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值