2011-04-04 114 views
0

A扩展B,我可以在A的构造函数中引用B子项吗?从父类构造对象

public A(B b) 
{ 
    /*(B)this = b*/ 
} 

如果不是,我如何用B对象构造一个目的?,我的意思是其它,使用Cloneable的创造一些其它实例或流出JLS(推土机,BeanUtils的,等等)的溶液。简而言之,A构造函数将如何使代码运行?

B b = new B("hi"); 
A a = new A(b); 
assertequals(a.getSalute(), "hi");//ok so far 

a.setSalute("hola"); 
assertequals(b.getSalute(), "hola");//A maintains a reference to B 

f(a);//prints hola 
f(b);//prints hola as well 

在此先感谢

+3

你想达到什么目的?如果您的意思是从'A'投射到'B',则无法工作,因为您无法构建层次结构。 – Kevin 2011-04-04 18:22:08

+0

我想在这里......“如何构建一个B对象的对象”,你想创建一个新的'狗'与给定的'动物'对象? (狗延伸动物)但是,_this_'狗'会变成_that_'动物'? – Ishtar 2011-04-04 18:31:01

+0

你是对的,我不会流利的Java语言,我认为Java语言将允许A对象中的B'suboject'以其他语言的方式引用其他B对象。 – user311174 2011-04-05 16:23:31

回答

0

看起来你正在尝试某种修饰器模式。我不是“程序到界面”的最大粉丝,因为我认为这是很好的建议,但我认为这是一个很好的情况。

interface Wrapable { // replace Wrapable with something more appropriate 
    // common methods here? 
} 

class B implements Wrapable { 

} 

class A implements Wrappable { 
    Wrappable whatThisWraps; 

    A(Wrappable w) { whatThisWraps = w; } 
} 
+0

也许这是在某些情况下的解决方案,但有缺点:A永远不是B,在A方法中你必须将whatThisWraps转换为B来引用任何B的字段成员。 – user311174 2011-04-05 16:55:56

0

是。 Java不会禁止像C++那样对具体类进行前向引用。

你必须知道静态类初始值设定项。

DCL12-J. Prevent class initialization cycles来自:

根据§12.4,Java语言规范[2005 JLS]的 “类和接口的初始化”

一类的初始化包括执行其初始化static的以及在类中声明的static字段(类变量)的初始值设定项。

换句话说,static字段的存在会触发类的初始化。但是,静态字段可能取决于类的初始化,可能会创建一个初始化周期。 Java语言规范还规定在§8.3.2.1“为类变量初始化器” [2005 JLS]

...在运行时,static变量是final和与编译时间常数的值初始化首先被初始化。

此声明可能会引起误解,因为它不适用于使用在稍后阶段初始化的static final字段值的实例。声明字段为static final不足以保证在读取之前完全初始化。

0

只要你的构造函数被适当地构造,就可以像你所描述的那样在A的构造函数中引用B.

如果A扩展B,则任何A对象都可以被认为是B对象,但反过来却是不对的。

为了更好地回答您的原始问题,从A创建B应该很简单 - 将构造函数中的A更改为B(因为任何A也是B),调用相应的getter方法并将它们的值分配给A保存的实例变量。这种类型的构造函数public B(B b)...是一个复制构造函数。如果你决定在构造函数中保留A,那么就应用通过调用B从A继承的所有方法提到的调用/复制/分配逻辑。

+0

是的,但我该如何让B子项引用在构造函数中传递的b对象?毕竟任何A对象也是B对象。 – user311174 2011-04-05 16:59:31

+0

更新了答案,以更清晰地从B对象创建A对象的副本。我仍然不完全确定你评论中的第一个问题是在问什么。 – Joel 2011-04-05 17:27:32

+0

是的,但它是复制构造函数中getter/setter的一部分,我想跳过。毕竟我想'B'和B主体在一些A对象引用同一个对象。 – user311174 2011-04-05 17:40:53