public class Father {
int a=100; //Father类属性a
public void miner(){ //Father类方法
a--;
}
public static void main(String[] args){
Father f=new Father();
Son s=new Son();
System.out.println("a of son is:"+s.a); //输出:a of son is 0;
System.out.println("a of father is:"+f.a); //输出:a of father is:100
System.out.println("a of son's super is:"+s.getA()); //输出:a of son's super is:100
s.miner(); //子类调用父类的方法,且仅为对象s实例出来的父类属性a=100-1=99,父类f的属性f.a没变
System.out.println("a of son is:"+s.a); //输出:a of son is:0
System.out.println("a of father is:"+f.a); //输出:a of father is:100
System.out.println("a of son's super is:"+s.getA()); //输出:a of son's super is:99
s.plus(); //调用子类的方法
System.out.println("a of son is"+s.a); //输出:a of son is:1
}
}
class Son extends Father{ //子类
int a=0; //这里子类Son自定义的属性a,与为从Father中继承下来的属性a是两个属性,占用不同的空间
public void plus(){
a++;
}
public int getA(){
return super.a; //super.a表示访问父类Father的属性a
}
}
子类重新定义了父类已经存在的方法或变量,称为重定义继承方式。
但需要注意的是:每个继承了父类的子类,对变量的修改仅限于自身,不会影响到父类的变量值。
父类与子类定义同名的变量,并不会覆盖,而是各自还有自己的空间,即使变量名相同,子类中调用父类的对同名变量赋值的方法,仍然只是改变自己实例出来的父类的变量值。
也就是说:子类实例出来的父类 与 一开始的父类 不相互影响 。(语文不好,满嘴骚话,见谅)
具体是怎样一回事,上面代码注释标出了变量的改变,自己体会下吧。
讲了这么多,然后我把C++的同名覆盖,重写忘了