如何在这段java代码中进行实例化?

时间:2012-08-09 14:46:09

标签: java

我的代码是: -

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新手。所以请任何人都可以解释我在这里如何进行实例化,比如如何对每个对象进行访问。

此外,代码中也有错误,请帮我纠正。

3 个答案:

答案 0 :(得分:1)

您无法将Building转换为String类型。这两个类(继承,接口等)之间没有关系。

BuildingObject的情况肯定是这样的,但您将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());

在访问特定于谷仓的成员时会导致空指针,或者会让他们保持未初始化状态...我有点忘记当你向上投射时会发生什么,因为除非你期待将动物施放给猫是没有意义的一只猫;)

没有特定的方法或调试器,您将无法注意到差异。我没有在你的代码中看到一个用例,只是强制转换。