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

为什么我改成引用类型转换以后输出的属性就变成了null?以下是我的所有代码

public class people {
   public String skin;
   public void speak(){
       System.out.println("人会讲话");
   }
}


public class ChinesePeople extends people {
  public String skin="yellow";
  public void speak(){
      System.out.println("中国人说汉语");
  }
}


public class EnglishPeople extends people {
     public String skin="white";
      public void speak(){
          System.out.println("英国人说英语");
}
}




public class PeopleTest {
   public static void main(String[] args){
       people chinese=new ChinesePeople();
       people english=new EnglishPeople();
       chinese.speak();
       System.out.println("中国人的皮肤是"+chinese.skin);
       english.speak();
       System.out.println("英国人的皮肤是"+english.skin);
   }
}

正在回答

4 回答

people chinese=new ChinesePeople();

明显,chinese对象实例化了people类,而作为一个people类,people.skin初始化过程中没有改变,自然是空。

如果你改为:

ChinesePeople cp = new ChinesePeople();

cp.skin  就是 yellow了

0 回复 有任何疑惑可以回复我~

public class Serivce {
   public static void main(String[] args){
       Chinese chinese = new Chinese();
       chinese.speak();
       System.out.println("中国人的皮肤是"+chinese.skin);
       American american = new American();
       american.speak();
       System.out.println("美国人的皮肤是"+american.skin);
   }
}

//是你的应用的类型出错了,是父类的,所以是空的

1 回复 有任何疑惑可以回复我~

我是菜鸟下面可能有讲错的地方,有的话希望大家指正,互相学习进步

对于你出现的问题了解一点点,我运行了一下你的程序,确实有出现null的问题

当我把people类的skin改成123456时,对应两个输出也改成123456,这在一定程度上说明了主函数上里的skin属性都是父类的。

我查了JAVA编程思想里关于多态的描述再加上自己的一些理解,

Java继承针对的是普通的方法,父类中私有方法不允许子类继承,静态方法不能继承的,另外:当用父类引用创建子类对象时,引用(这是指父类的域)创建的新的对象的域是两个(存储块),

以例程中例子来说,chinese和english是people类引用,chinese.skin就是people类下的skin,而方法通过动态绑定绑定为ChinesePeople类中的方法,该方法中访问的域即skin是对应新建对象的,而不是people类的skin。

另外拓展一下,如果是子类中新建的方法,父类引用创建的子类时,该父类引用不能调用子类新创建的方法,因为父类中没有,也自然谈不上重新绑定方法。


0 回复 有任何疑惑可以回复我~

你new的对象指向的是父类,调用的时候会向父类请求属性,父类没有给属性赋值,子类赋值是没有用的

,你给父类属性赋值试一下,任然调用父类的

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

为什么我改成引用类型转换以后输出的属性就变成了null?以下是我的所有代码

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信