Java多态的理解

只是小白的学习笔记,有错轻喷🥬

除封装和继承之外,面向对象程序设计的第三个支柱。简单来说,多态意味着父类型的变量可以引用子类型的对象

💡 多态:同一个行为具有不同表现形式或形态的能力,即对象多种表现形式的体现,例如子类的实例也可作为父类的实例(Student类是Person类的子类,则一个Student的对象便既是Student,也是Person)


  • 定义与使用格式

    定义格式:父类类型 变量名=new 子类类型();

    例如,通过Object p = new Person(); 代码定义一个变量p

  • 多态中成员的特点

    成员变量:

    Father f=new Son();
    System.out.println(f.num);//f是Father中的值,只能取到父中的值
    

    成员方法:

    Father f1=new Son();
    System.out.println(f1.show());//f1的门面类型是Father,但实际类型是Son,所以调用的是重写后的方法。
    

    例如Object p = new Person();中的变量p只能调用Person类的方法,只能访问Object类的属性

如图所示,扫描二维码可以对映三种不同的支付方式

//支付抽象类或者接口
public abstract class Pay {
    abstract public String pay();
}
//支付宝支付
public class AliPay extends Pay {
    @Override
    public String pay() {
        System.out.println("支付宝pay");
        return "success";
    }
}
//微信支付
public class WeixinPay extends Pay {
    @Override
    public String pay() {
        System.out.println("微信pay");
        return "success";
    }
}
//银联支付
public class YinlianPay extends Pay {
    @Override
    public String pay() {
        System.out.println("银联支付");
        return "success";
    }
}

//测试支付
public static void main(String[] args) {
 //支付宝支付
    Pay pay = new AliPay();
    pay.pay();

 //微信支付
    pay = new WeixinPay();
    pay.pay();

 //银联支付
    pay = new YinlianPay();
    pay.pay();
}

输出结果如下:

支付宝pay
微信pay
银联支付
  • 多态产生的必要条件

    1. 继承
    2. 重写
    3. 父类引用指向子类对象
  • 多态的转换

     💡 对象转换:一个对象的引用可以类型转换为对另外一个对象的引用


    1. 隐式转换

      将对象 new Student() 赋值给一个 Object 类型的参数→ Object o = new Student();

      由于Student的实例也是Object的实例,所以语句合法。

    2. 显式转换

      Object o = new Student();
      Student b = o;//编译错误
      

      编译错误原因:通过隐式转换虽然看上去o是一个Student的实例,但是本质仍然为Object,故不能赋值给Student类型的b

      //将(目标对象的类型)放到要转换的对象前面
      Object o = new Student();
      Student b = (Student)o;
      
    3. 向上转换(多态本身就是向上转型过的过程)

      将子类的实例转换为父类的变量

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

    4. 向下转换(使用(子类名)进行显示转换)

      将父类的实例转换为子类变量

      子类类型 变量名=(子类类型) 父类类型的变量;

  • instanceof操作符

    💡 instanceof操作符:用来判断某个对象是否属于某种数据类型,返回值为布尔类型


  • 多态的优点
  1. 可替换性。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如椭圆,也同样工作。
  2. 可扩充性。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性,继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,对等边三角形的操作,不会影响直角三角形
  3. 接口性。多态是超类通过方法签名, 向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
  4. 灵活性。它在应用中体现了灵活多样的操作,提高了使用效率。
  5. 简化性。简化了对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。​​​​​​​
//实例
public class A {
    public String show(D obj) {
        return ("A and D");
    }

    public String show(A obj) {
        return ("A and A");
    } 

}

public class B extends A{
    public String show(B obj){
        return ("B and B");
    }
    
    public String show(A obj){
        return ("B and A");
    } 
}

public class C extends B{

}

public class D extends B{

}

public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();
        
        System.out.println("1--" + a1.show(b));
        System.out.println("2--" + a1.show(c));
        System.out.println("3--" + a1.show(d));
        System.out.println("4--" + a2.show(b));
        System.out.println("5--" + a2.show(c));
        System.out.println("6--" + a2.show(d));
        System.out.println("7--" + b.show(b));
        System.out.println("8--" + b.show(c));
        System.out.println("9--" + b.show(d));      
    }
}
//摘自https://blog.csdn.net/thinkGhoster/article/details/2307001
//运行结果
1--A and A
2--A and A
3--A and D
4--B and A
5--B and A
6--A and D
7--B and B
8--B and B
9--A and D

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值