05多态

多态

什么是多态:事物存在的多种形态
  1. 多态的前提:

    • 要有继承关系
    • 要有方法重写
    • 要有父类引用指向子类对象
  2. 多态的几种方式

    • 成员变量

      • 访问成员变量时遵循的原则:编译看左边(父类),运行看左边(父类)

        package asdf.com.cn;
        
        public class Main {
            public static void main(String[] args) {
                Father f = new Son();
                System.out.println(f.num);// 10
                Son s = new Son();
                System.out.println(s.num); // 20
            }
        }
        
        /*
        * 多态的三个条件:缺一不可
        * 1.继承
        * 2.重写
        * 3.父类指引用向子类
        4.一般不直接使用父类指引用向子类,而是当做参数,扩展性强
        * */
        class Father {
            public Father () {}
            int num = 10;
        }
        
        class Son extends Father{
            public Son () {}
            int num = 20;
        }
        

在这里插入图片描述成员变量

  • 成员方法

    • 访问成员方法的特点:编译看左边(父类),运行看右边(子类)
      多态--方法的特点
  • 静态变量

  • 访问成员方法的特点

  • 静态方法

    • 编译看左边(父类),运行看左边(父类)- 静态的叫做静态绑定,动静本身就是相对的,非静态的就叫做动态绑定

      (静态和类相关,算不上重写,所以,访问的还是左边)
      只有非静态的成员方法,编译看左边,运行看右边,其他的都是编译看左边,运行看左边
    • class Person{
          public static void prient() {
         		System.out.println("Person里面的静态");
      	}
      }
      class Son extends Person {
          public static void prient() {
         		System.out.println("Son里面的静态");
      	}
      }
      // 调用的时候
      class Main {
          public static void main(String[] args) {
              Person p = new Son();
              p.prient();          //这里相当于是类名.方法---》Person.prient(),很显然调用的是父类的方法。所以编译看左边,运行看左边。
          }
      

案例

向上转型
  • Person p = new SuperMan(); // 父类引用指向子类对象,超人被提升成了人
    
向下转型
package asdf.com.cn;

public class Main {
    public static void main(String[] args) {
        Person p = new SuperMan(); // 父类引用指向子类对象,超人被提升成了人,这本身就是向上转型
        System.out.println(p.name);
        SuperMan sm = (SuperMan)p; // 向下转型,前提是被向上转型过
        sm.fly(); // 如果上面没有进行转型,这里编译时会报错

        //基本数据类型自动类型提升和强制类型转换
        int i = 10;
        byte b = 20;
        i = b; // 这种为自动类型提升
        // 如果这里使用 b = i 会报错,只能由低的向高的提升,反过来不行,没办法,只能强了
        b = (byte)i; // 这种为强制类型转换
    }
}

/*
* 多态的三个条件:缺一不可
* 1.继承
* 2.重写
* 3.父类指向子类引用
* */
class Person {
   String name = "john";
   public void talkMoney () {
       System.out.println("谈生意");
   }
}

class SuperMan extends Person{
    String name = "Superman";
    public void talkMoney () {
        System.out.println("谈一个亿的生意");
    }

    public void fly () {
        System.out.println("飞出去救人");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值