java - 使用子类对象修改其父类(super class)对象中的 protected 属性

标签 java object subclass superclass

抱歉这个蹩脚的标题,我没有为我的 Java 问题想出更好的版本。 我现在使用Java版本:1.6.0_18和Netbeans版本:6.8

现在提问。

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

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

这是我迄今为止所上的两门课:

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; 

请问有办法做我想做的事吗?

附注我希望这个想法能够实现,因为我不想通过给 A 类提供 getter 方法来编辑它(除非我别无选择)。

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

编辑:添加代码标签

最佳答案

对于线路

B objB = (B) objA;

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

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

以下面为例,存在以下情况:

  • 动物
  • Dog扩展了Animal

上面示例中尝试的是将 Animal 转换为 Dog:

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

情况不一定如此,因为并非所有 Animal 都是 Dog ——据我们所知,animalObject 可能是Cat 类的实例,它扩展了 Animal,它绝对不是 Dog

关于java - 使用子类对象修改其父类(super class)对象中的 protected 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2734224/

相关文章:

java - 如何根据注释值动态创建类的实例?

javascript - 如果对象键在 typescript 中是动态的,如何获取值(value)?

C++ 宏创建对象

java - 复制 volatile ArrayList 的元素

java - 将 org.threeten.bp.* 和 org.joda.time* 转换为相应的 java.time.* 类的最佳方法

绑定(bind) netbeans 组合框所选项目时出现 Java PropertyResolutionException

database - 如何取回 Parse 上的用户数据?

c# - C# 中带有 "wrapped edges"的二维数组

c++ - 如何在 C++ 中的 vector 中存储和使用不同的类

带空格和不带空格的 CSS 子类