Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 继承中的静态方法_Java_Inheritance_Static Methods - Fatal编程技术网

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/]