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方法是一个“坏”主意,但我喜欢这样:)
编辑:添加代码标签
# 1 楼答案
不能将a对象强制转换为B对象。如果要调用getNumber,必须具有真实的B对象:
不需要石膏
# 2 楼答案
排队
类
A
的对象不是类B
的对象,因此不允许强制转换A
和B
之间的类关系是,B
是-aA
(因为类B
扩展了A
),但在这种情况下不能说相反以以下内容为例,其中存在以下内容:
Animal
李>Dog
扩展Animal
在上面的示例中,尝试将
Animal
转换为Dog
:这不一定是这样,因为并非所有的
Animal
都是Dog
。据我们所知,animalObject
可能是Cat
类的一个实例,它扩展了Animal
,而Dog
类肯定不是Dog
# 3 楼答案
正如其他人所说,你不能因为他们的关系而将A对象转换为B对象。我要补充的是,听起来你只有一个类,但在某些情况下,你希望其他一些对象无法读取数字的值。我认为这是一个更好的接口服务。将接口定义为只有setNumber(int)方法。定义类,使其同时具有getNumber()和setNumber(int)方法,并实现“setter”接口。然后,只要有一个接受对象作为参数的方法,就将其更改为接受接口
这将允许您拥有不允许获取对象值的代码,但通过仅定义一个类简化了代码