【Java】内部类复习

本文详细解析了Java内部类的四种类型:成员内部类、局部内部类、匿名内部类和静态内部类,阐述了它们的特点、访问权限及应用场景,特别强调了内部类如何解决多继承问题,以及内部类与外部类成员的访问机制。

0.Purpose


  • 每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,
  • 方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。
  • 方便编写事件驱动程序
  • 方便编写线程代码

 

1.Four Sorts of Inner Class


①成员内部类

内--》外:

成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)

*当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问

外部类.this.成员变量

外部类.this.成员方法

外--》内:

在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问:

成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象

创建成员内部类对象的一般方式如下:

Outter.Inner inner = new Outter.new Inner();  //必须通过Outter对象来创建

访问权限修饰:

内部类:

private:只能外部类内部

public:任何地方可以访问

protected:同一个包下or继承外部类

默认:同一个包下

外部类:

public:任何地方可以访问

默认:同一个包下

 

②局部内部类

*定义在成员方法中

不能使用任何修饰符(像成员变量和方法)

只能访问方法中声明final的变量(访问权限仅限方法内)

 

③匿名内部类

*作为一个参数传入方法,需要实现其抽象父类或者接口中的抽象方法,没有实例名,不能被直接new出来

public abstract class Bird {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public abstract int fly();
}

public class Test {
    
    public void test(Bird bird){
        System.out.println(bird.getName() + "能够飞 " + bird.fly() + "米");
    }
    
    public static void main(String[] args) {
        Test test = new Test();
        test.test(new Bird() {
            
            public int fly() {
                return 10000;
            }
            
            public String getName() {
                return "大雁";
            }
        });
    }
}
------------------
Output:
大雁能够飞 10000米

new出来的对象等同于

public class WildGoose extends Bird{
    public int fly() {
        return 10000;
    }
    
    public String getName() {
        return "大雁";
    }
}

 

 

④静态内部类

静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象

Outter.Inner inner = new Outter.Inner();

如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。

 

2.The Theory of Inner Class


内部类是如何访问外部类的变量的:

编译器会默认为成员内部类添加了一个指向外部类对象的引用,编译器会默认添加一个参数,该参数的类型为指向外部类对象的一个引用

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值