Java 上浇下浇

Java 上浇下浇,java,inheritance,Java,Inheritance,我有一个父类类a,子类类C扩展了类a A a=new A(); C c=(C)a; 这给了我错误。为什么? 如果我的代码是 A a=new A(); C c=new C(); c=(C)a; 这个很好用 现在,我的c变量访问的所有方法都有哪些?它会给你一个错误,因为a不是c的实例,所以你不能向下转换它。想象一下,如果允许这样做,您可以: Object o = new Object(); FileInputStream fis = (FileInputStream) o; 当您尝试从流中读取

我有一个父类
类a
,子类
类C扩展了类a

A a=new A();
C c=(C)a;
这给了我错误。为什么?

如果我的代码是

A a=new A();
C c=new C();
c=(C)a;
这个很好用


现在,我的
c
变量访问的所有方法都有哪些?

它会给你一个错误,因为
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

A不是C的子类,因此不能将其向下转换。

在转换对象时,我们需要记住的是将应用于实例。 就像在你的例子中,C是一个,但是A不是C

所以在你的情况下, A=新的A(); C=(C)a;//发生classCasteException


我想这可能会对你有所帮助。

这是一个很好的youtube视频,演示了同样的情况。下面是完整的文本信息

“向上转换”是指将子类对象移动到父类对象。“向下投射”与将父对象移动到子对象的“向上投射”相反

“向上投射”完全有效,但在.NET中不允许“向下投射”。例如,下面是一个简单的“Customer”父类,子类“GoldCustomer”进一步继承了该父类

class Customer
{

}

class GoldCustomer : Customer
{

}
下面是一个“向上投射”代码,其中子父类gold customer被推送到customer类

Customer obj = new GoldCustomer(); 
下面是一个“向下投射”代码示例,其中尝试将父类对象移动到子类对象,这在.NET中是不允许的

GoldCustomer obj = new Customer(); // not allowed illegal

在java中,有一个概念是,如果不向上转换,就不能执行向下转换

A=新的A(); C=(C)a


在这种情况下,您尝试执行向下播放而不执行向上播放

不理解您的问题:(您的“this works fine”示例在您说“gives me error”时甚至无法编译)最好粘贴您得到的错误,无论是编译错误还是运行时错误。如果是异常,则打印堆栈跟踪并提及代码中获得异常的行,因为粘贴的代码没有行号Man Jon Skeet甚至可以编译不存在的代码!:)(编辑:这是在OP编辑之前)@乔恩·斯基特:对不起,我是说儿童班是C。凯伦:是的,这是我一直假设的。整个答案假设C是a的一个子类。