Java基础篇(八)多态


以下内容总结于各种参考资料,仅用于督促自己的学习


多态是同一个行为具有多个不同形式或形态的能力。多态性是对象多种表现形式的体现。

Java引用变量有两个类型:编译时类型、运行时类型。编译时类型由声明该变量时使用的类型所决定,运行时类型由实际赋给该变量的类型所决定。如果两个类型不一致,就可能出现多态(Polymorphism)。
1、多态性
多态存在的三个必要性条件:
1) 继承
2) 重写(覆盖)
3) 父类引用指向子类对象
例如:

Person p = new Student();

P引用变量的编译时类型为Person,运行时类型为Student.

与方法不同的是,对象的实例变量不具备多态性。比如说p引用变量,输出某个同名实例变量时,并不是输出Student类里定义的实例变量,而输出的是Person类里定义的实例变量。

2、引用变量的强制类型转换

引用变量只能调用其编译时类型的方法,而不能调用其运行时类型的方法,因此要想调用,就必须将其强制转换成运行时类型。

类型转换运算符是小括号:(type)variable,将变量variable转换成type类型的变量。

注意:
1) 基本类型之间的转换只能在数值类型(整数型、字符型、浮点型)之间进行,但数值类型和布尔类型之间不能进行类型转换。
2) 引用类型之间的转换只能在具有继承关系的两个类型之间转换,否则编译会出现错误。如果把父类转换成子类实例,则这个对象必须实际上是子类实例才行(即编译时类型为父类类型,而运行时类型为子类类型),否则将在运行时引发ClassCastException异常。

3、instanceof运算符

考虑到进行强制类型转换时可能会出现异常,因此进行转换之前应先通过instanceof运算符来判断是否可以进行转换,使代码更健壮,它用于判断前面的对象是否是后面的类,或者其子类、实现类的实例,是,返回true,否,返回false。
举例:

public class Test {
    public static void main(String[] args) {
      show(new Man());  // 以 Man 对象调用 show 方法
      show(new Woman());  // 以 Woman 对象调用 show 方法

      Person p = new Man();  // 向上转型  
      p.walk();               // 调用的是 Man 的 walk
      Man m = (Man)p;        // 向下转型  
      p.hair();        // 调用的是 Man 的 hair
  }  

    public static void show(Person p)  {
      p.walk();  
        // 类型判断
        if (p instanceof Man)  {  // 男人的头发 
            Man m = (Man)p;  
            m.hair();  
        } else if (p instanceof Woman) { // 女人的头发
           Woman w = (Woman)p;  
            w.hair();  
        }  
    }  
}

abstract class Person {  
    abstract void walk();  
}  

class Man extends Person {  
    public void walk() {  
        System.out.println("走路快");  
    }  
    public void hair() {  
        System.out.println("头发短");  
    }  
}  

class Woman extends Person {  
    public void walk() {  
        System.out.println("走路优雅");  
    }  
    public void hair() {  
        System.out.println("头发长");  
    }  
}  

执行以上程序,输出结果为:

走路快
头发短
走路优雅
头发长
走路快
头发短

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值