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
不不不 你的代码是有误的
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();
}
}
“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.
问题之前的错误已修改,现在又有新的问题,private修饰的数据域和方法究竟能不能被继承呢,我尝试讲protected改成private,然后用子类的实例chn调用方法,发现编译器找不到该方法,按道理来说不应该是被继承了吗,为何编译器找不到方法呢。。
私有 是不能继承的 只能继承protected 和public
父类的private修饰的数据域和方法是可以被隐式继承的,但是子类必须要通过父类的非private属性方法去访问的