Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.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 - Fatal编程技术网

Java 子类中未初始化成员

Java 子类中未初始化成员,java,Java,输出为: //src/com/test/animal/Animal.java package com.test.animal; public class Animal { Animal() { init(); } public void init() { System.out.println("parent init()"); } } //src/com/test/animal/Dog.java packag

输出为:

//src/com/test/animal/Animal.java
package com.test.animal;

public class Animal
{
    Animal()
    {
        init();
    }

    public void init()
    {
        System.out.println("parent init()");
    }
}

//src/com/test/animal/Dog.java 
package com.test.animal;

public class Dog extends Animal
{
    String name = null;

    Dog()
    {
        super();
    }

    public void init()
    {
        System.out.println("child init()");
        super.init();
        name = new String("dog");
        System.out.println("name: "+name);
    }

    public static void main(String[] args)
    {
        Dog d = new Dog();
        System.out.println("name: "+d.name);
    }
}
似乎调用了child中的init(),但未保存名称值!为什么? 如果我把名字移到“家长”就可以了。然而,这是更合理的保留在儿童,因为它的狗具体


另外,我可以在child的构造函数中显式调用init()来解决这个问题。没那么好

其执行顺序如下:

  • 调用
    Dog
    构造函数
  • 它调用
    Animal
    构造函数
  • Animal
    构造函数调用
    init
    方法。因为它在
    Dog
    中被重写,所以调用
    Dog
    版本
  • Dog.init
    中,您将
    name
    设置为
    “Dog”
  • Dog.init
    方法返回
  • 现在,
    Dog
    的成员变量已初始化。这将
    name
    设置为
    null
  • 结果:
    name
    将为
    null

    这是一个很好的例子,说明了为什么不应该调用可以从构造函数重写的方法,因为这会导致类似这样的意外

    旁注:永远不要这样做:

    child init()
    parent init()
    name: dog
    name: null
    
    只需这样做:

    // Unnecessarily creating a new String object
    name = new String("dog");
    

    从不需要从字符串文本显式创建新的
    String
    对象。

    执行顺序如下:

  • 调用
    Dog
    构造函数
  • 它调用
    Animal
    构造函数
  • Animal
    构造函数调用
    init
    方法。因为它在
    Dog
    中被重写,所以调用
    Dog
    版本
  • Dog.init
    中,您将
    name
    设置为
    “Dog”
  • Dog.init
    方法返回
  • 现在,
    Dog
    的成员变量已初始化。这将
    name
    设置为
    null
  • 结果:
    name
    将为
    null

    这是一个很好的例子,说明了为什么不应该调用可以从构造函数重写的方法,因为这会导致类似这样的意外

    旁注:永远不要这样做:

    child init()
    parent init()
    name: dog
    name: null
    
    只需这样做:

    // Unnecessarily creating a new String object
    name = new String("dog");
    

    从不需要从字符串文本显式创建新的
    String
    对象。

    这是因为首先调用Animal的构造函数,其中name设置为“dog”,然后调用dog的构造函数,其中name重置为null

    为了更清楚,您的代码类似于以下代码:

    name = "Dog";
    

    这就是为什么在基类构造函数中调用可重写方法是非常糟糕的做法的原因之一。

    这是因为首先调用Animal的构造函数,其中name设置为“dog”,然后调用dog的构造函数,其中name重置为null

    为了更清楚,您的代码类似于以下代码:

    name = "Dog";
    

    这就是为什么在基类构造函数中调用可重写方法是非常糟糕的做法的原因之一。

    它不能回答您的问题,但它是相关的:它不能回答您的问题,但它是相关的:谢谢。我对child的构造函数中的'name=null'感到惊讶!有关于这个的链接或文档吗?其实很简单。在构造函数之外完成的所有初始化实际上都是在调用超类构造函数之后,在实际构造函数的代码之前完成的。谢谢。我对child的构造函数中的'name=null'感到惊讶!有关于这个的链接或文档吗?其实很简单。所有在构造函数外部完成的初始化实际上都是在调用超类构造函数之后,在实际构造函数的代码之前完成的。谢谢!我曾经读过一些关于“newstring()”的东西,看起来像是有效的java。谢谢你的提醒,谢谢!我曾经读过一些关于“newstring()”的东西,看起来像是有效的java。谢谢你的提醒。