Java内部类protected所产生的问题

内部类protected所产生的问题

今天在think in java看到一个很有趣的题

1.在第一个包中创建一个至少有一个方法的接口

package chapter10.innerclass1;

public interface Vehic {
    void run();
}

2.在第二个包中创建一个类,在其中增加一个protected的内部类以实现那个接口

import chapter10.innerclass1.Vehic;

public class Demo {
    protected class Car implements Vehic {
        @Override
        public void run() {
            System.out.println("Car run");
        }
    }
}

3.在第三个包中,继承这个类,并在一个方法中返回该protected内部类的对象,在返回的时候向上转型为第一个包中的接口类型

package chapter10.innerclass3;

import chapter10.innerclass1.Vehic;
import chapter10.innerclass2.Demo;

public class Test extends Demo {
    public Vehic getVehic() {
        Demo d = new Demo();
        return d.new Car();//编译器在这里提示了报错 The constructor Demo.Car() is not visible
    }
}

问题已经很明显了 Car这个内部类是protected修饰的,如果一个类没有定义任何构造函数,Java编译器会默认的给类生成一个空参数构造函数,而这个构造函数的访问级别是和类访问级别相同的,所以产生了报错,因为Test并不是Car的子类且不在Demo类的同一个包中,解决方案有两种。

1.把Test类移动到Demo类的包下面

2.给Car对象添加一个public的构造函数

package chapter10.innerclass2;

import chapter10.innerclass1.Vehic;

public class Demo {
    protected class Car implements Vehic {
        public Car() {}
        @Override
        public void run() {
            System.out.println("Car run");
        }
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值