0

对不起,我没有为我的 Java 问题想出一个更好的版本。我现在正在使用 Java 版本:1.6.0_18 和 Netbeans 版本:6.8

现在来回答这个问题。

我所做的是创建了一个只有一个受保护的 int 属性的类,然后我创建了一个公共方法来将 int 属性设置为给定值。然后我创建了该类的一个对象,并使用所述公共方法将 int 属性设置为 5。现在我需要您的帮助来创建另一个类,该类将采用所述对象并公开它的受保护 int 属性。

我能想到的方法是创建一个子类来继承该类,然后创建一个方法来获取超类的 int 属性。我有点成功地创建了获取 int 属性的代码,但现在我不知道如何使用这个新的子类来引用超类的对象。

到目前为止,这是我上过的两门课:

公开课A
{
  受保护的 int iNumber;

  公共无效 setNumber ( int aNumber )
  {
    iNumber = aNumber;
  }
}
公共类 B 扩展 A
{
  公共 int getNumber()
  {
   返回超.iNumber;
  }
}

我创建了一个“A”对象并使用它的方法将其属性设置为 5,如下所示:

一个 objA = 新的 A();
objA.setNumber ( 5 );

现在我想创建一个'B'的对象来输出存储在'objA'的属性中的int。我试图运行这段代码:

B objB = (B) objA;
String aNumber_String = String.valueOf(objB.getNumber());
System.out.println(aNumber_String);

但我得到了错误:第一行的“java.lang.ClassCastException”

B objB = (B) objA;

请问有没有做我想做的事情?

PS我希望使这个想法可行,因为我不想通过给它一个getter方法来编辑A类(除非我别无选择)。

PPS 另外,我知道公开属性而不是将其设为私有并使用公共 setter / getter 方法是一个“坏”主意,但我喜欢这种方式:)。

编辑:添加代码标签

4

3 回答 3

1

您不能将 A 对象强制转换为 B。如果要调用 getNumber,则必须有一个真实的 B 对象:

B objB = new B();
objB.setNumber ( 5 );
System.out.println( objB.getNumber() );

不需要演员表。

于 2010-04-29T01:38:42.373 回答
1

对于线路

B objB = (B) objA;

class 的A对象不是class 的对象B,因此不允许进行强制转换。

A和之间的类关系B是,即B -a A,(因为类B扩展A了),但是这种情况下不能说反之。

以以下为例,其中存在以下内容:

  • Animal
  • Dog扩展Animal

上面示例中尝试的是将 anAnimal转换为 a Dog

Dog dogObject = (Dog)animalObject;  // Not allowed.

这不一定是这种情况,因为并非所有Animal的 s 都是Dogs - 据我们所知, theanimalObject可能是Catextends类的实例Animal,这绝对不是 a Dog

于 2010-04-29T01:39:18.070 回答
0

正如其他人所说,由于它们的关系,您不能将 A 对象强制转换为 B。我要补充的是,听起来您确实只有一个类,但是在某些情况下,您希望其他对象无法读取该数字的值。我会说这更好地服务于界面。将接口定义为只有 setNumber(int) 方法。将类定义为同时具有 getNumber() 和 setNumber(int) 方法,并实现您的“setter”接口。然后,无论您有一个接受 A 对象作为参数的方法,都将其更改为接受您的接口。

这将允许您拥有不允许获取对象值的代码,但通过仅定义一个类来简化您的代码。

于 2010-04-29T01:56:34.640 回答