使用子类对象修改其超类对象中的受保护的propety

时间:2010-04-29 01:27:16

标签: java object subclass superclass

很抱歉这个糟糕的标题我没想到我的Java问题更好的版本。 我现在正在使用Java版本:1.6.0_18和Netbeans版本:6.8

现在提出问题。

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

我能想到这样做的方法是创建一个继承所述类的子类,然后创建一个获取超类的int属性的方法。我成功地创建了获取int属性的代码,但现在我无法弄清楚如何使用这个新的子类来引用超类的对象。

这是我到目前为止的两个班级:

public class A
{
  protected int iNumber;

  public void setNumber ( int aNumber )
  {
    iNumber = aNumber;
  }
}
public class B extends A
{
  public int getNumber()
  {
   return super.iNumber;
  }
}

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

A objA = new 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; 

无论如何,请不要做我想做的事情?

P.S。我希望能让这个想法发挥作用,因为我不想通过给它一个getter方法来编辑A类(除非我别无选择)。

P.P.S此外,我知道公开属性而不是将其设为私有并使用公共setter / getter方法是一个“坏”的想法,但我喜欢这样:)。

编辑:添加代码标记

3 个答案:

答案 0 :(得分:1)

您无法将A对象强制转换为B.如果要调用getNumber,则必须具有真正的B对象:

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

不需要演员表。

答案 1 :(得分:1)

对于

B objB = (B) objA;

A的对象不是类B的对象,因此不允许使用强制转换。

AB之间的班级关系是,B 是-a A,(因为班级B扩展A),但在这种情况下不能说反过来。

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

  • class Animal
  • 课程Dog扩展Animal

上述示例中尝试的是将Animal投射到Dog

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

不一定是这种情况,因为并非所有Animal都是Dog s - 就我们所知,animalObject可能是类Cat的一个实例} Animal扩展,绝对不是Dog

答案 2 :(得分:0)

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

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