1.面向对象的程序设计有三打特点:封装,继承和多态;
那么什么是多态呢??
允许我们对对象进行不同的操作,但具体的动作却取决于对象的类型;
这句话怎么理解呢??以前大家都知道程序在编译的时候,什么函数对哪个对象执行什么操作都已经定下来了,换句话说叫做静态编译,多态是动态编译,什么是动态编译??动态编译就是在程序执行的过程中根据不同对象类型有不同的绑定。
那么多态有什么好处呢?
明显的一点就是可以让前人写的代码可以调用后人的代码,有点感到不可思异吧,这就是多态的神奇之处了,下面给出具体的例子来说明吧!!
class Shape {
void draw() {} void erase() {}
}
class Circle extends Shape {
void draw() {
System.out.println("Circle.draw()");
}
void erase() { System.out.println("Circle.erase()");
}
}
class Square extends Shape {
void draw() {
System.out.println("Square.draw()");
}
void erase() {
System.out.println("Square.erase()");
}
}
class Triangle extends Shape {
void draw() {
System.out.println("Triangle.draw()");
}
void erase() {
System.out.println("Triangle.erase()");
}
}
void draw() {} void erase() {}
}
class Circle extends Shape {
void draw() {
System.out.println("Circle.draw()");
}
void erase() { System.out.println("Circle.erase()");
}
}
class Square extends Shape {
void draw() {
System.out.println("Square.draw()");
}
void erase() {
System.out.println("Square.erase()");
}
}
class Triangle extends Shape {
void draw() {
System.out.println("Triangle.draw()");
}
void erase() {
System.out.println("Triangle.erase()");
}
}
public class Shapes {
}
public static void main(String[] args) {
Shape[] s = new Shape[3];
}
public static void main(String[] args) {
Shape[] s = new Shape[3];
s[0]=new Circle(); //创建一个Circle对象,并把对象的句柄赋值给Shape;
s[1]=new Square();
s[2]=new Triangle ();
for(int i = 0; i < s.length; i++)
s[i].draw();
}
}
for(int i = 0; i < s.length; i++)
s[i].draw();
}
}
红色显示的那行代码创建了Circle对象,并将结果句柄立即赋给一个Shape。这表面看起来似乎属于错误操作(将一种类型分配给另一个),但实际是完全可行的——因为按照继承关系,Circle属于Shape的一种。里面的关系解释一下,可以说圆是一种图形,但是不能说图形是圆;因此编译器认可上述语句,不会向我们提示一条出错消息。
当我们调用其中一个基础类方法时(已在衍生类里覆盖):
s.draw();
同样地,大家也许认为会调用Shape的draw(),因为这毕竟是一个Shape句柄。那么编译器怎样才能知道该做其他任何事情呢?但此时实际调用的是Circle.draw(),因为后期绑定已经介入(多态性)。
当我们调用其中一个基础类方法时(已在衍生类里覆盖):
s.draw();
同样地,大家也许认为会调用Shape的draw(),因为这毕竟是一个Shape句柄。那么编译器怎样才能知道该做其他任何事情呢?但此时实际调用的是Circle.draw(),因为后期绑定已经介入(多态性)。
体会一下多态的好处:
针对从Shape衍生出来的所有东西,Shape建立了一个通用接口——也就是说,所有(几何)形状都可以描绘和删除。衍生类覆盖了这些定义,为每种特殊类型的几何形状都提供了独一无二的行为
2.向上转型
大家已知道可将一个对象作为它自己的类型使用,或者作为它的基础类型的一个对象使用。取得一个对象句柄,并将其作为基础类型句柄使用的行为就叫作“向上转型”——因为继承树的画法是基础类位于最上方。
3.覆盖与重载的概念
"重载”是指同一样东西在不同的地方具有多种含义,比如继承过程中的子类继承了父类的方法,但是子类中却有和父类名称相同的方法,只是参数不同,那么这两个方法重载;而“覆盖”是指它随时随地都只有一种含义,只是原先的含义完全被后来的含义取代了,比如继承的过程中子类把父类中的方法重新定义了,那么子类中的方法就覆盖了父类中的方法