很抱歉这个糟糕的标题我没想到我的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方法是一个“坏”的想法,但我喜欢这样:)。
编辑:添加代码标记
答案 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
的对象,因此不允许使用强制转换。
A
和B
之间的班级关系是,B
是-a A
,(因为班级B
扩展A
),但在这种情况下不能说反过来。
以下面的例子为例,其中存在以下内容:
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对象作为参数的方法,请将其更改为接受您的界面。
这将允许您拥有不允许获取对象值的代码,但只通过定义一个类来简化代码。