什么时候应该让私有成员静态,以及在我的情况下如何覆盖它

时间:2015-04-17 12:13:43

标签: java access-modifiers

由于私有方法是隐式最终的。

私有或静态或最终方法是早期绑定意味着它们无法被覆盖。

但在我的代码中它实际上正常运行。

public class B extends A {
    public static void main(String[] args) {
        new B().privateMethod(); //no error -output B-privateMethod.
    }

    private void privateMethod() {
        System.out.println("B-privateMethod.");
    }
}

class A{
    private void privateMethod() {
        System.out.println("A-privateMethod.");
    }

    private static void privateStaticMethod() {
        System.out.println("privateStaticMethod.");
    }
}

此外,我想确保将私有成员设置为静态的好处,除了可以使用class-name.member,而不是类中的非静态成员。 它们是私人的,所以不能在课外使用。例如hugeCapacity()类中的ArrayList方法。

private static final int DEFAULT_CAPACITY = 10;

private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
} 

3 个答案:

答案 0 :(得分:6)

虽然我理解privateMethod() B中的privateMethod()可能会覆盖A中的public class B extends A{ /* ...snip... */ private void privateMethod() { super.privateMethod(); System.out.println("B-privateMethod."); } } ,但事实并非如此。因为私有方法的可见性仅限于拥有类,所以实际上创建了两个具有相同名称和签名的单独方法。

当覆盖该方法时,您可以这样做:

A-privateMethod.
B-privateMethod.

然而,由于上述限制的可见性,这将无法编译。如果这些方法不是私有的,那么这将起作用并打印出来:

{{1}}

答案 1 :(得分:2)

  

由于私有方法是隐式的最终和私有,静态和   最终方法是早期绑定意味着它们不能被覆盖。但在   我的代码实际上正常运行。

私有方法不是隐式private,而是明确privatestaticfinal方法是早期绑定,它们实际上不会被覆盖。在你的情况下,你可能认为它们被覆盖但实际上,它们不是。例如,如何知道方法是否被覆盖?重写方法允许您使用super().functionName()调用super方法但是,在您的情况下,如果您尝试这样做,它将给您一个编译时错误,这显然意味着您的方法不会被覆盖。您只是使用相同的签名,但实际上它们从未被覆盖。

  

此外,我想确保私有化的好处是什么   成员静态

您可能知道static成员不是对象的一部分而是类。另外,如果您的班级中有static个方法,并且他们需要访问不是static的成员,那么您会怎么做?你将不得不创建一个类的对象并使用它,对吧?但是,如果它是privatestatic,您可以在类的静态函数或块中使用它们。

希望,它清除了一切。

答案 2 :(得分:1)

您的代码没有覆盖它。它只是两个类具有相同名称的个别方法而没有任何关系,因为两者都不知道另一个的存在。

使用

静态方法,以便为了调用它们,我们不必创建它所驻留的类的对象。如果我只希望类本身和子类使用它,我将创建一个静态方法。