多态

多态

多态概念:

同一个对象(事物),在不同时刻体现出来的不同状态。

多态的前提:

A:要有继承关系。

必须有子父类关系或类实现接口关系

B:要有方法重写。

原因:如果没有的话,在编译时期是过不去的 在编译时只知道他自己的方法 编译时不管他new的对象 当然这个时候是强制类型转换的 其实没有也是可以的,但是如果没有这个就没有意义。 动物 d = new 猫(); d.show(); 动物 d = new 狗(); d.show();

C:要有父类引用指向子类对象。

​ 必须有父类引用指向子类对象或接口引用指向实现类对象

  • 父类类名 变量名 = new 子类类名();

  • 接口名 变量名 = new 接口实现类();

多态中的成员访问特点:

A:成员变量 编译看左边,运行看左边。 B:构造方法 创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。 C:成员方法 编译看左边,运行看右边。 D:静态方法 编译看左边,运行看左边。 (静态和类相关,算不上重写,所以,访问还是左边的)

由于成员方法存在方法重写,所以它运行看右边。

成员变量:属于静态绑定成员方法:属于动态绑定

多态的好处:

A:提高了代码的维护性(继承保证)

B:提高了代码的扩展性(由多态保证)

C:提高了代码的复用性。

多态的弊端:

不能使用子类的特有功能。

多态的使用场景

  • 作为方法的形式参数,可以接收更多数据类型的对象。

  • 作为方法的返回值类型,可以方法更多的数据类型的对象

    多态的转型
    • 向上转型:父类引用指向子类对象的过程就是向上转型的结果。

    Animal a = new Dog();
    • 向下转型:将父类引用强制转换为子类引用的过程

    格式:子类类型 变量名 = (子类类型)父类引用;

    instanceof关键字

    • 作用:用来判断多态后父类引用到底指向哪个子类类型的对象。

    • 格式:boolean b = 引用变量 instanceof 类名或接口名;

    • 注意事项:如果instanceof关键字后面的是类名,则要求引用变量和类之间有子父类关系。

/*
 多态:同一个对象(事物),在不同时刻体现出来的不同状态。
 举例:
  猫是猫,猫是动物。
  水(液体,固体,气态)。
  
 多态的前提:
  A:要有继承关系。
  B:要有方法重写。原因:如果没有的话,在编译时期是过不去的  
                  在编译时只知道他自己的方法   编译时不管他new的对象 
         当然这个时候是科强制类型转换的 
   其实没有也是可以的,但是如果没有这个就没有意义。
    动物 d = new 猫();
    d.show();
    动物 d = new 狗();
    d.show();
  C:要有父类引用指向子类对象。
   父 f =  new 子();
   
 用代码体现一下多态。
 
 多态中的成员访问特点:
  A:成员变量
   编译看左边,运行看左边。
  B:构造方法
   创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
  C:成员方法
   编译看左边,运行看右边。
  D:静态方法
   编译看左边,运行看左边。
   (静态和类相关,算不上重写,所以,访问还是左边的)
   
  由于成员方法存在方法重写,所以它运行看右边。
*/
class Fu {
 public int num = 100;

 public void show() {
  System.out.println("show Fu");
 }
 
 public static void function() {
  System.out.println("function Fu");
 }
}

class Zi extends Fu {
 public int num = 1000;
 public int num2 = 200;

 public void show() {
  System.out.println("show Zi");
 }
 
 public void method() {
  System.out.println("method zi");
 }
 
 public static void function() {
  System.out.println("function Zi");
 }
}

class DuoTaiDemo {
 public static void main(String[] args) {
  //要有父类引用指向子类对象。
  //父 f =  new 子();
  Fu f = new Zi();
  System.out.println(f.num);
  //找不到符号
  //System.out.println(f.num2);
  
  f.show();
  //找不到符号
  //f.method();
  f.function();
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值