父类对象被子类实例化

来源:百度知道 编辑:UC知道 时间:2024/06/22 08:48:22
public abstract class PlaneGraphics1
{
private String shape;
public PlaneGraphics1(String shape)
{
this.shape=shape;
}
public PlangGraphics1()
{
this("未知");
}
public abstract double area();
public void print()
{
System.out.print(this.shape+"面积为:"+this.area());
}
}

public class Rectangle1 extends PlaneGraphics1
{
protected double length;
protected double width;
public Rectangel1(double length,double width)
{
super("长方形");
this.length=length;
this.width=width;
}
public double area()
{
return this.width*this.length;
}
}

class PlaneGraphics1_ex
{
public static void main(String args[])
{
PlaneGraphics1 g1=new Rectangle(10,20);
g1.print();
}
}

这一段代码在书上抄下来的,本人有一点想不通的.PlaneGraphics1 g1能够拿Rectangle来实例化.子类中的pro

父类引用实例化子类对象 这是面向对象的常见写法 记住就好 父类对象确实不能执行所有子类的方法 然而Rectangle1 并没有增加新的方法

首先你要搞清楚,当一个类继承于另一个类,那么在实例化这个子类的时候,会在创建子类对象之前首先创建父类的对象实例。

那么在你举的例子中,main方法里

PlaneGraphics1 g1=new Rectangle(10,20);
后一句new Rectangle(10,20);实例化子类时,他会首先创建父类的对象实例,也就是PlaneGraphics1类的实例,再看代码就不难明白。

实际上PlaneGraphics1 g1是指向的实例子类对象时创建的那个父类的引用。

而反过来说,能不能把子类对象指向父类的引用呢。显然是不行的。
因为父类对象创建时,并不会创建子类对象(Object 是所有类的基类。实例化Object对象并不会创建其子类对象)。那么子类和父类显然是不匹配的。就会报错。

如果你还有疑问可以详细描述。

PlaneGraphics1 g1=new Rectangle(10,20);

注意这句话,并不是父类访问到了子类的变量。 而是子类的构造方法,访问了自己的变量。

这里其实就是 子类的 public double area() 覆盖了 父类的同名方法