4

我只是在学习继承,并被困在一个简单的问题上。我想用一个新的子类二覆盖一个类中的 print() 语句。我不确定如何处理它,因为它是一个没有参数的无效语句。

  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);

    }

二等:

    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..

     }
}

例如, example.print() 将打印

Name: Jack
Age: 34

我想要的输出是

Name: Jack
Age: 34
GPA: 3.20

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

4

6 回答 6

5

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

public void print() {
    super.print();
    System.out.println("GPA: " + this.gpa);
}
于 2013-04-03T09:52:16.743 回答
5

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

public void print() {
    super.print();
    System.out.println ("GPA: " + gpa);
}

有关以下用法的更多信息,请参阅 Java 教程的简短部分super使用关键字 super。它确实通过一个简单的示例解决了您所询问的相同问题。

请注意,如果你写

public void print() {
    print();
    System.out.println ("GPA: " + gpa);
}

如果不指定您要调用super.print(), 的print()方法two将无限期地调用自身,直到您获得OutOfMemoryError.

还值得注意的是 Vash在他的回答@Override中提到了注释。

于 2013-04-03T09:53:02.233 回答
5

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

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

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

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

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

要记住的一件好事是向方法添加描述,为什么需要覆盖,并让方法调用超类逻辑。

于 2013-04-03T10:01:07.997 回答
2

就像调用方法的 super() 一样简单

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);
Second class:

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() {
 super.print();
 System.out.println("GPA: " + getGPA());
}
于 2013-04-03T09:53:23.910 回答
1

你的 One.java

public class One {

protected String name;
protected int age;

public One(String n, int a)
{
name = n;
age = a;
}
public void print() {
System.out.println ("Name: " + name);
System.out.println ("Age: " + age);
}
}

二.java

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() {
    System.out.println ("Name: " + name);
    System.out.println ("Age: " + age);
    System.out.println ("gpa: " + gpa);
}
}

将此添加到一些 java 文件中以检查输出。

public class ExecuteTwo {
public static void main(String[] args) {
    Two two = new Two("Aiuna",1,100.0);
    two.print();
}
}

这会给你你想要的。

看到这个之后你应该做什么:(i)知道什么是构造函数(ii)访问修饰符,访问级别

于 2013-04-03T10:01:08.457 回答
0

当您在第二类中覆盖 print() 方法时,您可以写为System.out.println("GPA: " + gpa);

于 2013-04-03T10:00:30.607 回答