我有一个父类class A
和一个子类class C extends A
。
A a=new A();
C c=(C)a;
这给了我错误。为什么呢?
此外,如果我的代码是
A a=new A();
C c=new C();
c=(C)a;
这很好用。
现在我的c
变量可以访问C中的那些或B类中的变量吗?
答案 0 :(得分:6)
它给你一个错误,因为a
不是 C
的实例 - 所以你不能让它向下转。想象一下,如果允许 ,你可以这样做:
Object o = new Object();
FileInputStream fis = (FileInputStream) o;
当您尝试从流中读取时,您会发生什么?您希望它从哪个文件中读取?
现在是第二部分:
A a=new A();
C c=new C();
C c=(C)a;
这将不正常工作 - 一开始它甚至不会编译,因为你两次声明相同的变量(c
);如果您修复了这个错误,当您尝试将A
的实例强制转换为C
时,仍会获得异常。
但是,这段代码真的有效:
A a = new C(); // Actually creates an instance of C
C c = (C) a; // Checks that a refers to an instance of C - it does, so it's fine
答案 1 :(得分:2)
这是一个很好的YouTube视频http://www.youtube.com/watch?v=jpFij6RD7CA,它展示了同样的效果。以下是相同的全文信息。
“Upcasting”表示将子类对象移动到父类对象。 “DownCasting”与将“父对象”移动到子对象的“Upcasting”相反。
“Upcasting”完全有效,但.NET中不允许“向下转换”。例如,下面是一个简单的“Customer”父类,它由子类“GoldCustomer”进一步继承。
class Customer
{
}
class GoldCustomer : Customer
{
}
下面是一个“向上转换”代码,其中子父级黄金客户被推送到客户类别。
Customer obj = new GoldCustomer();
下面是一个“向下转换”代码的示例,其中尝试将父类对象移动到子类对象,这在.NET中是不允许的。
GoldCustomer obj = new Customer(); // not allowed illegal
答案 2 :(得分:1)
在java中有一个概念,即没有向上转换你不能执行向下转换
a a = new A(); C c =(C)a;
在这种情况下,你尝试使用向上转发执行向下转发
答案 3 :(得分:0)
A不是C的子类,因此你无法将其删除。
答案 4 :(得分:0)
在投射对象时,我们需要记住的是对实例应用是关系。 与您的示例中一样, C是A ,但 A不是C 。
所以在你的情况下, A =新A(); C c =(C)a; // classCasteException出现。
我认为这可能会对你有帮助。