猿问

在子类中调用父方法返回空值

我试图通过使用父方法但在子类中显示父类中的变量的值。


public class A {

    public static void main(String[] args) {

        Parent p1 = new Parent();

        p1.input();

    }

}

class Parent {

    private String name;

    public void setName(String newName) {

        name = newName;

    }

    public String getName() {

        return name;

    }

    public void input() {

        String q = "hi";

        setName(q);

        Child c1 = new Child();

        c1.input();

    }

}

class Child extends Parent {

    public void input() {

        System.out.print(super.getName());

    }

}

我期待它输出hi,但输出是null. 我尝试过的事情:

  1. 在子类中使用getName()而不是。super.getName()

  2. 使用Parent p2 = new Parent();然后p2.getName()在子类中。

  3. protected String name;在父类中使用。

这些似乎都不起作用;最后它们都仍然输出null。帮助?


函数式编程
浏览 201回答 5
5回答

繁花不似锦

您在 Parent 对象中创建了一个 Child 对象,并且您正在设置当前父对象的 name 字段,而不是Child 的 Parent,这意味着您创建了多个 Parent 对象——其 name 字段为被设置,另一个(孩子的父母)的名字字段从未被设置,但被测试了。顺便说一句,父类不应该做这种事情。它应该是儿童“不可知论者”。

繁星点点滴滴

当您编写:“child c1 = new child()”时,您正在创建一个全新的实例。这个新实例null的name字段具有值: child 的构造函数不存在,因此您获得了默认构造函数(它调用父类构造函数,仅此而已)。您的父类也没有构造函数,因此它也不做任何事情,这使您的name字段保持其默认值null.input然后,您在此实例上调用该方法。因为这个实例的实际类型是child,所以input()在你的类中定义的方法child运行,它会打印name字段的值,即null。是的,有另一个实例(类型为parent),它的name字段设置为“Hi”,但您没有input在该实例上调用该方法。您正在调用input您在 line 中创建的实例的方法child c1 = new child();。

HUH函数

Child当您这样做时,会创建一个新的和单独的对象Child c1 = new Child();,该对象name从父类Parent继承属性,其继承的属性name未设置并且是null。p1in the是main一个完全不同的实例,其值不与c1实例共享。在子类中使用 getName() 而不是 super.getName()。这两者都将导致从父null类name继承Parent并且未初始化。Parent您在方法中初始化的对象main是一个完全不同的实例,其属性未被方法child中的实例引用input。使用父 p2 = new Parent(); 然后是子类中的 p2.getName() 。同样,您正在创建一个单独的实例,Parent并且由于您尚未初始化该实例的name值,因此将返回 null。p2p2.getName()使用受保护的字符串名称;在父类中。protected只是一个访问修饰符,它不会帮助您初始化name从类继承的属性Parent。这是视觉上的:

隔江千里

跟进我留下的评论,因为评论中的代码格式非常有限。所以这里的主要问题是孩子不仅仅需要有父母。孩子需要有确切的所需对象作为父母。这通常是通过构造函数完成的。所以我会让子类看起来像这样:class Child extends Parent {    private Parent parent;    public Child(Parent parent) {        this.parent = parent;    }    public void input() {        System.out.print(parent.getName());    }}然后,在您的父类中,您将拥有:public void input() {    String q = "hi";    setName(q);    Child c1 = new Child(this);    c1.input();}

德玛西亚99

只是给你另一个小样本:public class main {     public static void main(String[] args) {         Parent p1 = new Parent();         p1.input();        Child c1 = (Child)P1; //this is a type cast, which is possible due to what is known as polymorphism        c1.input();    } }class Parent {    private String name;    public void setName(String newName) {        name = newName;     }     public String getName() {         return name;     }     public void input() {         String q = "hi";         setName(q);     } } class Child extends Parent {     public void input() {         System.out.print(super.getName());     } }在这个小示例(基于您自己的)中,您只创建了一个父级实例。然后你将它作为 Child 输入到 c1 变量中。所以当你调用input ()它时。它使用子类的实现,而不是父类的实现。它还假设您希望在实际类之外使用多态性(例如,在这种情况下,在 main 函数中)。
随时随地看视频慕课网APP

相关分类

Java
我要回答