我理解这段代码:
class Foo {
public static void method() {
System.out.println("in Foo");
}
}
class Bar extends Foo {
public static void method() {
System.out.println("in Bar");
}
}
..静态方法Bar
“隐藏”了声明的静态方法Foo
,而不是在多态性意义上覆盖它。
class Test {
public static void main(String[] args) {
Foo.method();
Bar.method();
}
}
…将输出:
在Foo
中
重新定义method()
为final
in Foo
将禁用Bar
隐藏它的功能,并且重新运行main()
将输出:
在Foo
中
( 编辑 :将方法标记为时,编译失败final
,并且仅在我删除后再次运行Bar.method()
)
final
如果将静态方法声明为,是否会阻止子类有意或无意地重新定义该方法,这是否被视为不好的做法?
(这很好地说明了使用行为final
是..)
我认为将static
方法标记为并不是不好的做法final
。
如您所知,final
将防止该方法被子类隐藏, 这是一个好消息 。
我对您的发言感到非常惊讶:
在Foo中最后重新定义method()将禁用Bar隐藏它的功能,并且重新运行main()将输出:
在Foo
中
不可以,将方法标记为final
in Foo
将阻止Bar
编译。至少在Eclipse中,我得到了:
线程“主”中的异常java.lang.Error:未解决的编译问题:无法从Foo覆盖最终方法
此外,我认为人们应该始终调用static
使用类名来限定他们的方法,即使在类本身内部也是如此:
class Foo
{
private static final void foo()
{
System.out.println("hollywood!");
}
public Foo()
{
foo(); // both compile
Foo.foo(); // but I prefer this one
}
}
问题内容: 在方法内部声明局部内部类时,为什么包含最终的静态String或int是合法的,而包含其他对象却不合法? 例如: 编译时,得到以下信息: 为什么要区分?是因为String是不可变的吗?如果是这样,Integer.valueOf()也无效吗? 问题答案: 这是因为前两个静态成员分配给原始类型或String类型的编译时常量。 根据Java语言规范的第8.1.3节: 8.1.3。内部类和封闭实
问题内容: 我有一个快速的问题。在静态关键字声明之后立即开始的代码块,那是什么类型的方法?我从未见过。如果有人能启发我,将不胜感激。谢谢。 问题答案: 这不是方法,而是类的静态Initializer块。您可以在Java Language Specification中 阅读有关它的更多信息。 加载该类后,其中的代码将执行一次。
我最近在Eclipse中查看了我的警告,发现了这样一个警告: 如果方法可以声明为静态,它将给出编译器警告。 [编辑]Eclipse帮助中的确切引用,强调私有和最终: 如果启用,编译器将为私有或最终的方法以及仅引用静态成员的方法发出错误或警告。 是的。我知道我可以关掉它,但我想知道打开它的原因? 为什么将所有可能的方法声明为静态方法是一件好事呢? 这会给性能带来什么好处吗?(在移动域中) 指出一个方
问题内容: 如果该方法可以声明为静态方法,则会向编译器发出警告。 [edit] Eclipse帮助中的确切引号,重点是私有和最终的: 启用后,编译器将为私有或最终方法(仅引用静态成员)发出错误或警告。 是的,我知道我可以将其关闭,但是我想知道打开它的原因吗? 为什么将每个方法都声明为静态是一件好事? 这会给性能带来任何好处吗?(在移动域中) 指出一种方法是静态的,我想表明您不使用任何实例变量,因此
问题内容: Java编译器警告: 为什么?如何解决? 问题答案: 这在这里很好解释: serialVersionUID是Serializable类的通用版本标识符。 反序列化使用此数字来确保已加载的类与序列化的对象完全对应。如果找不到匹配项,则抛出InvalidClassException。 您通过添加来修复错误 上课。 进一步阅读: java.io.Serializable 旁注: 如果您使用的
问题内容: 我最近发现了如何通过此方法在python中动态创建变量: 从而创建变量。 我的问题是,这是个好主意吗?还是应该总是提前声明变量? 问题答案: 我认为最好使用字典: 我认为这更像Python。