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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值