关于子类继承父类中的方法的一些问题

ItKnow 2018-12-12 09:41:51
今天遇到一个现象, 子类继承父类中的方法(子类未覆盖), 该方法是修改类中的属性, 为何我用子类调用这个方法的时候, 实际修改的是父类中的值呢? 代码如下:

public class Sup {
private String name;
private int age;
private String sex;

public Sup() {

}

public Sup(String name, int age) {
this.name = name;
this.age = age;
}

public void show() {
System.out.println("name:" + this.name + ", age: " + age);
}

public void setSex(String sex) {
this.sex = sex;
}
}

class Sub extends Sup {
private String name;
private int age;
private String sex;

public Sub(String name, int age) {
super(name, age);
this.name = name;
this.age = age;
}

public String getSex() {
return this.sex;
}

public static void main(String[] args) {
Sub sub = new Sub("Jack", 100);
sub.show();
sub.setSex("male");
System.out.println("Jack's sex: " + sub.getSex());
}
}

希望各位能帮忙解惑下, 先谢过各位大佬
...全文
371 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
RUA好多鱼~ 2018-12-29
  • 打赏
  • 举报
回复
因为子类没有set方法
十八道胡同 2018-12-28
  • 打赏
  • 举报
回复
引用 5 楼 Jason翁先森 的回复:
[quote=引用 2 楼 Izombie 的回复:]
这个问题的原因在于子类虽然继承了父类所有的属性与方法,但是属性保存的空间是相互独立的。我们看下平常的类继承图是怎么画的(网上找了一个)[/code]

这个是没错, 那如果要使方法调用子类的属性而不是父类的属性, 是不是只能覆盖父类的方法, 有没有其他的途径呢?[/quote]

这个是个办法

ItKnow 2018-12-28
  • 打赏
  • 举报
回复
引用 2 楼 Izombie 的回复:
这个问题的原因在于子类虽然继承了父类所有的属性与方法,但是属性保存的空间是相互独立的。我们看下平常的类继承图是怎么画的(网上找了一个)[/code]

这个是没错, 那如果要使方法调用子类的属性而不是父类的属性, 是不是只能覆盖父类的方法, 有没有其他的途径呢?
ItKnow 2018-12-28
  • 打赏
  • 举报
回复
引用 1 楼 ssson 的回复:
package com.jax.test;

public class Sup {
private String name;
private int age;
private String sex;

public Sup() {

}

public Sup(String name, int age) {
this.name = name;
this.age = age;
}

public void show() {
System.out.println("name:" + this.name + ", age: " + age);
}

public void setSex(String sex) {
this.sex = sex;
}
public static void main(String[] args) {
Sub sub = new Sub("Jack", 100);
sub.show();
sub.setSex("male");
System.out.println("Jack's sex: " + sub.getSex());
}
}

class Sub extends Sup {
private String name;
private int age;
private String sex;

public Sub(String name, int age) {
super(name, age);
this.name = name;
this.age = age;
}

public String getSex() {
return this.sex;
}


}



/*output:
name:Jack, age: 100
Jack's sex: null
*-*/


引用 1 楼 ssson 的回复:
package com.jax.test;

public class Sup {
private String name;
private int age;
private String sex;

public Sup() {

}

public Sup(String name, int age) {
this.name = name;
this.age = age;
}

public void show() {
System.out.println("name:" + this.name + ", age: " + age);
}

public void setSex(String sex) {
this.sex = sex;
}
public static void main(String[] args) {
Sub sub = new Sub("Jack", 100);
sub.show();
sub.setSex("male");
System.out.println("Jack's sex: " + sub.getSex());
}
}

class Sub extends Sup {
private String name;
private int age;
private String sex;

public Sub(String name, int age) {
super(name, age);
this.name = name;
this.age = age;
}

public String getSex() {
return this.sex;
}


}



/*output:
name:Jack, age: 100
Jack's sex: null
*-*/


你这个好像只是稍微改了下我的代码运行, 没有说具体的原因呢
qq_39936465 2018-12-28
  • 打赏
  • 举报
回复
子类继承父类时,当子类被实例化时,父类同时被实例化,如果子类不重写父类方法的情况下,默认子类可以直接使用父类方法。
其实子类不重新定义同名变量的话也可以直接调用父类变量。所以你程序在执行set时,发现子类中没有该方法时自动转到父类中的set执行。而子类重写了父类方法后,程序会执行子类中新写的方法。
朝霞清辉 2018-12-28
  • 打赏
  • 举报
回复
你当前的子类中没有set方法,而你用子类对象调用set方法时,其实是调用的父类中的set方法。
Izombie 2018-12-13
  • 打赏
  • 举报
回复
这个问题的原因在于子类虽然继承了父类所有的属性与方法,但是属性保存的空间是相互独立的。我们看下平常的类继承图是怎么画的(网上找了一个)

父类的属性在父类里,子类的属性在子类里,如果你了解过JavaScript的面向对象实现方式的话应该能更好的理解。方法可以覆盖,但属性只能隐藏,我们可以写一段程序来验证一下。
public class Test {
public static void main(String[] args) {
Sub sub = new Sub();
sub.setName("jjj");
sub.setPri("ppp");
sub.setSex("male");

System.out.println(sub.getName());
System.out.println(sub.getPri());
System.out.println(sub.getSex());

System.out.println();
System.out.println(sub.getSupName());
System.out.println(sub.getSupPri());
System.out.println(sub.getSupSex());
}

}

class Sup {
protected String sex;
public String name;
private String pri;

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPri() {
return pri;
}

public void setPri(String pri) {
this.pri = pri;
}
}

class Sub extends Sup {
protected String sex;
public String name;
private String pri;

public String getSex() {
return sex;
}

public String getName() {
return name;
}

public String getPri() {
return pri;
}

public String getSupSex() {
return super.getSex();
}

public String getSupName() {
return super.getName();
}

public String getSupPri() {
return super.getPri();
}
}

执行后会输出
null
null
null

jjj
ppp
male
ssson 2018-12-13
  • 打赏
  • 举报
回复
package com.jax.test;

public class Sup {
private String name;
private int age;
private String sex;

public Sup() {

}

public Sup(String name, int age) {
this.name = name;
this.age = age;
}

public void show() {
System.out.println("name:" + this.name + ", age: " + age);
}

public void setSex(String sex) {
this.sex = sex;
}
public static void main(String[] args) {
Sub sub = new Sub("Jack", 100);
sub.show();
sub.setSex("male");
System.out.println("Jack's sex: " + sub.getSex());
}
}

class Sub extends Sup {
private String name;
private int age;
private String sex;

public Sub(String name, int age) {
super(name, age);
this.name = name;
this.age = age;
}

public String getSex() {
return this.sex;
}


}



/*output:
name:Jack, age: 100
Jack's sex: null
*-*/

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧