public class Test {
public static void main(String[] args) {
/*
这里的强转看起来是合理的,但是总觉得没有完全理解,虽然一般没人这样写
但是看到了就不想放过。
第一行使用了多态,然后第二行这个我感觉自己都描述不出来。。。多态的编译类型不是应该是不能改变的吗。。
*/
AA aa = new CC();
BB bb = (BB) aa;
}
}
interface AA{
void getA();
}
interface BB{
void getB();
}
class CC implements AA,BB{
@Override
public void getA() {
System.out.println("按时a");
}
@Override
public void getB() {
System.out.println("按时b");
}
}
这段代码中,我们定义了三个类和两个接口,类CC实现了接口AA和BB中的方法,其中AA接口中有一个getA()方法,BB接口中有一个getB()方法。
在Test类的main()方法中,我们使用了多态,将CC类实例化为AA接口类型的aa对象。接着,我们尝试将aa对象强制类型转换为BB接口类型的bb对象。这里之所以可以进行强制类型转换,是因为CC类实现了BB接口中的所有方法,满足了BB接口的要求。
需要注意的是,强制类型转换可能会导致类型不匹配的运行时错误。在这个例子中,由于aa对象实际上是CC类型的,可以成功地进行强制类型转换,但是如果aa对象是其他类型的对象,则会抛出ClassCastException异常。因此,我们应该尽量避免进行强制类型转换。
接口不是一般的类,隐式被abstract关键字修饰,所以无法实例化,你这里定义了AA和BB接口,CC类实现了AA,BB接口,然后你实例化了CC,向上转型为AA,其实AA引用的还是CC的实例对象,那你此时将aa再强转为BB其实是相当于将CC的实例对象转为BB,如果这么写可以会好理解一点
AA aa = new CC();
CC cc =(CC) aa;
BB bb =(BB) cc;
如果你打了断点就会发现,自始至终你这里也只有一个实例对象而已