向上倾斜向下倾斜

时间:2011-09-20 18:01:27

标签: java inheritance

我有一个父类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类中的变量吗?

5 个答案:

答案 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”相反。

enter image description here

“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出现。

我认为这可能会对你有帮助。