什么时候应该使私有成员成为静态的,在我的情况下这是如何被覆盖的
when should make private member to static,and how is this being override in my case
因为私有方法是隐式最终方法。
私有或静态或最终方法是早期绑定 意味着它们不能被覆盖。
但在我的代码中它实际上 运行 正确。
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 而不是 class。
它们是私有的,因此不能在 class 之外使用。例如 hugeCapacity()
中的方法 ArrayList
class.
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;
}
您的代码中没有覆盖。它只是两个 class 具有同名的单独方法,但没有任何关系,因为两者都不知道另一个方法的存在。
使用静态方法,以便调用它们时我们不必创建它所在的 class 的对象。如果我只希望 class 本身和子 classes 使用它,我将创建一个静态方法。
虽然我理解这可能看起来像 B
中的 privateMethod()
覆盖了 A
中的 privateMethod()
,但实际上并非如此。因为私有方法的可见性仅限于拥有者 class,所以您实际上创建了两个恰好具有相同名称和签名的独立方法。
当方法被覆盖时,您可以这样做:
public class B extends A{
/* ...snip... */
private void privateMethod() {
super.privateMethod();
System.out.println("B-privateMethod.");
}
}
然而,由于前面提到的可见性受限,这将无法编译。当这些方法不是私有的时,这会起作用并且会打印:
A-privateMethod.
B-privateMethod.
Since private methods are implicitly final and private, static and
final methods are early binding means they can't be overridden. But in
my code it is actually running properly.
私有方法不是隐式的 private
,而是显式的 private
。 static
和 final
方法是早期绑定,它们确实不能被覆盖。在您的情况下,您可能认为它们已被覆盖,但实际上并没有。例如,如何知道一个方法是否被覆盖?重写的方法允许您调用超级方法,使用 super().functionName()
但是,在您的情况下,如果您尝试这样做,它会给您一个编译时错误,这显然意味着您的方法没有被重写。您只是使用相同的签名,但实际上它们从未被覆盖。
Also I want to make sure what the benefit is of making a private
member static
您可能知道 static
成员不是对象的一部分,而是 class。另外,如果您的 class 中有 static
方法,并且它们需要访问不是 static
的成员,您会怎么做?您将必须创建 class 的对象并使用它,对吗?但是,如果是 private
和 static
,您可以在 class 的静态函数或块中使用它们。
希望,它清除了东西。
因为私有方法是隐式最终方法。
私有或静态或最终方法是早期绑定 意味着它们不能被覆盖。
但在我的代码中它实际上 运行 正确。
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 而不是 class。
它们是私有的,因此不能在 class 之外使用。例如 hugeCapacity()
中的方法 ArrayList
class.
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;
}
您的代码中没有覆盖。它只是两个 class 具有同名的单独方法,但没有任何关系,因为两者都不知道另一个方法的存在。
使用静态方法,以便调用它们时我们不必创建它所在的 class 的对象。如果我只希望 class 本身和子 classes 使用它,我将创建一个静态方法。
虽然我理解这可能看起来像 B
中的 privateMethod()
覆盖了 A
中的 privateMethod()
,但实际上并非如此。因为私有方法的可见性仅限于拥有者 class,所以您实际上创建了两个恰好具有相同名称和签名的独立方法。
当方法被覆盖时,您可以这样做:
public class B extends A{
/* ...snip... */
private void privateMethod() {
super.privateMethod();
System.out.println("B-privateMethod.");
}
}
然而,由于前面提到的可见性受限,这将无法编译。当这些方法不是私有的时,这会起作用并且会打印:
A-privateMethod.
B-privateMethod.
Since private methods are implicitly final and private, static and final methods are early binding means they can't be overridden. But in my code it is actually running properly.
私有方法不是隐式的 private
,而是显式的 private
。 static
和 final
方法是早期绑定,它们确实不能被覆盖。在您的情况下,您可能认为它们已被覆盖,但实际上并没有。例如,如何知道一个方法是否被覆盖?重写的方法允许您调用超级方法,使用 super().functionName()
但是,在您的情况下,如果您尝试这样做,它会给您一个编译时错误,这显然意味着您的方法没有被重写。您只是使用相同的签名,但实际上它们从未被覆盖。
Also I want to make sure what the benefit is of making a private member static
您可能知道 static
成员不是对象的一部分,而是 class。另外,如果您的 class 中有 static
方法,并且它们需要访问不是 static
的成员,您会怎么做?您将必须创建 class 的对象并使用它,对吗?但是,如果是 private
和 static
,您可以在 class 的静态函数或块中使用它们。
希望,它清除了东西。