Java继承和覆盖方法

aiu*_*una 4 java

我只是在学习遗传,而且我遇到了一个简单的问题.我想覆盖一个类中的print()语句,并在其子类2中使用新语句.我不确定如何处理它,因为它是一个没有参数的void语句.

  public class One {

    private String name;
    private int age;

    public human(String n, int a)
      name = n;
      age = a;
    }
    public void print() {

     System.out.println("Name: " + name);
     System.out.println("Age: " + age);

    }
Run Code Online (Sandbox Code Playgroud)

二等:

    public class Two extends One {

    private double gpa;

    public two(String n, int a, double g) {
      super(n,a);
      gpa = g;

    public double getGPA (){
          return gpa;
       }

    public void print() {
    // override code here to include code from class one + displaying GPA..

     }
}
Run Code Online (Sandbox Code Playgroud)

例如,example.print()将打印出来

Name: Jack
Age: 34
Run Code Online (Sandbox Code Playgroud)

我想要的输出是

Name: Jack
Age: 34
GPA: 3.20
Run Code Online (Sandbox Code Playgroud)

我想我必须使用超级方法,但无法找到正确合并它的方法.任何提示将不胜感激!

duf*_*ymo 5

你有正确的想法.试试这个:

public void print() {
    super.print();
    System.out.println("GPA: " + this.gpa);
}
Run Code Online (Sandbox Code Playgroud)


Xav*_*ica 5

通过该关键字super,您可以访问超类的(可见)成员.所以,你可以调用print()超类的方法,然后只做子类的具体工作:

public void print() {
    super.print();
    System.out.println ("GPA: " + gpa);
}
Run Code Online (Sandbox Code Playgroud)

有关使用的更多信息,请参阅Java教程的这一简要部分super:使用关键字super.它确实用一个简单的例子解决了你所问的同样问题.

请注意,如果你写的

public void print() {
    print();
    System.out.println ("GPA: " + gpa);
}
Run Code Online (Sandbox Code Playgroud)

如果没有指定你想要调用super.print(),那么print()方法two将无限期地调用自己,直到你得到一个OutOfMemoryError.

值得注意的是Vash @Override答案中提到的注释.


Dam*_*ash 5

在Java中,每个方法都是虚拟的,这意味着您可以覆盖每个可访问的方法.通过可访问的方法,我们可以采用具有修饰符public,protected或default的方法.

从Java 1.6开始,建议使用注释@Override来标记已被覆盖的方法.这有助于编译器和开发人员防止潜在的故障.

因此要覆盖方法,One#print()您只需要在子类中添加具有相同签名的方法.

@Override
public void print() {
    super.print(); //Here you call the functionality from super class.
    System.out.println("GPA: %f", getGPA());
}
Run Code Online (Sandbox Code Playgroud)

覆盖时,调用super不是强制性的.

要记住的好处是向方法添加描述为什么需要覆盖,并且方法调用超类逻辑.