Java学习——内部类

目录

什么是内部类?

内部类格式

内部类的访问特点

成员内部类

局部内部类

匿名内部类

静态内部类(嵌套类)

内部类的继承和覆盖

内部类是否有用,必要


什么是内部类?

  • 内部类就是在一个类中定义另一个类,像在类A的内部定义一个类B,类B就称为内部类

内部类格式

  • 创建内部类的格式:

public class 类名{
    修饰符 class 类名{
    }
}

内部类的访问特点

  • 内部类能直接访问外部类的成员,甚至是私有成员

  • 外部类访问内部类必须要创建对象

成员内部类

  • 在外部类的成员位置的内部类称为成员内部类

  • 外界创建成员内部类的格式:

    外部类名.内部类名 对象名=外部类对象.内部类对象

    例子:Outer. Inter a=new Outer().new Inter();

  • 当内部类的修饰符是public时

  • 当内部类的修饰符是private时,就不能在其他类中实例化内部类

    就需要在外部类的成员位置用方法来访问内部类才能拿到数据

局部内部类

  • 在外部类的方法中定义的类称为局部内部类

  • 局部内部类在外界无法直接使用,需要在方法内部创建并使用

  • 该类可以直接访问外部类的成员,也能访问方法内的局部变量

  • 注意:局部内部类和局部变量都没有修饰符

匿名内部类

  • 匿名内部类的使用前提:存在一个接口或者类,这里的类也能使抽象类或者具体类

  • 匿名内部类也是局部内部类

  • 格式

    new 类名或者接口名(){
        重写方法;
    };

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

  • 匿名内部类示例:

  • 匿名内部类对象调用方法

  • 匿名内部类是它所实现接口的实现类,用多态的形式进行赋值

静态内部类(嵌套类)

  • 普通的内部类对象隐式的保存了一个引用,指向创建它的外围类对象。然而,当内部类是static的时候,就不再如此了,嵌套类意味着:

    • 要创建嵌套类的对象并不需要其外围类的对象

    • 不能从嵌套类的对象中访问非静态的外围类对象

  • 嵌套类和普通类的区别:

    • 普通内部类的字段和方法只能放在类的外部层次上,所以普通的内部类不能有static数据和字段,也不能包含嵌套类。但是嵌套类可以包含这些东西。

  • 有时候使用内部类只是为了把一个类隐藏在另外一个类内部,并不需要内部类有外围类的一个引用。为此可以将内部类声明为static。

  • 只有内部类可以声明为static。

  • 只要内部类不需要访问外围类对象,就应该使用静态内部类。

  • 在接口中声明的内部类自动是static和public

内部类的继承和覆盖

  • 内部类和其他类一样也能继承,但问题在于,那个指向外围类对象的“秘密的”引用必须被初始化

    class WithInner{
        class Inner()
    }
    public class InheritInner extends WithInner.Inner{
        //构造器
        InheritInner(WithInner wi){
            wi.supper();
        }
    }
  • 可以看出,InheritInner只继承自内部类,而不是外部类,但是当要生成一个构造器时,默认的构造器并不好,而且不能知识传递一个指向外围类对象的引用。因此必须在构造器内使用以下语法:wi.super();

  • 内部类的覆盖问题:

    若创建了一个内部类,然后继承其外围类并重新定义此内部类会发生什么?

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

内部类是否有用,必要

  • 一般来说内部类继承自某个类或实现了某个接口,内部类的代码操作创建了它的外围类的对象。所以可以认为内部类提供了一个访问外围类的接口。

  • 内部类可以访问外围类的私有数据,但外围类就不行

  • 和内部类相关的一个重要问题

    如果只是需要一个对接口的引用,为什么不通过外围类来实现呢那个接口?,其实,外围类不能总是享受用到接口带来的方便,有时需要用到接口的实现,所以使用内部类最诱人的地方在于,每个内部类都能独立的继承自一个接口的实现,所以无论外围类是否已经继承了某个接口的实现,对于内部类都没有影响。从这个角度来看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类允许继承多个非接口类型(类或者抽象类),如果拥有的是抽象的类或者具体的类而不是接口,就只能使用内部类才能实现多重继承。

  参考书籍:Java核心技术 卷1(原书第11版)

                    Java编程思想(第三版)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Iron_Sp-man

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

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

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

打赏作者

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

抵扣说明:

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

余额充值