2013-04-03 129 views
4

我只是瞭解繼承和我堅持一個簡單的問題。我想覆蓋一個類中的print()語句,並在其子類兩個中新建一個。我不確定我會如何處理它,因爲它是一個沒有參數的void語句。Java的繼承和重寫方法

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 

我以爲我必須使用超級方法,但不能鰭d一種正確結合它的方法。任何提示將不勝感激!

+0

什麼是'example'? –

+0

'example.print();''example'的引用/對象類型是什麼? – AmitG

回答

5

關鍵字super,您可以訪問超類的(可見)的成員。所以,你可以調用父類的方法print(),然後就做了子類的具體工作:

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

,請參閱Java教程的這個簡短的部分獲取更多關於super用法:Using the Keyword super。它用一個簡單的例子解決了你所問的同一個問題。

請注意,如果你寫

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

沒有指定要呼叫super.print()twoprint()方法將無限期自稱,直到你有一個OutOfMemoryError

值得注意的是Vash提到his answer中的@Override註釋。

5

你有正確的想法。試試這個:

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

對不起,我不明白那個評論或在上面的代碼後添加的沒用的評論。 – duffymo

+0

對不起我的錯誤,提出了一個導致編譯器錯誤的錯字,並認爲我沒有徹底解釋它。謝謝... – aiuna

2

它是那麼容易,因爲調用超()方法

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()); 
} 
+0

你對錯了 –

0

的當你正在重寫print()方法有兩種類,你可以在 寫成System.out.println("GPA: " + gpa);

5

Java中的每個方法是虛擬的,這意味着你可以覆蓋每個可訪問的方法。通過可訪問的方法,我們可以採用修飾符public,protected或default的方法。

從Java 1.6開始,建議使用annotation @Override來標記已被覆蓋的方法。這有助於編譯器和開發人員預防潛在的錯誤。

因此,要覆蓋方法One#print()你只需要在子類添加方法相同signature

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

覆蓋時調用super不是必需的。

好的事情要記住的是要添加描述爲什麼要求重寫和方法調用超類邏輯的方法。

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

Two.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(); 
} 
} 

這會給你你想要的。

看到這個之後,你應該做的: (我)知道什麼是構造 (II)的訪問修飾符,訪問級別

+0

Anuj Balan: - 收集關於'super'的信息。 「首先掌握核心Java」是學習核心Java的最佳書籍。儘快閱讀。不要錯過它。 – AmitG

+0

您可以爲OP做到這一點。 –

+0

:-)如果你知道的話,可以忽略我的評論。 – AmitG