2013-05-30 113 views
0

我是Java新手。所以這個問題可能看起來很天真......但你能幫忙嗎?如何在私有屬性中調用公共方法?

比方說,我有一個類如下:

public class Human { 

    private float height; 
    private float weight; 
    private float hairLength; 

    private HairState hairTooLong = new HairState() { 

     @Override 
     public void cut(Human paramHuman) {   
      Human.this.decreaseHairLength(); 
     } 

     @Override 
     public void notCut(Human paramHuman) { 
      Human.this.increaseHairLength(); 
     } 
    }; 

    public float increaseHairLength() { 
     hairLength += 10; 
    } 

    public float decreaseHairLength() { 
     hairLength -= 10; 
    } 

    private static abstract interface HairState { 

     public abstract void cut(Human paramHuman); 
     public abstract void notCut(Human paramHuman); 
    }  
} 

然後,我有另一個類如下:

public class Demo { 
    public static void main(String[] args) {  
     Human human1 = new Huamn(); 
     Human.HairState.cut(human1); 
    } 
} 

聲明

Human.HairState.cut(human1); 

無效.. 。

我打算打電話大衆cut()函數,它屬於hairTooLong私有屬性。

我應該怎麼做?

+0

你不能。它只能從'Human'內調用... – MadProgrammer

回答

8

由於HairState對於Human是私有的,因此Human類別之外的任何內容都不可能知道它。

您可以創建在Human的方法是中繼調用它的私有機制:

public class Human { 
    . . . 

    public float cutHair() { 
     return hairTooLong.cut(this); 
    } 
} 

,然後調用從main()

其他
System.out.println(human1.cutHair()); 
+0

我已經糾正了無效故障。請參閱修改後的代碼。 –

+0

@perfectionming - 我相應地修改了我的代碼。 –

1

兩個解決方案之前的評論:

  • 你可以實現一個返回hairTooLo的getter ng屬性。
  • 您可以通過反射API調用cut()方法(但如果您是初學者則不想去那裏)。

會建議以前的評論中的解決方案,或者這裏介紹的第一個選項。

如果你好奇,你可以看看到反射API和這裏的例子:How do I invoke a Java method when given the method name as a string?

1

在java中有四種訪問級別,默認情況下,私有,公共和保護。私有的可見性僅限於某個類(甚至子類無法訪問)。你不能在任何其他班級打電話給私人成員。這裏是java訪問級別的基本細節。

    Access Levels 
Modifier Class Package Subclass World 
public  Y  Y  Y  Y 
protected  Y  Y  Y  N 
no modifier Y  Y  N  N 
private  Y  N  N  N 

有關詳情,請Oracle docs

相關問題