我的代码是: -
class Building{}
class Barn extends Building{
public static void main(String[]args){
Building build1 = new Building();
Barn bar1 = new Barn();
Barn bar2 = (Barn)build1;
Object obj1 = (Object)build1;
String str1 = (String)build1; //also an error over here
Building build2 = (Building)bar1;
}
}
我是Java新手。所以请任何人都可以解释我在这里如何进行实例化,比如如何对每个对象进行访问。
此外,代码中也有错误,请帮我纠正。
答案 0 :(得分:1)
您无法将Building
转换为String
类型。这两个类(继承,接口等)之间没有关系。
Building
是Object
的情况肯定是这样的,但您将Building
对象的信息丢失为Object
。
实例化变量是从右到左的关联;您创建每个对象的新实例,并将其分配给变量。如果你正在进行演员表,那么重要的是要确保你所投射的类型与你得到的类型相关(即将Object
作为Integer
投射 - 这可能或可能不起作用,取决于你得到的东西是否合理地被归为Integer
)。
答案 1 :(得分:1)
鉴于此Barn bar2 = (Barn)build1;
等于((Barn)build1)之后的部分意味着您将 build1 类型转换为类型构建到类型 Barn 并将其值传递给bar2。
你可以这样做,因为任何Barn 一个建筑物,因为你在类定义(Barn extends Building)中进行了扩展。您还可以将任何类类型类型转换为Object类,因为在Java中,所有类都从Object扩展,而且所有类都是Object。
尝试将其强制转换为String时出现错误,因为Building与String类没有连接。知道了吗?
答案 2 :(得分:0)
Building b = (Building) (new Barn());
可以访问所有Building的成员和字段,无视添加的Barn字段(称为向下转换);
Barn b = (Barn) (new Building());
在访问特定于谷仓的成员时会导致空指针,或者会让他们保持未初始化状态...我有点忘记当你向上投射时会发生什么,因为除非你期待将动物施放给猫是没有意义的一只猫;)
没有特定的方法或调试器,您将无法注意到差异。我没有在你的代码中看到一个用例,只是强制转换。