2011-04-17 73 views
2

我已經和PHP一起工作了6年,並獲得了認證,但最近我決定學習Java,因爲我在Zend框架中工作很多,這是受Java的啓發,但現在我有可能是Java的一個愚蠢問題。將PHP轉換爲Java

在PHP中我會做到這一點:

class Cool 
{ 
    protected $_name; 

    function __construct($name) 
    { 
     $this->_name = $name; 
    } 

    function showName() 
    { 
     echo "{$this->_name} is a cool guy"; 
    } 
} 

class Bad extends Cool 
{ 
    function showName() 
    { 
     echo "{$this->_name} is a bad guy"; 
    } 
} 

$bad = new Bad("jhon"); 
// prints jhon is a bad guy 

由於Java不繼承構造函數,你會是做這樣的事情在Java中的最佳方式是什麼?我需要考慮一種不同類型的模式來解決這類問題嗎?

我很感激這個幫助,因爲我對Java真的很陌生,因爲我非常喜歡使用這種類型的東西,所以我想知道是否有很酷的Java方法。我需要在我分配的新項目中使用它。

回答

3

在Java中,您必須爲每個類編寫構造函數,並調用super()以使用父類的構造函數。如果你不想改變構造函數,你需要在子類構造函數中完成的操作是調用super()

在這種情況下,Bad應該是這樣的:

public class Bad extends Cool { 
    public Bad(String name) { 
     super(name); 
    } 
    // Any other additions 
} 
0

你是在構造正確的是不能繼承的,你需要做的:

public class Bad extends Cool { 
public bClass(String name) { 
    super(name); 
} 
} 

這將調用超類的構造函數,這將是父母的構造函數。

1

構造函數不是直接作爲子類的成員繼承,但是任何非私有構造函數都可以通過子類中相應的super調用進行訪問,這同樣適用。如果您不想修改超類構造函數的任何行爲,只需向您的子類中添加一個版本,該版本使用相同的參數並調用super版本。

所以你可以用Java編寫上面的代碼爲:

public class Cool { 
    protected String name; 

    public Cool(String name){ 
     this.name = name; 
    } 

    public void showName() { 
     System.out.println(this.name + " is a cool guy"); 
    } 
} 

public class Bad extends Cool { 
    public Bad(String name){ 
     super(name); 
    } 

    @Override 
    public void showName() { 
     System.out.println(this.name + " is a bad guy"); 
    } 
} 

Cool bad = new Bad("jhon"); 
bad.showName(); // prints jhon is a bad guy