使用超类的方法相同的方法对亚类的对象

问题描述:

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使用超类的方法相同的方法对亚类的对象

+6

你的方法目前没有返回类型,并使用你的类声明'()'不正确的 - 这是值得尝试,以使示例尽可能完整(没有多余的代码,当然)。如果你花些精力将它们格式化得很好,它也会有所帮助。我已经修复了这些问题,但请在将来的问题上投入更多精力。 – 2013-03-26 07:06:59

+0

我会为下一次做,但我更关心概念 – 2013-03-26 09:18:09

+0

是的,但无效的代码分心你正在寻找的概念。这是我的观点。你应该努力让你的问题尽可能容易让人回答。你要求人们花时间帮助你 - 你应该尽可能地表达你的问题,并表达你的感谢。 – 2013-03-26 09:22:17

不能从外面 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的期望(和封装)。

+0

好的,我即将测试..这是为什么? – 2013-03-26 07:11:37

+0

@LewsTherin:哪位?重写?重点是改写对象的行为。如果你可以通过铸造别的东西来绕过它,那将毫无意义。这不仅会让子类不愉快,而且会消除多态性本身的目的:我希望能够在不知道其类型的情况下从任何InputStream *中读取数据,并且仍然可以获得重写的行为。 – 2013-03-26 07:15:03

+0

大声笑这是正确的,我只是测试了三种语言。我想我从来没有想过它..谢谢! – 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(); 
+0

我在想的铸造,但我绝对不认为你可以分配一个超类的子类变量。 – 2013-03-26 07:12:37

+0

我认为它会起作用。我以前做过这个。但我觉得不推荐使用类型转换。 – iCode 2013-03-26 07:14:29

+0

我也尝试过,它不起作用。这是一个隐含的类型转换:'((B)A)',这是没有意义的。 – 2013-03-26 07:31:49

这可以用于使用派生类对象调用基类的方法调用super.test()

b.super.test()