Java多态性的理解
2009-11-05 20:56:45 来源:WEB开发网核心提示:多态的目的通过类型转换,把一个对象当作它的基类对象对待,Java多态性的理解, 从相同的基类派生出来的多个派生类可被当作同一个类型对待,可对这些不同的类型进行同样的处理,然后用Shape类型的引用调用,view plaincopy to clipboardprint?package cn.edu.uibe.poly;
多态的目的
通过类型转换,把一个对象当作它的基类对象对待。
从相同的基类派生出来的多个派生类可被当作同一个类型对待,可对这些不同的类型进行同样的处理。
这些不同派生类的对象响应同一个方法时的行为是有所差别的,这正是这些相似的类之间彼此区别的不同之处。
动态绑定
将一个方法调用和一个方法主体连接到一起称为绑定(Binding)。
根据绑定的时机不同,可将绑定分为“早期绑定”和“后期绑定”两种。
如果在程序运行之前进行绑定(由编译器和链接程序完成),称为早期绑定。
如果在程序运行期间进行绑定,称为后期绑定,后期绑定也称为“动态绑定”或“运行时绑定”。
在java中,多态性是依靠动态绑定实现的,即Java虚拟机在运行时确定要调用哪一个同名方法。
多态的应用
由于多态性,一个父类的引用变量可以指向不同的子类对象,并且在运行时根据父类引用变量所指向对象的实际类型执行相应的子类方法。
利用多态性进行二次分发。
利用多态性设计回调方法。
多态的例子
Shape类是几个具体图形类的父类
view plaincopy to clipboardPRint?
package cn.edu.uibe.poly;
public class Shape {
public void draw(){
System.out.println("Shape.draw()");
}
}
package cn.edu.uibe.poly;
public class Shape {
public void draw(){
System.out.println("Shape.draw()");
}
}
Rectangle类是Shape类的一个子类
view plaincopy to clipboardprint?
package cn.edu.uibe.poly;
public class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("画矩形");
}
}
package cn.edu.uibe.poly;
public class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("画矩形");
}
}
Circle类也是Shape类的子类
view plaincopy to clipboardprint?
package cn.edu.uibe.poly;
public class Circle extends Shape{
@Override
public void draw() {
System.out.println("画圆");
}
}
package cn.edu.uibe.poly;
public class Circle extends Shape{
@Override
public void draw() {
System.out.println("画圆");
}
}
Triangle类是Shape类的另外一个子类
view plaincopy to clipboardprint?
package cn.edu.uibe.poly;
public class Triangle extends Shape{
@Override
public void draw() {
System.out.println("画三角形");
}
}
package cn.edu.uibe.poly;
public class Triangle extends Shape{
@Override
public void draw() {
System.out.println("画三角形");
}
}
ShapeDemo类中随机生成矩形、圆、三角形,然后用Shape类型的引用调用。
view plaincopy to clipboardprint?
package cn.edu.uibe.poly;
import java.util.*;
public class ShapeDemo {
Random rand = new Random();
public Shape createShape(){
int c = rand.nextInt(3);
Shape s = null;
switch(c){
case 0:
s = new Rectangle();
break;
case 1:
s = new Circle();
break;
case 2:
s = new Triangle();
break;
}
return s;
}
public static void main(String[] args) {
ShapeDemo demo = new ShapeDemo();
Shape[] shapes = new Shape[10];
for(int i=0;i<shapes.length;i++){
shapes[i] = demo.createShape();
}
for(int i=0;i<shapes.length;i++){
shapes[i].draw();//同样的消息,不同的响应
}
}
}
package cn.edu.uibe.poly;
import java.util.*;
public class ShapeDemo {
Random rand = new Random();
public Shape createShape(){
int c = rand.nextInt(3);
Shape s = null;
switch(c){
case 0:
s = new Rectangle();
break;
case 1:
s = new Circle();
break;
case 2:
s = new Triangle();
break;
}
return s;
}
public static void main(String[] args) {
ShapeDemo demo = new ShapeDemo();
Shape[] shapes = new Shape[10];
for(int i=0;i<shapes.length;i++){
shapes[i] = demo.createShape();
}
for(int i=0;i<shapes.length;i++){
shapes[i].draw();//同样的消息,不同的响应
}
}
}
通过类型转换,把一个对象当作它的基类对象对待。
从相同的基类派生出来的多个派生类可被当作同一个类型对待,可对这些不同的类型进行同样的处理。
这些不同派生类的对象响应同一个方法时的行为是有所差别的,这正是这些相似的类之间彼此区别的不同之处。
动态绑定
将一个方法调用和一个方法主体连接到一起称为绑定(Binding)。
根据绑定的时机不同,可将绑定分为“早期绑定”和“后期绑定”两种。
如果在程序运行之前进行绑定(由编译器和链接程序完成),称为早期绑定。
如果在程序运行期间进行绑定,称为后期绑定,后期绑定也称为“动态绑定”或“运行时绑定”。
在java中,多态性是依靠动态绑定实现的,即Java虚拟机在运行时确定要调用哪一个同名方法。
多态的应用
由于多态性,一个父类的引用变量可以指向不同的子类对象,并且在运行时根据父类引用变量所指向对象的实际类型执行相应的子类方法。
利用多态性进行二次分发。
利用多态性设计回调方法。
多态的例子
Shape类是几个具体图形类的父类
view plaincopy to clipboardPRint?
package cn.edu.uibe.poly;
public class Shape {
public void draw(){
System.out.println("Shape.draw()");
}
}
package cn.edu.uibe.poly;
public class Shape {
public void draw(){
System.out.println("Shape.draw()");
}
}
Rectangle类是Shape类的一个子类
view plaincopy to clipboardprint?
package cn.edu.uibe.poly;
public class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("画矩形");
}
}
package cn.edu.uibe.poly;
public class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("画矩形");
}
}
Circle类也是Shape类的子类
view plaincopy to clipboardprint?
package cn.edu.uibe.poly;
public class Circle extends Shape{
@Override
public void draw() {
System.out.println("画圆");
}
}
package cn.edu.uibe.poly;
public class Circle extends Shape{
@Override
public void draw() {
System.out.println("画圆");
}
}
Triangle类是Shape类的另外一个子类
view plaincopy to clipboardprint?
package cn.edu.uibe.poly;
public class Triangle extends Shape{
@Override
public void draw() {
System.out.println("画三角形");
}
}
package cn.edu.uibe.poly;
public class Triangle extends Shape{
@Override
public void draw() {
System.out.println("画三角形");
}
}
ShapeDemo类中随机生成矩形、圆、三角形,然后用Shape类型的引用调用。
view plaincopy to clipboardprint?
package cn.edu.uibe.poly;
import java.util.*;
public class ShapeDemo {
Random rand = new Random();
public Shape createShape(){
int c = rand.nextInt(3);
Shape s = null;
switch(c){
case 0:
s = new Rectangle();
break;
case 1:
s = new Circle();
break;
case 2:
s = new Triangle();
break;
}
return s;
}
public static void main(String[] args) {
ShapeDemo demo = new ShapeDemo();
Shape[] shapes = new Shape[10];
for(int i=0;i<shapes.length;i++){
shapes[i] = demo.createShape();
}
for(int i=0;i<shapes.length;i++){
shapes[i].draw();//同样的消息,不同的响应
}
}
}
package cn.edu.uibe.poly;
import java.util.*;
public class ShapeDemo {
Random rand = new Random();
public Shape createShape(){
int c = rand.nextInt(3);
Shape s = null;
switch(c){
case 0:
s = new Rectangle();
break;
case 1:
s = new Circle();
break;
case 2:
s = new Triangle();
break;
}
return s;
}
public static void main(String[] args) {
ShapeDemo demo = new ShapeDemo();
Shape[] shapes = new Shape[10];
for(int i=0;i<shapes.length;i++){
shapes[i] = demo.createShape();
}
for(int i=0;i<shapes.length;i++){
shapes[i].draw();//同样的消息,不同的响应
}
}
}
更多精彩
赞助商链接