有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用子类对象修改其超类对象中的受保护属性

很抱歉,这个蹩脚的标题让我没能为我的Java问题找到更好的版本。 我现在使用的是Java版本:1.6.018和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; 

求你了,我到底有没有办法做我想做的事

另外,我希望这个想法能奏效,因为我不想通过给它一个getter方法来编辑类A(除非我别无选择)

p.p.S.我也知道公开属性而不是将其私有化并使用公共setter/getter方法是一个“坏”主意,但我喜欢这样:)

编辑:添加代码标签


共 (3) 个答案

  1. # 1 楼答案

    不能将a对象强制转换为B对象。如果要调用getNumber,必须具有真实的B对象:

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

    不需要石膏

  2. # 2 楼答案

    排队

    B objB = (B) objA;
    

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

    AB之间的类关系是,B是-aA(因为类B扩展了A),但在这种情况下不能说相反

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

    • Animal
    • Dog扩展Animal

    在上面的示例中,尝试将Animal转换为Dog

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

    这不一定是这样,因为并非所有的Animal都是Dog。据我们所知,animalObject可能是Cat类的一个实例,它扩展了Animal,而Dog类肯定不是Dog

  3. # 3 楼答案

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

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