多态
多态是一种非常有用的Java语法规则。
多态存在于继承当中,只有父类和子类之间可以形成多态,多态的规则简单来说就是父类可以存在的地方子类一定可以使用。多态在设计模式中式非常常见的。经常可以利用多态来达到类的复用功能,用几个简单的示例来说明一下多态的作用和概念。
编辑工具选择Eclipse
我们来创建四个Java文件,分别是Shapes、Rectangles、Ellipse、Demo
首先我们来编写Shape.java文件
public class Shapes {
private int width;
private int height;
public Shapes() {
}
public int getWidth() {
return width;
}
public void setWidth(int w) {
width=w;
}
public int getHeight() {
return height;
}
public void setHeight(int h) {
height=h;
}
public Shapes getProject(Shapes s) {
return s;
}
}
重点是在方法getProject(Shapes s)因为这个时候我们只有一个Shapes类,我们要返回对象也只能返回Shapes类型。这样看起来没什么问题,但是我们在建立其他对象的时候就会出现问题。
我们接下来创建一个Rectangles.java文件。我们首先将它设置为Shapes类的子类。
示例代码如下:
public class Rectangles extends Shapes{
public Rectangles() {
}
}
在这里我们因为是Shapes类的子类所有它继承了父类的所有属性和方法。
然后我们创建测试用的Demo.java文件
示例代码如下:
public class Demo {
public static void main(String[] args) {
Rectangles rect=new Rectangles();
rect.getProject(rect);
}
}
我们运行后看到方法getProject(Shapes s)没有任何问题。
但是我们创建的却是Rectangles的对象实例,它依然可以被当做Shapes对象类型变量参数添加到方法中。
那我们接下来再创建一个Ellipse.java文件
示例代码如下:
public class Ellipses {
public Ellipses() {
}
}
然后我们在Demo.java文件中在添加一段代码
public class Demo {
public static void main(String[] args) {
Ellipses ellipse=new Ellipses();
Shapes shape=new Shapes();
shape.getProject(ellipse);
}
}
我们建立一个Ellipses的对象实例,因为Ellipses与Shapes没有继承关系,所以当将Ellipses对象创建的ellipse实例放入getProject(Shapes s)方法中当做参数时,这个方法是不能实现的,因为ellipse实例不是Shapes的对象实例。
但是如果我们将Ellipses文件的代码做如下修改:
public class Ellipses extends Shapes{
public Ellipses() {
}
}
将其变成Shapes类的子类。这个时候,我们再来看之前的Demo文件里的getProject(Shapes s)方法就不会报错了。就可以用其子类来替代掉父类。而不用重新编写这个方法了。
而且我们还可以换一种更加直观的编写方法。
现在我们重新来编写一次Demo文件代码:
public class Demo {
public static void main(String[] args) {
Shapes rect=new Rectangles();
Ellipses ellipse=new Ellipses();
rect.getProject(rect);
rect.getProject(ellipse);
}
}
我们可以看到我们使用了一个很奇怪的语法:Shapes rect=new Rectangles();
在这里我们使用的是父类的类型,而后面new操作符跟的却是Rectangles(),这里你可以把他理解成类型转换把他拆分开来看:
首先声明一个Shapes rect;
然后在使用new 操作符创建一个Rectangles()对象实例。
然后将他们连接在一起。
但是这个也只是在继承关系中才可以使用。
在上例子中,Ellipses类和Rectangles类都是Shapes对象的子类。
所以他们都可以替代父类的存在。