JShapeTest.java
定义抽象类JShape

abstract class JShape  
{
    int JShapeId;  //可以拥有成员变量

    protected void getJShapeId()  //可以拥有具体实现的方法
    {
        System.out.println(JShapeId);
    }

    abstract protected double area(); // 定义抽象方法area()

    abstract protected void draw(); // 定义抽象方法draw()
}

// 定义一个子类来继承抽象类JShape
class JRectangle extends JShape  
{
    float width, length;

    JRectangle(float w, float l) // 定义构造方法
    {
        width = w;
        length = l;
    }

    public double area() // 对父类的抽象方法进行具体实现
    {
        return width * length;
    }

    public void draw() // 对父类的抽象方法进行具体实现
    {
    };
}

public class JShapeTest  
{
    public static void main(String args[])
    {
        JRectangle r = new JRectangle(10, 20);
        System.out.println("The area of rectangle:" + r.area());
        JShape s=new JRectangle(10, 20);
        s.getJShapeId();
    }
}

例4.16
JDynamicMethodTest2.java

class A2  
{
    int id = 10;

    public void Hello()
    {
        System.out.println("Hello,here is A2");
    }

    public int getId()
    {
        return id;
    }

}

class B2 extends A2  
{
    int id = 100;
    String s = "ok";

    public int getId()
    {
        return id;
    }

    public void Hello()
    {
        System.out.println("Hello,here is B2");
    }

    public void setId()
    {
        id = 1000;
    }
}

public class JDynamicMethodTest2  
{
    public static void main(String args[])
    {
        A2 a2 = new B2();  //向上转型
        System.out.println(a2.id);   //成员变量id并没有被覆盖,使用的还是A2类的id
        //System.out.println(a2.s);  //s是子类B2的变量,无法调用
        a2.Hello();  //子类覆盖了父类的Hello()方法,因此实际调用了B2的Hello()方法
        //a2.setId();  //setId()是子类B2的方法,无法调用
        System.out.println(a2.getId());
    }
}