ope*_*sas 23 java inheritance static super
是否可以从子静态方法调用超静态方法?
我的意思是,以通用的方式,到目前为止,我有以下内容:
public class BaseController extends Controller {
static void init() {
//init stuff
}
}
public class ChildController extends BaseController {
static void init() {
BaseController.loadState();
// more init stuff
}
}
Run Code Online (Sandbox Code Playgroud)
并且它有效,但我想以通用方式执行它,比如调用super.loadState(),这似乎不起作用......
sgo*_*les 17
在Java中,不能覆盖静态方法.原因在这里得到了解释
因此,它不依赖于它被引用的对象.但相反,它取决于参考的类型.因此,静态方法被称为隐藏另一个静态方法而不是覆盖它.
例如(Cat是Animal的子类):
public class Animal {
public static void hide() {
System.out.format("The hide method in Animal.%n");
}
public void override() {
System.out.format("The override method in Animal.%n");
}
}
public class Cat extends Animal {
public static void hide() {
System.out.format("The hide method in Cat.%n");
}
public void override() {
System.out.format("The override method in Cat.%n");
}
}
Run Code Online (Sandbox Code Playgroud)
主要课程:
public static void main(String[] args) {
Cat myCat = new Cat();
System.out.println("Create a Cat instance ...");
myCat.hide();
Cat.hide();
myCat.override();
Animal myAnimal = myCat;
System.out.println("\nCast the Cat instance to Animal...");
Animal.hide();
myAnimal.override();
Animal myAnimal1 = new Animal();
System.out.println("\nCreate an Animal instance....");
Animal.hide();
myAnimal.override();
}
Run Code Online (Sandbox Code Playgroud)
现在,输出将如下所示
Create a Cat instance ...
The hide method in Cat.
The hide method in Cat.
The override method in Cat.
Cast the Cat instance to Animal...
The hide method in Animal.
The override method in Cat.
Create an Animal instance....
The hide method in Animal.
The override method in Animal.
Run Code Online (Sandbox Code Playgroud)
因为class methods,运行时系统调用在调用方法的引用的编译时类型中定义的方法.
换句话说,对静态方法的调用是在编译时映射的,并且取决于引用的声明类型(在本例中为Parent),而不是运行时引用指向的实例.在示例中,编译时类型myAnimal为Animal.因此,运行时系统调用中定义的hide方法Animal.
这里是 静态的继承在Java中.改编尼基塔的例子:
class A {
static void test() {
System.out.print("A");
}
}
class B extends A {
}
class C extends B {
static void test() {
System.out.print("C");
B.test();
}
public static void main(String[] ignored) {
C.test();
}
}
Run Code Online (Sandbox Code Playgroud)
这当然编译,并调用C打印"CA",当然.现在我们将B类更改为:
class B extends A {
static void test() {
System.out.print("B");
}
}
Run Code Online (Sandbox Code Playgroud)
并重新编译B(不是C).现在再次调用C,它将打印"CB".
super但是静态方法没有like关键字 - 一个(坏)理由可能是"超类的名称是在这个类的声明中写的,所以你不得不重新编译你的类来改变它,所以你可以这里也改变静态调用."