为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

函数式编程 2022-06-23 15:52:22
我试图通过使用父方法但在子类中显示父类中的变量的值。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. 我尝试过的事情:在子类中使用getName()而不是。super.getName()使用Parent p2 = new Parent();然后p2.getName()在子类中。protected String name;在父类中使用。这些似乎都不起作用;最后它们都仍然输出null。帮助?
查看完整描述

5 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

您在 Parent 对象中创建了一个 Child 对象,并且您正在设置当前父对象的 name 字段,而不是Child 的 Parent,这意味着您创建了多个 Parent 对象——其 name 字段为被设置,另一个(孩子的父母)的名字字段从未被设置,但被测试了。

顺便说一句,父类不应该做这种事情。它应该是儿童“不可知论者”。


查看完整回答
反对 回复 2022-06-23
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

当您编写:“child c1 = new child()”时,您正在创建一个全新的实例。这个新实例nullname字段具有值: child 的构造函数不存在,因此您获得了默认构造函数(它调用父类构造函数,仅此而已)。您的父类也没有构造函数,因此它也不做任何事情,这使您的name字段保持其默认值null.

input然后,您在此实例上调用该方法。因为这个实例的实际类型是child,所以input()在你的类中定义的方法child运行,它会打印name字段的值,即null

是的,有另一个实例(类型为parent),它的name字段设置为“Hi”,但您没有input在该实例上调用该方法。您正在调用input您在 line 中创建的实例的方法child c1 = new child();


查看完整回答
反对 回复 2022-06-23
?
HUH函数

TA贡献1836条经验 获得超4个赞

Child当您这样做时,会创建一个新的和单独的对象Child c1 = new Child();,该对象name从父类Parent继承属性,其继承的属性name未设置并且是nullp1in the是main一个完全不同的实例,其值不与c1实例共享。

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

这两者都将导致从父nullname继承Parent并且未初始化。Parent您在方法中初始化的对象main是一个完全不同的实例,其属性未被方法child中的实例引用input

使用父 p2 = new Parent(); 然后是子类中的 p2.getName() 。

同样,您正在创建一个单独的实例,Parent并且由于您尚未初始化该实例的name值,因此将返回 null。p2p2.getName()

使用受保护的字符串名称;在父类中。

protected只是一个访问修饰符,它不会帮助您初始化name从类继承的属性Parent

这是视觉上的:

//img1.sycdn.imooc.com//62b41bdf0001397c05460484.jpg

查看完整回答
反对 回复 2022-06-23
?
隔江千里

TA贡献1906条经验 获得超10个赞

跟进我留下的评论,因为评论中的代码格式非常有限。所以这里的主要问题是孩子不仅仅需要有父母。孩子需要有确切的所需对象作为父母。这通常是通过构造函数完成的。所以我会让子类看起来像这样:


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();

}


查看完整回答
反对 回复 2022-06-23
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

只是给你另一个小样本:


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 函数中)。


查看完整回答
反对 回复 2022-06-23
  • 5 回答
  • 0 关注
  • 200 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号