class B extends A {
static public void printMe(){
System.out.println("in static B");
}
}
class A{
static public void printMe(){
System.out.println("In static A");
}
}
public static void main(String[] args) {
A a = new B();
a.printMe();
}
为什么输出是"静态A"?
静态成员或方法属于类级别,而不是特定的实例。
即使创建多个实例或不创建实例,静态类也只有一个实例。
在您的例子中,因为您已经创建了类A的实例,所以实现了类A中的方法。
另一种获得问题场景的清晰简洁的方法是尝试运行下面提到的代码:
public static void main(String[] args) {
A.printMe();
}
你会明白的。
静态成员绑定到类型而不是实现的类型。因此,您可以看到从类A执行的方法。
静态成员不能被覆盖,无论实例状态如何,它们都共享相同的副本。
如果您需要方法被ovveriden,不要将它们用作静态成员。
我试图理解重载和重写静态和非静态方法是如何工作的。事实上,我试图理解这些方法如何能够和不能出现在父类和子类中。我想出了下面的规则: 我们不能重写静态方法,只能隐藏它们。通过隐藏,我们的意思是在编译时根据引用变量类型决定执行哪个方法,而不是重写(,在运行时根据实例类型选择哪个方法执行)。 例如,让,然后隐藏. 我们可以重写实例方法。 例如重写. 两个或多个具有相同签名的方法不能以静态或非静态组合形式
问题内容: 到处都写着静态方法不能被覆盖,但是当我尝试将访问说明符从public改为protected时,它给出了一个错误。例如 它说 无法降低继承方法的可见性 所以说这是遵循最重要的规则,为什么我们说foo在B类中没有被忽略?为什么我们说它是隐藏/阴影而不是覆盖? 问题答案: 它 遵循 与覆盖 相同 的 一些规则 ,但这并不意味着它 被 覆盖。在这种情况下,这就是JLS的8.4.8.3节 “覆盖
我不明白为什么当我尝试编译这段代码时,编译器会显示错误: 在A和B类中,两种方法之间的区别在于返回类型,我读到Java阻止重写静态方法。所以我希望编译器不会显示任何错误,因为最初没有任何重写!!
我想知道: 为什么在Java中不能重写静态方法? 静态方法可以在Java中重载吗?
输出为"A的静态方法"。因此静态方法不会被重写,否则输出将是“静态方法B”。JVM如何在运行时决定调用类A而不是B的静态方法。
我试图实现的是重写此方法: 公共布尔onKeyPreIme(int-keyCode,KeyEvent事件) 该方法位于SearchView中。搜索自动完成类http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.0_r1/android/support/v7/widget/Se