您的位置:首页 > 职场人生

黑马程序员java学习笔记之二(java中的多态性)

2012-03-04 13:29 363 查看
---------------------- android培训java培训、期待与您交流! ----------------------

多态性:发送消息给某个对象,让该对象自行决定响应何种行为。通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。

多态性是通过:

1 接口和实现接口并覆盖接口中同一方法的几不同的类体现的

2 父类和继承父类并覆盖父类中同一方法的几个不同子类实现的.

java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,

但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

1. 如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类。

2. 如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。

下面通过具体的例子来体现:

第一种形式:

package diary;

class Fu

{

/*static */int num = 5;

public void method1()

{

System.out.println("fu method_1");

}

public void method2()

{

System.out.println("fu method_2");

}

public static void method4()

{

System.out.println("fu method_4");

}

public int add(int a, int b)

{

return a+b;

}

}

class Zi extends Fu

{

/*static */int num = 8;

public void method1()

{

System.out.println("zi method_1");

}

public void method3()

{

System.out.println("zi method_3");

}

public static void method4()

{

System.out.println("zi method_4");

}

public int add(int a, int b,int c)

{

return a+b+c;

}

}

public class DuoTaiDemo4

{

public static void main(String[] args)

{

Fu f = new Zi();

System.out.println(f.num);

Zi z = new Zi();

System.out.println(z.num);

f.method1();

f.method2();

//f.method3();

/*Fu f = new Zi();

System.out.println(f.num);

f.method4();

Zi z = new Zi();

z.method4();

*/

// Zi z = new Zi();

// z.method1();

// z.method2();

// z.method3();

}

}

打印结果:

5

8

zi method_1

fu method_2

分析:

由于子类覆写了父类的method_1方法,所以调用的是子类的method_1方法。子类没有覆写父类的method_2方法,所以调用的是父类的method_2方法。

第二种形式:

package diary;

// 定义一个接口

interface Shape

{

public double getArea();

}

// 定义一个圆,实现Shape接口

class Circle implements Shape{

final double PI = 3.14;

private double radius;

public Circle(double radius)

{

this.radius = radius;

}

public double getArea()

{

return PI*radius*radius;

}

}

//定义一个长方形,实现Shape接口

class Rectangle implements Shape

{

private double wid;

private double height;

public Rectangle(double wid,double height)

{

this.wid = wid;

this.height = height;

}

@Override

public double getArea() {

// TODO Auto-generated method stub

return wid*height;

}

}

public class TestShape

{

public static void main(String[] args) {

Shape s1 = new Circle(3.0); // 定义一个Circle对象,并将其引用赋给s1

Shape s2 = new Rectangle(4.0, 5.0); // 定义一个Rectangle对象,并将其引用赋给s2

System.out.println("圆的面积:"+s1.getArea());

System.out.println("长方形的面积:"+s2.getArea());

}

}

打印结果:

圆的面积:28.259999999999998

长方形的面积:20.0

多态总结:

在多态中成员函数的特点:

在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。

在运行时期:参阅对象所属的类中是否有调用的方法。

简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。

在多态中,成员变量的特点:

无论编译和运行,都参考左边(引用型变量所属的类)。

在多态中,静态成员函数的特点:

无论编译和运行,都参考做左边。

---------------------- android培训java培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: