java中关于super关键字与继承的理解

public class Chinese extends Person{
public void print(){
System.out.println("Chinese:");
super.print(); //调用父类的print
}
public static void main(String[] args){
Chinese chn=new Chinese();
chn.setName("kiweis");
chn.setAge(18); //chn的age数据已设置成18
chn.print();
System.out.println();
}
}

class Person{
public int c;
private String name;
private int age;
protected void setName(String name){
this.name=name;
}
protected void setAge(int age){
this.age=age;
}
protected void print(){
System.out.println("Name="+name+" Age="+age); /*子类通过super来调用,打印的究竟是子类的name还是父类的name呢?*/
}
}

以上定义的Chinese继承Person,我的理解是Chinese继承了Person的数据域和方法,调用set方法设置的不是Chinese的String和age么,那么super.print()打印的不是Person的String和age吗,也就是null和0,为什么运行程序输出的是kiweis和18

5个回答

不不不 你的代码是有误的
public class Chinese extends Person {
@Override
public void print(){
System.out.println("Chinese:");
super.print();
}
public static void main(String[] args){
Chinese chn=new Chinese();
chn.setName("kiweis"); //
chn.setAge(18);
//这是子类调用父类Person的print()方法
chn.print(); //可以是做中国人是人的一种 输出的也是人的信息

    Person ps= new Person();    //父类是没信息的 所以是空
    System.out.println("person information:");
    ps.print();
    } 

}

LOVE_sel
逗号很逗 回复kiweiskeepgoing: 你这是没有理解对象和类的关系。小红是中国人,小红也是人,小红的年龄是18。你不能说中国的年龄是18,人的年龄是0。
大约 4 年之前 回复
kiweiskeepgoing
kiweiskeepgoing Chinese information: Name=kiweis Age=18 person information: Name=null Age=0 这是按照您修改后的输出我的理解是super.print()是父类的实例调用这个方法所以我认为应该输出Chinese information: Name=null Age=0
大约 4 年之前 回复
kiweiskeepgoing
kiweiskeepgoing 感谢回答,我打错并且打漏了那么多,你还能懂我的意思真是厉害!但我还是不能理解子类通过super调用父类的方法,打印的却是子类的变量呢
大约 4 年之前 回复

“Chinese继承了Person的数据域和方法,调用set方法设置的不是Chinese的String和age么,那么super.print()打印的不是Person的String和age吗”,这些你说的都对。但是Chinese,Persion都是类,只不过Chinese类中重写print方法,

public void print(){ 
System.out.println("Chinese:"); 
super.print(); 
}  

等价于

 public void print(){ 
System.out.println("Chinese:"); 
System.out.println("Name="+name+" Age="+age); 
} 

你定义的对象只有一个**chn**(Chinese chn=new Chinese(); ),当chn调用
print()方法时,自然会打印出chn的name,age.

LOVE_sel
逗号很逗 回复kiweiskeepgoing: 恩!
大约 4 年之前 回复
kiweiskeepgoing
kiweiskeepgoing 噢~开窍了一点,super.父类方法就是类似直接把父类方法的方法体直接搬下来到子类重写方法的方法体中,这样理解对不对?之前我一直以为super是相当于父类的实例去调用的。。
大约 4 年之前 回复

私有 是不能继承的 只能继承protected 和public

父类的private修饰的数据域和方法是可以被隐式继承的,但是子类必须要通过父类的非private属性方法去访问的

问题之前的错误已修改,现在又有新的问题,private修饰的数据域和方法究竟能不能被继承呢,我尝试讲protected改成private,然后用子类的实例chn调用方法,发现编译器找不到该方法,按道理来说不应该是被继承了吗,为何编译器找不到方法呢。。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐