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。谢谢你的提醒。