Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候用java创建对象_Java_Overriding - Fatal编程技术网

什么时候用java创建对象

什么时候用java创建对象,java,overriding,Java,Overriding,给出以下代码段: class SuperClass { SuperClass () { foo(); } public void foo() { System.out.println("In SuperClass foo"); } } public class SubClass extends SuperClass { private String str; SubClass() { str =

给出以下代码段:

class SuperClass {
    SuperClass () {
        foo();
    }

    public void foo() {
        System.out.println("In SuperClass foo");
    }
}

public class SubClass extends SuperClass {
    private String str;
    SubClass() {
        str = "SubClass";
    }

    public void foo () {
        System.out.println("In SubClass foo value " + str.toLowerCase());
    }

    public static void main(String[] args) {
        SuperClass ref = new SubClass();
        ref.foo();
    }
}
这段代码抛出NPE,因为在调用foo()的超类构造函数中,它实际上调用子类foo()并抛出NPE。我想了解在这里创建子类对象的确切时间,因为我们仍在初始化子类构造函数中的成员变量,那么为什么在这里发生重写?

As Link:

在Java中,在派生类构造函数中自动调用没有参数的基类构造函数。


创建ref时,其地址为:SubClass@c2e1f26 . 它是子类。 所以当在超类()构造中调用foo时,它会在子类中搜索foo()并执行它。

更新后续问题
-我们应该记住,超类()构造函数是调用第一个子类()构造函数。所以当属性str不初始化时

it will first call the subclass constructor then subclass to the superclass and then superclass to the object and the execution returns to the superclass then it will start printing.
the first statement will print
在超类foo中

在子类foo value子类中


初始化
子类
时,首先调用
超类
构造函数。超类(更一般)需要在子类(更具体)之前构造。有道理,对吧

现在,在超类的构造函数中,调用了
foo
。猜猜调用哪个
foo
?子类的
foo
!这是因为您正在创建一个
子类
对象,因此您调用的每个实例方法都将调用子类的实现,这是由于

因此,调用子类的
foo
,并尝试打印
str.toLowerCase()
。请注意,由于尚未调用子类的构造函数,
str
未初始化,因此初始值为
nil
,抛出一个
NullPointerException

如果子类的
foo
方法成功运行,则超类的构造函数将返回,子类的构造函数将最终被调用


今天的教训是:不要在非final类的构造函数中调用非final方法。

它不会抛出NPE。另外,永远不要从构造函数中调用可重写的方法。它不会抛出NPE,但会调用超类构造函数,但不会在为超类对象分配子类引用时调用超类中的重写方法。我很想知道哪一行得到NPE。唯一的指针(使用的)是ref,这只是在您的问题之后。如果调用非静态方法,则必须从对象调用该方法,否则会抛出静态上下文错误,而不是NPE。此外,当甚至没有super()时,超类的构造函数是如何调用的?这里的java文件名是什么?当我们试图以小写形式打印字符串时,NPE被抛出到子类foo()中。我不理解的是,为什么要在foo()的位置创建被反对的子类从超类构造函数调用,因为它仍在初始化成员变量的过程中。@Abhilash28Abhi子类对象未完全创建。这就是为什么不应该在超类构造函数中调用
foo
。调用子类
foo
并不是因为子类对象已完全创建,而是因为
this
在运行时引用了子类的实例
this.foo
指的是子类的
foo
实现。@Abhilash28Abhi如果您仍然不理解,请认为对象是在运行任何构造函数之前创建的。这样更容易理解吗?是的,这是有道理的。
but since the str is not followed up then it will obviously throw the null pointer exception.