2012-08-09 98 views
1

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

此外,代码中有一个错误,请帮助我纠正它。

+0

我希望“谷仓延伸建筑”是错字,它应该是谷仓延伸建筑 – kosa 2012-08-09 14:47:11

+1

字符串和建筑是没有办法相关(无继承),所以你会得到编译时错误在线字符串str1 =(String)build1 ;.所有其他行编译,因为它们是相关的。 – kosa 2012-08-09 14:48:39

+0

学习起来更有趣,它可以与Eclipse一起工作,并且随着调试器逐步跟随工作。 – 2012-08-09 15:34:29

回答

1

鉴于这种Barn bar2 = (Barn)build1;

平等后的部分((仓)build1中)意味着你类型转换build1中式建筑类型谷仓并通过它的价值BAR2。

你能做到这一点,因为任何谷仓一个建筑,因为你在类定义延伸(延伸谷仓大厦)。您还可以将任何类类型转换为Object类,因为在Java中,所有类都从Object继承,也就是说,一切都是Object。

当您试图将其转换为字符串时发生此错误,因为Building没有与String类型的连接。得到它了?

+0

但是请告诉我在上面声明的每个对象中权限是如何变化的......比如哪个对象可以访问哪些类的所有成员(如果定义的话)...我希望你有我的问题吗? – 2012-08-09 15:02:16

+0

您只能使用'new'运算符初始化。您在代码中执行了两次,其他情况是在投射值类型时赋值。 在了解了Java的核心原理之后,应该学习该主题(类型转换)。您应该首先了解面向对象编程的基础知识。我可以推荐你阅读** Head First Java ** - 几天后你将会有一次大的知识飞跃。 – 2012-08-09 15:06:05

1

您不能投Building作为String类型。这两个类之间没有关系(继承,接口等)。

这当然是一个BuildingObject的情况下,但你会被它铸造于Object失去你Building对象的信息。

实例化变量是从右到左的关联;您创建每个对象的新实例,并将其分配给一个变量。如果你正在进行演员阵容,那么确保你正在投射的类型与你获得的类型相关联是很重要的(例如,将Object作为Integer--这可能会也可能不行,这取决于你是什么样的人回来可以合理地投为Integer)。

+0

但请告诉我在上面声明的每个对象中权限是如何变化的...像哪个对象可以访问哪些类的所有成员(如果定义)...我希望你有我的问题吗? – 2012-08-09 14:55:51

0
Building b = (Building) (new Barn()); 

将有机会获得所有建筑物的成员和领域,无视加谷仓领域(这就是所谓的向下转换);

Barn b = (Barn) (new Building()); 

将导致空指针访问特定谷仓成员或将使他们未初始化的时候......我有点忘了发生在你向上转换,因为它几乎没有什么意义投的动物是猫,除非你期待一只猫;)

没有特定的方法或调试器,你将无法注意到的差异。我没有看到代码中的用例,只是投射。

+0

除了'Barn b =(Barn)(new Building());''会产生一个'ClassCastException',因为你实际上不能将一个'Building'转换成一个'Barn'(不是所有的建筑物都是谷仓,毕竟, )。 – 2012-08-09 15:26:37