class P {
public int x=1;
public void setX(int x) {
this.x=x;
}
public int getX() {
return x;
}
}
class Pi extends P{
public int x=2;
public int z=3;
public void setX(int x) {
this.x=x+10;
}
public void setXi(int x) {
this.x=x+20;
}
}
class Demo {
public static void main(String[] args) {
Pi pi=new Pi();
P p=pi;
/*当一个超类类型的引用指向一个子类类型的具体对象时,不能利用该引用访问超类中未定义的成员*/
//System.out.println(p.z);//报错
//p.setXi(1); //报错
/*父类的非静态域被隐藏*/
System.out.println(p.x);//1
System.out.println(pi.x);//2
/*非静态方法被继承,又被改写。不存在隐藏这一说法。只存在一个setX()方法,
所以不管是p.setX(5);还是pi.setX(6);即不管用哪个引用来操作,都是调用的改写后的方法*/
p.setX(5);
System.out.println(p.x);//1
System.out.println(pi.x);//15
pi.setX(6);
System.out.println(p.x);//1
System.out.println(pi.x);//16
}
}
/*既然是new Pi();的空间,那么不管是用P类型的引用还是Pi类型的引用指向,这块空间是Pi类型的是确定的,
那么就要考虑Pi类里有啥??
首先是自己定义的x,z,所以继承来的x被隐藏。setX()getX()被继承,同时setX()被改写,又自己定义了setXi()。
这就是这块空间里存在的东西。即3个域,3个方法。上面的输出是啥都要基于这块空间有啥来判断*/
class P {
public int x=1;
public void setX(int x) {
this.x=x;
}
public int getX() {
return x;
}
}
class Pi extends P{
public int x=2;
public int z=3;
public void setXi(int x) {
this.x=x+20;
}
}
class Demo {
public static void main(String[] args) {
Pi pi=new Pi();
P p=pi;
/*父类的非静态域被隐藏*/
System.out.println(p.x);//1
System.out.println(pi.x);//2
/*非静态方法被继承。只存在一个setX()方法,但是这个方法所操作的非静态域x有两个,
一个是父类的被隐藏的,一个是子类的*/
/*子类继承下来的方法操作继承下来的域*/
p.setX(5);
System.out.println(p.x);//5
System.out.println(pi.x);//2
pi.setX(6);
System.out.println(p.x);//6
System.out.println(pi.x);//2
}
}
class SuperClass {
int x=10;
void method0() {method1();}
void method1() {
x=11;
}
}
class SubClass extends SuperClass {
int x=100;
void method1() { x=2; }
public static void main(String[] args) {
SubClass rSub=new SubClass();
SuperClass rSuper=rSub;
rSub.method0();//或者 rSuper.method0();
System.out.println(rSuper.x+","+rSub.x);//10,2
}}
/*
子类继承了父类的method0(),继承并改写了method1()。对于子类来讲只有一个改写后的method1()和直接继承的method0()。
调用rSub.method0();或者 rSuper.method0();内部仍然调用改写后的method1(),对子类的x进行操作,操作不到被隐藏的父类x
*/
class SuperClass {
int x=10;
void method0() {method1();}
private void method1() {System.out.println("call SuperClass method1");
x=11;
}
}
class SubClass extends SuperClass {
int x=100;
void method1() { System.out.println("call SubClass method1");x=2; }
public static void main(String[] args) {
SubClass rSub=new SubClass();
SuperClass rSuper=rSub;
rSub.method0();//或者 rSuper.method0();
System.out.println(rSuper.x+","+rSub.x);
}}
/* call SuperClass method1
11,100
*/