Java:如何访问类层次结构中对象的成员,其中一个成员更改其数据类型

时间:2011-08-05 13:23:25

标签: java inheritance

我有三个班级:

class A
{
  public Object Person;
}

class B extends A
{
}

class C
{
  public String Name;
}

我想访问姓名:

B b = new B();
C c = new C();
c.Name = "John";

b.Person = c;
String s = b.Person.Name; // This is not allowed. Name is not a property of Person.

如何引用Name属性(用于写入或读取)?

事实上,我可以有一个D,E,F类,我需要分配b.Person,其中每个类具有完全不同的属性。所以解决方案需要使用D,E,F等等。

6 个答案:

答案 0 :(得分:3)

你需要施放:

String s = ((C)b.Person).Name;

请注意,这是一种危险的编码方法,因为现在对A中Person的数据类型的更改可能会导致此代码在运行时抛出异常。你的模型强烈打字(即使用特定的类而不是Object)会好得多。

答案 1 :(得分:2)

您需要设计更好的对象模型。 正如已经指出的那样,使用类型'Object'太抽象了。在某些时候,您的代码必须处理“具体”类型。 Java是一种强类型编程语言。其他一些语言更流畅,允许这种动态运行时输入。

答案 2 :(得分:0)

如果您想访问C的成员(因为C类型为Person),您应该将此人转为Object

String s = ((C)b.Person).Name;

两个注释:

  1. 不建议将成员声明为public,而是声明为private,并声明getter / setter方法来访问它们。
  2. 通常成员名称以小写字母开头,而不是从大写字母开始。

答案 3 :(得分:0)

您可以转换b来访问Name属性;

String s = ((C)b.Person).Name

答案 4 :(得分:0)

如果您的课程为beans,则可以使用Commons BeanUtils来阅读嵌套属性:

BeanUtils.getNestedProperty(b, "person.name");

PS:请尝试使用Java编码约定:成员名称以小写字母开头,属性通常是私有的,并且由get / set方法和so on公开。

答案 5 :(得分:0)

您可以考虑使用一些Generics

class A<T>
{
  public T person;
}

class B extends A<Person>
{
}

或/并使用一些接口。

无论如何它是一个奇怪的结构,你最好只使用一个Person类来设置名称。并且以面向对象的方式使用一些polymorphism

我看到你开始使用大写字母的变量名称,所以一个小提示:使用camel-casing(我在我的例子中修复了它)