首页 新闻 会员 周边 捐助

java基础的一个多态的强转问题

0
悬赏园豆:10 [已解决问题] 解决于 2023-04-08 13:06

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");
}

}

*三井寿*的主页 *三井寿* | 初学一级 | 园豆:35
提问于:2023-04-07 21:04
< >
分享
最佳答案
0

这段代码中,我们定义了三个类和两个接口,类CC实现了接口AA和BB中的方法,其中AA接口中有一个getA()方法,BB接口中有一个getB()方法。

在Test类的main()方法中,我们使用了多态,将CC类实例化为AA接口类型的aa对象。接着,我们尝试将aa对象强制类型转换为BB接口类型的bb对象。这里之所以可以进行强制类型转换,是因为CC类实现了BB接口中的所有方法,满足了BB接口的要求。

需要注意的是,强制类型转换可能会导致类型不匹配的运行时错误。在这个例子中,由于aa对象实际上是CC类型的,可以成功地进行强制类型转换,但是如果aa对象是其他类型的对象,则会抛出ClassCastException异常。因此,我们应该尽量避免进行强制类型转换。

收获园豆:10
Technologyforgood | 大侠五级 |园豆:7688 | 2023-04-07 21:37
其他回答(1)
0

接口不是一般的类,隐式被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;
如果你打了断点就会发现,自始至终你这里也只有一个实例对象而已

java从精通到入门 | 园豆:202 (菜鸟二级) | 2023-04-08 12:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册