相关疑难解决方法(0)

Java:<init>和<clinit>有什么区别?

我无法理解以下文本......这是否意味着<clinit>对于空构造函数?为什么重要的是有两个不同的版本?

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html

2.9. Special Methods
Run Code Online (Sandbox Code Playgroud)

在Java虚拟机的级别上,每个构造函数(第2.12节)都显示为具有特殊名称的实例初始化方法<init>.该名称由编译器提供.因为名称<init>不是有效的标识符,所以它不能直接用在用Java编程语言编写的程序中.实例初始化方法可以仅通过invokespecial指令在Java虚拟机中调用,并且可以仅在未初始化的类实例上调用它们.实例初始化方法接受从其派生的构造函数的访问权限(第2.7.4节).

类或接口最多只有一个类或接口初始化方法,并通过调用该方法进行初始化(第2.17.4节).类或接口的初始化方法是静态的,不带参数.它有特殊的名字<clinit>.该名称由编译器提供.因为名称<clinit>不是有效的标识符,所以它不能直接用在用Java编程语言编写的程序中.Java虚拟机隐式调用类和接口初始化方法; 它们永远不会直接从任何Java虚拟机inw2struction中调用,但只能作为类初始化过程的一部分间接调用.

java jvm

87
推荐指数
3
解决办法
3万
查看次数

为什么最终的静态变量不能在实例块中赋值?

class Test {
    static final String name;

    {    
        name = "User"; 
        /* shows error. As i have to assign User as default value */
    }
    final String name1;

    {
       name1 = "User"; // This works but why the above one does not works
    }
}    
Run Code Online (Sandbox Code Playgroud)

我能够使用静态块分配值,但不能通过实例阻止为什么?

java

3
推荐指数
1
解决办法
777
查看次数

这两种方法在java中调用静态变量的区别

如果我有这个示例代码:

public class Test{

static String myVariable = "hi";

public Test(){
    System.out.println(myVariable);
    System.out.println(Test.myVariable);
}

public static void main(String[] args) throws SQLException{
        new Test();
    }

}
Run Code Online (Sandbox Code Playgroud)

现在两者都会打印"hi",但我想知道它们的区别是什么,何时我应该使用另一个,或者我应该总是只使用其中一个,因为它是常态.

对于这个非常基本的例子我很抱歉,但是当我让系统工作时,我并没有真正理解两者之间的区别

java

0
推荐指数
1
解决办法
94
查看次数

标签 统计

java ×3

jvm ×1