2015-07-03 69 views
2

假設抽象超類包含一個名爲price類型爲double的私有變量。使用重寫抽象方法從超類訪問私有變量

現在假設變量已被聲明但未初始化。超類包含訪問方法,但是setter方法是抽象的,因此它必須在子類中重寫,但是,由於超級變量是私有的,有沒有辦法從子類初始化這個變量?

考慮下面的例子:我有4個類; Book(抽象超級),NonFiction(子),Fiction(子),Tester(類來測試會發生什麼)。

Book類:

public abstract class Book { 

private String title; 
private double price; 

Book(String name){ 
    title = name; 
} 

public String getTitle(){ 
    return title; 
} 

public double getPrice(){ 
    return price; 
} 

public abstract void setPrice(double cost); 
} 

的小說類

public class Fiction extends Book{ 

Fiction(){ 
    super("Harry-Potter"); 
    setPrice(24.99); 
} 

@Override 
public void setPrice(double cost) { 
} 
} 

非小說類類

公共類非小說類作品延伸預訂{

NonFiction(){ 
    super("Head-first Java"); 
    setPrice(37.99); 
} 

public void setPrice(double cost) { 
} 
} 

測試機柯樂小號

public class Challenge { 
public static void main(String[] args){ 


Fiction fictionBook = new Fiction(); 
NonFiction NonFictionBook = new NonFiction(); 

Book[] theList = new Book[2]; 
theList[1] = NonFictionBook; 
theList[0] = fictionBook; 

System.out.println("Title of fiction book: \n"+theList[0].getTitle()); 
System.out.println("Title of non fiction book \n"+theList[1].getTitle()); 
System.out.println("Title - "+theList[0].getTitle()+" -" + theList[0].getPrice()); 
System.out.println("Title - "+theList[1].getTitle()+" -" + theList[1].getPrice()); 
} 

} 

預期的輸出應該是:

小說書名: 哈利波特 標題非小說類文學作品的: 頭第一個Java 標題,哈利·波特的成本 - $ 24.99 標題,頭 - 第一個Java成本 - $ 37.99

有沒有辦法訪問私有變量而不需要將範圍更改爲受保護的?

回答

2

使變量私人化的目的是防止課堂以外的任何內容訪問或改變它。如果該類的開發人員希望它可以被子類查看或更改,它將被保護。但是,可以使用反射更改值(只要安全管理器未配置爲禁止該值)。見How do I read a private field in Java?

(順便說一句,只是雞蛋裏挑骨頭,如果你不初始化一個實例變量,它會爲它設置一個默認值,price將被設置爲0.0D,如果你不給它分配的初始值。留下實例或未初始化的類變量不是一個真正的選項。)

+0

哦,是的,就像字符串如何默認初始化爲null。 另外,如果其中一個訪問器方法是抽象的,並且封裝變量是私有的,那麼訪問器基本不工作? – RamanSB

+0

@Ramandeep:是的,任何引用類型都被初始化爲null。 –

+0

@Ramandeep:子類無法在超類中看到私有變量。 –

相關問題