这个对象是如何创建的?

时间:2011-09-23 06:57:58

标签: 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 main(String[] args){

    A a = new A();  //line #2
    }
    }

在这里你看,我正在尝试在第2行和它的构造函数中创建一个超类的对象,如何在没有实例的情况下调用它的方法。这里发生了什么,是 A 实例的Constructer在这里被调用。

6 个答案:

答案 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类专用的。据我所知,要从同一类范围内的类调用方法,不需要实例。