Java 继承中的静态方法
输出: 你好Java 继承中的静态方法,java,inheritance,static-methods,Java,Inheritance,Static Methods,输出: 你好 类A的静态方法是如何被调用的。我能理解调用B的静态方法,但不能理解A的静态方法,因为B继承A,B必须在执行main()时加载A。这将激活get()函数,因为它位于静态块中。因为B继承A,B必须在执行main()时加载A。这将激活get()函数,因为它位于静态块中。因为B从A扩展,如果加载B类,则必须加载A类,如果加载,则必须调用其静态初始值设定项块。因为B从A扩展,如果加载B类,则必须加载A类,如果它被加载,则必须调用它的静态初始值设定项块。在继承类中,加载是从上到下进行的,即从父
类
A
的静态方法是如何被调用的。我能理解调用B
的静态方法,但不能理解A的静态方法,因为B
继承A
,B
必须在执行main()
时加载A
。这将激活get()
函数,因为它位于静态块中。因为B
继承A
,B
必须在执行main()
时加载A
。这将激活get()
函数,因为它位于静态块中。因为B从A扩展,如果加载B类,则必须加载A类,如果加载,则必须调用其静态初始值设定项块。因为B从A扩展,如果加载B类,则必须加载A类,如果它被加载,则必须调用它的静态初始值设定项块。在继承类中,加载是从上到下进行的,即从父级到子级。
它首先加载案例A
中的父类,然后加载案例B
中的子类。当类加载其静态块时,首先调用它,这就是为什么它在继承类加载中从上到下(即从父到子)进行打印的原因。
它首先加载案例A
中的父类,然后加载案例B
中的子类。当类加载它的静态块时,首先被调用,这就是为什么它在编译期间打印HELLO
,编译器知道B依赖于A。它将相同的数据传递给JVM。在类B的加载阶段,JVM读取编译器发送的元数据,发现B
依赖于A
,因此加载A
(并运行静态初始化程序),然后继续加载B
,然后初始化B
如果我们有两个类Sample
和testextends Sample
,Test
的类常量池(字节码的一部分)将有:
class A
{
static{
get();
}
static void get(){
System.out.println("HELLO");
}
}
class B extends A
{
public static void main(String[] args) {
}
}
在编译过程中,编译器知道B依赖于A。它将相同的数据传递给JVM。在类B的加载阶段,JVM读取编译器发送的元数据,发现B
依赖于A
,因此加载A
(并运行静态初始化程序),然后继续加载B
,然后初始化B
如果我们有两个类Sample
和testextends Sample
,Test
的类常量池(字节码的一部分)将有:
class A
{
static{
get();
}
static void get(){
System.out.println("HELLO");
}
}
class B extends A
{
public static void main(String[] args) {
}
}
要执行类B的主方法,必须加载类B
类B扩展了类A,所以要加载B,必须加载类A
加载类A时,调用其静态初始值设定项,调用get()方法并打印“HELLO”。要执行类B的主方法,必须加载类B
类B扩展了类A,所以要加载B,必须加载类A
加载类A时,将调用其静态初始值设定项,调用get()方法并打印“HELLO”。所有静态块都在类加载时执行。。。重复问题所有静态块都在类加载时执行。。。重复问题静态块在类加载时执行类似问题[在此处输入链接说明][1][1]:静态块在类加载时执行类似问题[在此处输入链接说明][1][1]:因此,如果我也在类B中编写静态方法,那么将首先执行哪一个?首先实例化A,然后实例化B.?@Chaitanya-这取决于所使用的引用。静态方法不能被重写,若我想首先调用派生类的静态方法,该怎么办。?也许这是一个不合逻辑的问题,但有可能吗?@Chaitanya-第一和第二在这里并不重要。若你们有一个派生类的引用,你们可以随时调用它。若我在类B中写了一个静态方法,那个么哪一个将首先执行?首先实例化A,然后实例化B.?@Chaitanya-这取决于所使用的引用。静态方法不能被重写,若我想首先调用派生类的静态方法,该怎么办。?也许这是一个不合逻辑的问题,但有可能吗?@Chaitanya-第一和第二在这里并不重要。如果有派生类的引用,可以随时调用它
java -verbose:class Test | grep 'Sample'
[Loaded Sample from file:/Users/XXXX/Workspaces/SampleTest/Sample/bin/] <== Sample loaded first because test depends on Sample.
[Loaded Test from file:/Users/XXXX/Workspaces/SampleTest/Sample/bin/]