其实很简单的,你要记住的就是在 类的继承中方法是被覆盖的,属性是被隐藏的就可以了
1、首先看main中的Base b=new Derived(); 实例化了Derived类
class Derived extends Base {
  int x=2;
  public Derived() {}
  public void show() {
    System.out.print(" The value is " + x);
  }
}
在这个Derived类中首先执行其构造函数 public Derived(){},而在这个构造函数的第一行默认调用其超类的构造函数,于是执行public Base() {}。2、回到main里面b.show();被执行,由于类Derived继承了Base类,而Derived类和Base类都有同一个方法show(),所以Derived类的show方法覆盖了Base类的show方法,所以调用的是这个语句
public void show() {
 System.out.print(" The value is " + x);
}
那么究竟打印出来的x是子类的值还是父类的值呢,由于在继承的时候成员变量即属性是被隐藏的所以当前只有子类的属性被调用即int x=2;
这样The value is 2就被打印出来了。3、回到main中 System.out.println("The value is " +b.x);被执行
这个b是什么类型的呢,可以看main里面的第一条语句
Base b = new Derived();
很显然b是Base类型的,那么由于属性是被隐藏的,所以b.x中的x调用Base的属性int x=3;
这样The value is 3被打印出来的所以最后的结果是:
The value is 2The value is 3