THINKING IN JAVA 读书笔记——内部类

本文详细解析了Java内部类的概念及应用,包括内部类如何实现多重继承、创建内部类对象的方法、内部类与外部类之间的链接机制、使用this和new关键字的技巧、内部类向上转型的特点、局部内部类的作用范围、匿名内部类的使用场景、嵌套类的特点以及内部类的继承和覆盖等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 为什么要使用内部类?

  

     每个内部类都能独立地继承自一个实现,无论外围类是否继承了某个实现,对于内部类都没有影响。内部类使得多重继承的解决方案变得完整,接口解决了部分问题,而内部类有效地实现了“多重继承”。

 

2.创建一个内部类

 

     如果想从外部类的非静态方法之外的任意位置创建某个内部类对象,必须具体指明这个对象的类型:OuterClassName.InnerClassName.注意这里指的是外部类,而不是外围类,外围类是指包着内部类的那个类,在外围类中我们创建一个内部类对象不需要指明OuterClassName。

 

3链接到外部类

 

     当生成一个内部类对象时,此对象可以访问制造它的外围类的所有成员,包括private,因为当此内部类对象产生时,它会秘密的捕获一个外围类对象的引用,这是很关键的,就是拥有了这个引用,内部类才访问到了外围类的所有成员。

 

4.this和.new

 

    在非静态内部类想要返回一个外围类的引用时,就需要用外围类的名字后面紧跟圆点和this: return DotThis.this 

    想要创建内部类的对象,必须使用外部类的对象来创建该内部类对象 Out.Inner in = out.new Inner();在拥有外部类对象之前是不可能创建内部类对象的,这是因为内部类对象会暗暗地链接到外部类对象上。但若是嵌套类的话,就不需要对外部类对象的引用了。

 

5内部类和向上转型

 

   外围类是可以访问它的内部类的私有成员的,但是外部类却不能。

 

6局部内部类

 

    在这里我们需要注意的是,内部类的作用范围只是被限制在一定的区域内。

 

7匿名内部类

 

    它创建的是继承自某个类或是实现某个接口的子类对象,之所以叫它匿名内部类,是因为它没有名字。需要注意的是,在匿名类的末尾有分号:return new FatherClass(){}; 这个分号只是标记表达式的结束。

    另外有所迷惑的就是关于它使用外部定义的对象,编译器要求参数引用必须是final的,但若此参数并没有直接在匿名内部类中使用,可以不是final的,此外都必须是final的。

 

8嵌套类

 

    当把一个内部类声明为静态的时,它并没有普通的内部类对象那样保存了一个指向外围类对象的引用。要创建嵌套类对象,并不需要其外围类的对象,不能从嵌套类对象中访问非静态的外围类对象。普通内部类不能有static数据和static字段,也不能包含嵌套类,而嵌套类可以拥有这些。

 

   在接口中命名的内部类都自动地是public和static的。

 

   一个内部类被嵌套多少层并不重要,它能透明地访问所有它所嵌入的外围类的所有成员。

 

9内部类的继承

 

    class  InheritInner extends WithInner.Inner   在这个类中它默认的构造器并不好用,这是因为内部类必须要有指向它外围类的引用,这样我们必须自己显示的创建它

 

    InheritInner (WithInner wi){

 

            wi.super();

    }

    

    这样编译才能通过。

 

10 内部类覆盖

 

      当继承了某个外围类的时候,内部类并没有发生什么特别神奇的变化。这两个内部类是完全独立的两个实体,各自在自己的命名空间内。

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值