---------------------- 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培训、期待与您交流! ----------------------