Java 这个对象是如何创建的?
许多文章说,只有在调用类的构造函数之后才能创建对象。但是我找到了这个片段,它工作得很好Java 这个对象是如何创建的?,java,oop,Java,Oop,许多文章说,只有在调用类的构造函数之后才能创建对象。但是我找到了这个片段,它工作得很好 public class A { public A(){ this.foo();//line #1 } private void foo() { System.out.print("without an instance..!!!!"); } } class B extends A { public static void mai
public class A {
public A(){
this.foo();//line #1
}
private void foo() {
System.out.print("without an instance..!!!!");
}
}
class B extends A
{
public static void main(String[] args){
A a = new A(); //line #2
}
}
你看,我试图在第2行创建它的超类的对象,在它的构造函数中,它的方法是如何在没有实例的情况下被调用的。这里发生的事情是,一个实例的构造函数在这里被调用 因为publicstaticvoidmain是程序的入口点。所以您不需要创建类B的实例
主方法的方法签名包含三个修饰符:
* public indicates that the main() method can be called by any object.
* static indicates that the main() method is a class method.
* void indicates that the main() method has no return value.
阅读更多:
因此,当程序执行时,会调用A的构造函数,并且它会调用超类A的foo方法。没有实例时不会调用它。 您可以在此调用它-这是一个实例。在创建对象时总是调用构造函数。即使您没有显式定义构造函数,编译器也会为您生成一个具有空主体的构造函数 您可以从构造函数中调用该类的其他方法。所有非静态方法都会得到一个隐式编译器生成的参数,这个参数是实际的类实例。但是,重要的是要知道,在执行构造函数时,对象尚未完全创建,尽管相关类的所有数据成员(如果有)都已初始化,至少已初始化为某个默认值。因为这个,你 在退出构造函数调用之前,不应发布此消息,即将其传递给其他对象/线程,以及 您不应该从构造函数中调用非最终的、非私有的方法。
在非final类中执行这两种操作都意味着您可以访问尚未完全构造的对象,这可能会导致以后出现微妙的、难以发现的错误。例如,如果所讨论的虚拟方法在子类中被重写,并且实现依赖于仅在子类构造函数中定义和初始化的某个成员,则在正确初始化子类成员之前调用该方法,因此,它不会具有您期望的值。将调用的构造函数是因为您直接调用了它。但是,如果您希望在Main中通过B调用A[在没有包含类b1的当前实例的情况下调用它,因为它是静态的,而2.它是为应用程序的开始保留的]您只需将新的A更改为新的B 由于使用的构造函数没有参数,因此在编译时会自动生成中的默认构造函数 main是否是入口点不是解释。原因是main是静态的,因此不需要其类的实例
此程序从未创建过B的实例。类A是公共的,它由类B继承。类B可以实例化类A,并使用
A object=new A()
对象初始化由自动定义的构造函数方法完成。一个类的构造函数反过来调用方法foo,这是类A的私有方法。据我所知,要从同一类作用域中的类调用方法,不需要实例。每当调用构造函数时,总会有一个实例。这个@霍华德。。这就是我想问很多次的问题。你的意思是说我们调用的每个构造函数都运行在其各自类型的实例上,在这种情况下,构造函数将始终运行在实例化类的实例上,该实例也可能是一个子类。由于main是一个静态函数,它不需要类B的实例。我的问题是,是谁在构造函数被执行之前创建的。要从同一类作用域中的类调用方法,不需要实例。这条线不对。。