由于私有方法是隐式最终的。
私有或静态或最终方法是早期绑定意味着它们无法被覆盖。
但在我的代码中它实际上正常运行。
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;
}
答案 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
,而是明确private
。 static
和final
方法是早期绑定,它们实际上不会被覆盖。在你的情况下,你可能认为它们被覆盖但实际上,它们不是。例如,如何知道方法是否被覆盖?重写方法允许您使用super().functionName()
调用super方法但是,在您的情况下,如果您尝试这样做,它将给您一个编译时错误,这显然意味着您的方法不会被覆盖。您只是使用相同的签名,但实际上它们从未被覆盖。
此外,我想确保私有化的好处是什么 成员静态
您可能知道static
成员不是对象的一部分而是类。另外,如果您的班级中有static
个方法,并且他们需要访问不是static
的成员,那么您会怎么做?你将不得不创建一个类的对象并使用它,对吧?但是,如果它是private
和static
,您可以在类的静态函数或块中使用它们。
希望,它清除了一切。
答案 2 :(得分:1)
您的代码没有覆盖它。它只是两个类具有相同名称的个别方法而没有任何关系,因为两者都不知道另一个的存在。
使用静态方法,以便为了调用它们,我们不必创建它所驻留的类的对象。如果我只希望类本身和子类使用它,我将创建一个静态方法。