如何在私有属性中调用公共方法?

时间:2013-05-30 03:15:11

标签: java

我是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 私有属性。

我该怎么做?

3 个答案:

答案 0 :(得分:8)

由于HairStateHuman是私有的,Human类之外的任何内容都无法了解它。

您可以在Human中创建一个方法,将调用转发给其私有机制:

public class Human {
    . . .

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

然后从main()

调用它
System.out.println(human1.cutHair());

答案 1 :(得分:1)

之前评论的另外两个解决方案:

  • 您可以实现一个返回hairTooLong属性的getter。
  • 您可以通过反射API调用cut()方法(但如果您是初学者,则不想去那里)。

建议先前评论中的解决方案,或此处提供的第一个选项。

如果您感到好奇,可以查看反思API并在此处查看示例:How do I invoke a Java method when given the method name as a string?

答案 2 :(得分:1)

在java中有四个访问级别,默认,私有,公共和受保护。 private的可见性仅限于某一类(即使是子类也无法访问)。您不能在任何其他类中调用私有成员。以下是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