众所周知,java的外部类的访问修饰符只有public和默认两种。今天突然想到对于成员内部类来说,访问修饰符是正常的四种,那么有关成员内部类的动态绑定和访问修饰符是否有关呢?主要问题是私有的成员内部类在外部类中用一个方法返回一个对象实例,在外部用其父类的引用类型接收,能否实现动态绑定呢,编写如下代码测试:
1. 定义一个接口
/**
*
* @author Stone
* @date 2023/10/11 11:03
* @version Study1.0
*/
/**
* 一个接口
*/
public interface interface01 {
void m1();
}
2. 定义一个抽象类,实现上述接口
/**
* 一个抽象父类,实现了interface01接口
*/
public abstract class Abstract01 implements interface01{
public void m1(){
System.out.println("我是抽象父类Abstract01");
}
public abstract void m2();
}
3. 定义一个外部类和成员内部类, 外部类继承上述抽象类,内部类继承外部类
/**
*一个类,继承了Abstract01抽象类
*/
public class Class01 extends Abstract01{
@Override
public void m2() {
System.out.println("我是外部类Class01,继承抽象父类Abstract01,这是我实现的父类的抽象方法m2");
}
@Override
public void m1() {
System.out.println("我是外部类Class01,继承抽象父类Abstract01,这是我重写的方法m1");
}
public interface01 getInterface01(){
return new innerClass01();
}
/**
*一个私有成员内部类,继承了Class01类
*/
private class innerClass01 extends Class01{
@Override
public void m2() {
System.out.println("我是成员内部类innerClass01,继承父类Class01,这是我重写的方法m2");
}
@Override
public void m1() {
System.out.println("我是成员内部类innerClass01,继承父类Class01,这是我重写的方法m1");
}
}
}
4. 测试代码
public class test {
public static void main(String[] args) {
Class01 class01 = new Class01();
interface01 interface01 = class01.getInterface01();
interface01.m1();
}
}
5. 结果输出:
经测试,私有的成员内部类是可以动态绑定成功的,即在外部用其父类或实现的接口接收时,直接调用方法没有问题。
这个问题的发现是由于今天看了ArrayList类的源码,其中有一个方法
public List<E> subList(int fromIndex, int toIndex) {
subListRangeCheck(fromIndex, toIndex, size);
return new SubList(this, 0, fromIndex, toIndex);
}
返回一个List,SubList是ArrayList类中的私有成员内部类
private class SubList extends AbstractList<E> implements RandomAccess
我原以为subList(int fromIndex, int toIndex)方法返回的依然是一个ArrayList对象,因此一直循环调用该方法,结果返回的是一个SubList对象,但查看源码后发现,循环调用subList方法是没有问题的,因为SubList类中也有该方法。
只是记录一点点问题,关于java深层的东西,后续再进行学习