使用超类的方法相同的方法对亚类的对象
class A {
void test() {
}
}
class B extends A {
void test() {
}
public static void main(String[] args)
{
B b=new B();
//insert code here
}
}
我怎样才能调用类A的对象为b类B的方法test
? 专为对象B使用超类的方法相同的方法对亚类的对象
不能从外面 B呼叫了...但内 B可以称其为:
super.test();
这可以从任何代码B内完成 - 它不必在test()
方法本身。因此,例如:
public void foo() {
// Call the superclass implementation directly - no logging
super.test();
}
@Override void test() {
System.out.println("About to call super.test()");
super.test();
System.out.println("Call to super.test() complete");
}
注意@Override
注释告诉编译器,你真的没意味着覆盖的方法。 (除了别的以外,如果在方法名中有错字,这将帮助您快速找到它。)
您无法从外部B调用它的原因是B 覆盖了该方法。重写的目的是取代原来的行为。例如,在使用参数的方法中,在调用超类实现或执行其他操作之前,B可能希望根据参数(根据自己的规则验证它)做些什么。如果外部代码可以调用A的版本,那将违反B的期望(和封装)。
好的,我即将测试..这是为什么? – 2013-03-26 07:11:37
@LewsTherin:哪位?重写?重点是改写对象的行为。如果你可以通过铸造别的东西来绕过它,那将毫无意义。这不仅会让子类不愉快,而且会消除多态性本身的目的:我希望能够在不知道其类型的情况下从任何InputStream *中读取数据,并且仍然可以获得重写的行为。 – 2013-03-26 07:15:03
大声笑这是正确的,我只是测试了三种语言。我想我从来没有想过它..谢谢! – 2013-03-26 07:26:27
该类本身是错误的。定义类名称时不应添加括号。 可以使用任一对象类型铸造或类B的方法test
class A
{
test()
{}
}
class B extends A
{
test()
{
super.test() // calls the test() method of base class
}
}
B b=new B();
我在想的铸造,但我绝对不认为你可以分配一个超类的子类变量。 – 2013-03-26 07:12:37
我认为它会起作用。我以前做过这个。但我觉得不推荐使用类型转换。 – iCode 2013-03-26 07:14:29
我也尝试过,它不起作用。这是一个隐含的类型转换:'((B)A)',这是没有意义的。 – 2013-03-26 07:31:49
这可以用于使用派生类对象调用基类的方法调用super.test()
。
b.super.test()
你的方法目前没有返回类型,并使用你的类声明'()'不正确的 - 这是值得尝试,以使示例尽可能完整(没有多余的代码,当然)。如果你花些精力将它们格式化得很好,它也会有所帮助。我已经修复了这些问题,但请在将来的问题上投入更多精力。 – 2013-03-26 07:06:59
我会为下一次做,但我更关心概念 – 2013-03-26 09:18:09
是的,但无效的代码分心你正在寻找的概念。这是我的观点。你应该努力让你的问题尽可能容易让人回答。你要求人们花时间帮助你 - 你应该尽可能地表达你的问题,并表达你的感谢。 – 2013-03-26 09:22:17