Java 正方形和矩形继承

Java 正方形和矩形继承,java,inheritance,Java,Inheritance,这是一个关于Java中两个类的基本继承的问题 我们有两个类,第一个是矩形: private double length; private double width; public Rectangle(double length, double width) { this.length = length; this.width = width; } 接下来我们有一个名为Square的扩展类,它扩展了Rectangle,因此通过super()我们知道它使用了Rectangle类的

这是一个关于Java中两个类的基本继承的问题

我们有两个类,第一个是
矩形

private double length;
private double width;

public Rectangle(double length, double width)
{
    this.length = length;
    this.width = width;
}
接下来我们有一个名为
Square
的扩展类,它扩展了
Rectangle
,因此通过
super()
我们知道它使用了
Rectangle
类的构造函数

private double side;

public Square(double side)
{
    super(side, side);
    this.side = side;
}

public void print()
{
    System.out.println("I am a square of side " + side);
}
这是我们的主要目标:

Square b = new Square(6.0);
Rectangle c = (Rectangle) b;
c.print();
我们创建了一个类型为
Square
的对象,它将包含两个
side
变量
double
6.0

接下来,我们将
b
转换为
Rectangle
c
,这就是我的问题所在


为什么
c.print()
打印出
我是6.0边的正方形

这是多态行为。类的实际类型决定调用的方法<将调用code>Square
print
版本,因为对象的实际类型是
Square

这是多态行为。类的实际类型决定调用的方法<将调用code>Square
print
版本,因为对象的实际类型是
Square

多态 在(Java)继承中,这是一种预期的行为——多形性——它是一种让您(开发人员)围绕一个概念(矩形)设计应用程序的方法,并允许在使用原始概念(矩形)的地方使用其他相关概念(方形),但同时使用它们自己的(方形)行为

实用性 假设您有一个矩形列表或数组,并用从您自己的包外部的函数返回中接收的对象填充它。然后遍历列表,让每个对象做一些事情——通常希望这些对象按照它们的实际行为,而不是它们所填充的内容

如果你问一个矩形的面积是多少,它将乘以长度和宽度并返回结果。如果你不在square类中重写它,它也会做同样的事情,但是你可以重写它,它可以用
Math.pow(this.side,2)
计算它的面积

这个继承链怎么样:

Shape > Polygon > Quadrilateral > Parallelogram > Rectangle > Square
您肯定需要实现不同的面积计算方法——您不希望每个对象都按照其自身的底层结构的要求进行操作(而不是像它被强制转换到的类型那样进行操作)

Polymorphy 在(Java)继承中,这是一种预期的行为——多形性——它是一种让您(开发人员)围绕一个概念(矩形)设计应用程序的方法,并允许在使用原始概念(矩形)的地方使用其他相关概念(方形),但同时使用它们自己的(方形)行为

实用性 假设您有一个矩形列表或数组,并用从您自己的包外部的函数返回中接收的对象填充它。然后遍历列表,让每个对象做一些事情——通常希望这些对象按照它们的实际行为,而不是它们所填充的内容

如果你问一个矩形的面积是多少,它将乘以长度和宽度并返回结果。如果你不在square类中重写它,它也会做同样的事情,但是你可以重写它,它可以用
Math.pow(this.side,2)
计算它的面积

这个继承链怎么样:

Shape > Polygon > Quadrilateral > Parallelogram > Rectangle > Square

您肯定需要实现不同的面积计算方法——您不希望每个对象都按照它自己的底层结构告诉它的方式运行(而不是像它被转换到的类型一样运行)?

这假设
矩形
声明了
打印()
方法

这一行动

Rectangle c = (Rectangle) b;
不对
b
引用的实例执行任何操作。它仅将参考变量
b
扩展到其超级类型
矩形

调用
print()
将具有多态行为,并且在运行时将使用
Square
的实现,因为
c
引用的是
Square
对象,该对象已将
大小设置为
6

Square b = new Square(6.0);
...
private double side;

public Square(double side) {
    super(side, side);
    this.side = side;
}
请注意,这是Java中的预期行为。如C++和C语言中的其他语言,您的CAST会工作,因为<代码>打印< /COD>方法在<代码>矩形> <代码>未被声明为<代码>虚拟< /C> > < < 更多信息:


这假设
矩形
声明了一个
print()
方法

这一行动

Rectangle c = (Rectangle) b;
不对
b
引用的实例执行任何操作。它仅将参考变量
b
扩展到其超级类型
矩形

调用
print()
将具有多态行为,并且在运行时将使用
Square
的实现,因为
c
引用的是
Square
对象,该对象已将
大小设置为
6

Square b = new Square(6.0);
...
private double side;

public Square(double side) {
    super(side, side);
    this.side = side;
}
请注意,这是Java中的预期行为。如C++和C语言中的其他语言,您的CAST会工作,因为<代码>打印< /COD>方法在<代码>矩形> <代码>未被声明为<代码>虚拟< /C> > < < 更多信息:


记住,
c
只是对内存中对象的引用。尽管参考
c
为静态矩形,但被参考的对象为动态方形。静态类型和动态类型之间的区别对于本例至关重要

与对象引用关联的静态类型是编译器用来确保我们的代码从类型角度讲是有意义的。但是,当对对象调用方法时,调用哪个方法取决于对象的动态类型,即运行时实际引用的对象类型。这称为动态绑定

还值得一提的是,矩形-正方形示例是一个标准示例。它通常用来说明