我有一个父类 Shape 和一个子类 Rectangle ,我在父类Shape中有一个名为输出的方法。 如何在子类中调用父类方法输出?
父类
public class Shape {
public int edge;
public Shape(int Gedge) {
edge=Gedge;
}
public void Output() {
System.out.println("This shape has "+edge+" eges");
}
}
子类:
public class Rectangle extends Shape {
public int edge, length, width;
public Rectangle(int Gedge, int Glength, int Gwidth) {
super (Gedge);
edge=Gedge;
length=Glength;
width=Gwidth;
}
public void Output1() {
//I want to call the parent class Method "Output" here.
System.out.println("The Area is "+length*width);
}
public static void main (String [] args) {
Rectangle A1=new Rectangle(4,3,5);
A1.Output1();
}
}
如果我现在运行此代码,输出为 区域为15 ,但我想在Shape中调用Output方法,因此理想情况下它会打印
此形状有4条边
区域为15
帮助得到赞赏。感谢
答案 0 :(得分:3)
只需调用方法:
public void Output1()
{
Output();
System.out.println("The Area is "+length*width);
}
不需要super
关键字,因为您没有调用被Output1
方法覆盖的基类方法。你正在调用另一种方法。
答案 1 :(得分:0)
我认为在你的例子中,具体的形状必须是接口(方法area()和(Rect,Square ..)实现它。回到你的问题,因为那是在你的父类输出是公共的,你可以从孩子做上课:super.Output();
答案 2 :(得分:0)
由于其他人已经回答了这个问题(调用super.Output()或只调用Output()是正确的),我会尝试更清楚地说明为什么两者都是正确的(并且它是正确的)主要是由于你的命名惯例。)
当你在类之间有父子关系时,如下所示:
class A {
public void doStuff(){
System.out.println("Doing A Stuff!");
}
}
class B extends A {
public void doStuff(){
System.out.println("Doing B Stuff!");
}
}
您正在做的是覆盖doStuff方法。行为如下:
A a = new B(); // A is the parent type of a, B is the actual type.
a.doStuff(); // prints "Doing B stuff!"
在Java中重写时,该方法必须具有完全相同的名称,参数列表(按相同顺序)和返回类型。所以在你的例子中,Output1不是Output的重写。这就是为什么你实际上可以在你的子类中的任何地方调用Output(),而不需要超级&#39;关键词。如果您要重构代码以使两个方法具有相同的签名,那么是,调用父类行为的唯一方法是在重写方法中调用super.Output()。实际上,如果你以下面的方式写了你的子类B,那么对doStuff的调用将是一个递归调用,并且该方法会递归直到你遇到堆栈溢出(因此,你需要使用super.doStuff()):< / p>
class B extends A {
public void doStuff(){
doStuff(); // BAD CODE!! Use super.doStuff() here instead!
System.out.println("Doing B Stuff!");
}
}
另一种确保调用超类方法的方法是使用实际类型的超类来实例化对象,但是你失去了子类的所有功能:
A a = new A(); //both parent type and actual type of a is A
a.doStuff(); // prints "Doing A stuff!" (can't print "Doing B Stuff!")
此外,正如评论所述,您应该查看this question,它将指向您的官方Java风格指南和约定的方向。关于代码的一些快速注意事项是缺少局部变量的低驼峰情况(A1应该是a1)和方法(输出()应该输出())