我一直不明白为什么我们能够从其他类调用一个类的构造函数。构造函数是一种方法,通常当试图从类中调用方法时,我们必须要么使该方法静态,这样我们就可以以
MyClass.method();
MyClass myClass = new MyClass();
myClass.method();
但是在构造函数的情况下,我们两者都不做。Java如何调用类的构造函数而不执行这些方法中的任何一个?我知道一个类的构造函数必须对你调用它的类可见,也就是说,如果你调用的类构造函数在不同的包中,你必须导入那个包。
那么,Java如何处理调用构造函数,而不必使用上述方法就可以调用它们呢?
类构造函数在Java语言和Java字节码中有特殊的支持,超出了普通方法的支持范围。特别是,他们得到了特殊的名字
引用JVM(JVM规范)第3.8节:
Java虚拟机类实例是使用Java虚拟机的新指令创建的。回想一下,在Java虚拟机级别,构造函数以编译器提供的名称作为方法出现
Object create() {
return new Object();
}
汇编至:
Method java.lang.Object create()
0 new #1 // Class java.lang.Object
3 dup
4 invokespecial #4 // Method java.lang.Object.<init>()V
7 areturn
如您所见,用于生成此示例的引用编译器首先创建相关对象的未初始化实例,将其与任何构造函数参数(未显示)一起推送到堆栈上,并使用
invokespecial
调用相应的构造函数来初始化对象。在语言级别,Java不允许您编写在调用构造函数之前公开完全未初始化的对象的代码,尽管您仍然可以泄漏部分构造的对象。
值得注意的是,有不安全的方法(字面意思是在一个名为“不安全”的隐藏类中)来获取对一个对象的引用,该对象在低级别初始化,但其构造函数从未被调用。这些代码在某种程度上突破了Java语言规范,只有在绝对需要的情况下才能非常小心地使用。
我想在构造函数中访问多个位置的状态值。当我在构造函数中输入console.log(this)时,我可以看到可以访问特定的值,但是当我输入console.log this.state时,我没有定义。 这就是我想象的工作方式(我想访问CSSValue中的状态): 但是,当我运行此代码: 然后我在控制台中得到这个: 但是当我将console.logconsole.log(this.state)它打印未定
我用以下方法加载一个FXML文件 上面的代码运行正常,现在我想访问在控制器类的构造函数中,但它给出了一个错误:线程“JavaFX应用程序线程”java中的异常。lang.NullPointerException。 注意:我已经为文本字段分配了一些默认值,这就是为什么我想访问它们。 下面是我的控制器类 Controller.java 如有任何建议,将不胜感激。谢谢:)
我正在编写一个 AST 转换,旨在通过使引用端的 setter 也调用拥有端的 setter 来保持双向 JPA 关系的同步。这在调用 时可靠地工作,但是在构造函数中初始化的变量(由于声明中的初始值设定项语句、构造函数中变量或构造函数参数)将不会链接。 为了处理这种情况,我可以打开所有现有的构造函数(以及任何隐式默认构造函数)并添加必要的代码。但是,添加构造函数的一些常见 AST 转换(如 )在阶
问题内容: 抽象类只能用作由其他类扩展的基类,对吗?抽象类的构造函数可以具有常用的访问修饰符(公共,保护和私有(供内部使用))。其中和是使用正确的访问修饰符,因为抽象类型似乎表明技术上的公共构造将起到非常保护?我应该在所有构造函数上使用protected吗? 问题答案: 因为抽象类型似乎表明从技术上讲,公共构造函数将在很大程度上受到保护 这是不正确的。抽象类不能通过调用其构造函数直接实例化,但是,
本文向大家介绍详解C++中如何将构造函数或析构函数的访问权限定为private,包括了详解C++中如何将构造函数或析构函数的访问权限定为private的使用技巧和注意事项,需要的朋友参考一下 今天面试被问到了这个单例模式常用到的技术手段,下面进行分析: 很多情况下要求当前的程序中只有一个object。例如一个程序只有一个和数据库的连接,只有一个鼠标的object。通常我们都将构造函
问题内容: 谁能解释一个 明确的无参数构造函数 (和其他构造函数)的默认访问修饰符是什么? 问题答案: 构造函数在这方面与方法相同-如果您未提供显式的public,private或protected,则构造函数将获得默认的“ package private”可见性。可以从同一类或同一包中的任何其他类中调用它,但不能从不同包中的子类中调用(因此,如果一个类仅具有包可见的构造函数,则任何子类都必须位于