许多文章都说只有在调用类的构造函数之后才会创建对象。但我找到了这个片段,它运行正常。
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行和它的构造函数中创建一个超类的对象,如何在没有实例的情况下调用它的方法。这里发生了什么,是 A 实例的Constructer在这里被调用。
答案 0 :(得分:4)
在创建对象时始终会调用构造函数。即使您没有显式定义构造函数,编译器也会为您生成一个空体。
您可以从构造函数中调用该类的其他方法。所有非静态方法都将隐式(编译器生成的)参数传递给实际的类实例this
。但是,重要的是要知道在执行构造函数时,对象尚未完全创建,尽管所讨论的类的所有数据成员(如果存在)已经初始化,至少一些默认值。因此,你
this
(即将其传递给其他对象/线程),并且final
,非private
方法。执行其中任何一个(在非final
类中)意味着您可以访问尚未完全构造的对象,这可能会导致稍后很难找到错误。例如。如果有问题的虚方法在子类中被重写,并且实现依赖于仅在子类构造函数中定义和初始化的某个成员,则该方法在子类成员被正确初始化之前被称为,因此它赢得了'具有你期望的价值。
答案 1 :(得分:1)
因为public static void main
是程序的入口点。因此,您不需要创建类B的实例。
main()方法的方法签名包含三个修饰符:
* 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.
了解详情:Understanding public static void main function
因此,当程序执行时调用A的构造函数并调用超类A的foo方法。
答案 2 :(得分:1)
没有实例就不会调用它。
你在this
上调用它 - 这是一个实例。
答案 3 :(得分:1)
A的构造函数被调用,因为你直接调用了它。但是,如果您希望调用A到B,在Main [在没有包含类B的当前实例的情况下调用(1因为它的静态,以及2.它为应用程序的开头保留)],您只需更改“new A()”to“new B()”
由于您使用的是没有参数的构造函数,因此在编译时自动生成一个默认构造函数。
答案 4 :(得分:1)
main()
是否是入口点不是解释。原因是main()
是static
,因此不需要其类的实例。
此程序未创建任何B实例。
答案 5 :(得分:0)
A类是公共的,它由B类继承.B类可以使用
实例化A类A object=new A()
并且对象初始化由自动定义的Constructor方法完成。 A的构造函数又调用方法foo(),它是A类专用的。据我所知,要从同一类范围内的类调用方法,不需要实例。