java 面向对象编程 多态

多态

  • 基本介绍:

    方法或对象具有多种形态。多态是建立在封装和继承基础之上的

  • 多态的具体表现

    (1)方法多态:方法重载就是典型的方法多态

    (2)对象的多态:(核心 )

    ①一个对象的编译类型和运行类型可以不一致

    ②编译类型在定义对象时就确定了,不能改变

    ③运行类型是可以变化的

    ④编译类型看定义时 = 的左边,运行类型看 = 右边

  • 细节和各种注意事项

    多态的前提是:两个对象(类)之间存在继承关系

多态的向上转型

(1)本质:父类的引用指向了子类

(2)语法:父类类型 引用名 = 子类类型

(3)特点:编译类型看左边,运行类型看右边

可以调用父类中的所有成员(须遵守访问权限)

不能调用子类中特有成员

多态的向下转型

(1)语法:子类类型 引用名 = (子类类型)父类引用

(2)只能强转父类的引用,不能强转父类的对象

(3)要求父类的引用必须指向的是当前目标类型的对象

(4)当向下转型后,可以调用子类类型中所有的成员

!!!属性没有重写这个说法,直接看编译类型

例:

public class Test {
    public static void main(String[] args){
       Base base = new num();
       System.out.println(base.count);
    }
}
class Base{
    public int count = 10;
}
class num extends Base {
    public int count = 100;
}
//输出的结果是 10
  • instanceof比较操作符,用于判断对象的运行类型是否为XX类型或XX类型的子类型

public class Test {
    public static void main(String[] args){
       Base base = new num();
        System.out.println(base instanceof num);//true()
        System.out.println(base instanceof Base);//true
    }
}
class Base{}
class num extends Base {}

练习:

判断下面的每条语句,说出原因

public class PolyExercise01{
    public static void main(String args){
        double d = 13.4;//ok
        long l = (long)d;//ok double-->long可以自动转换
        System.out.println(l);
        int in = 5;//ok
        boolean b =(boolean)in;//false 不能把一个int型转化为boolean型
        Object obj = "hello";//ok 向上转型,把String型转为了Object
        String objStr =(String)obj;//ok ,向下转型
        System.out.println(objStr);
        
        Object objPri = new Integer(5);//ok ,向上转型
        String str = (String)objPri;//false , objPri已经指向了integ,强转不过来
        integer str1 = (Integer)objPri;//ok向下转型
    }
}

java动态绑定机制(!!!!重中之重)

(1)当调用对象方法时,该方法回合该对象的内存地址/运行类型绑定

(2)当调用对象属性时,没有动态绑定机制,那里声明那里使用。

public class Test {
    public static void main(String[] args){
       D a = new E();
        System.out.println(a.display());
    }
}
class D{
    public int count = 10;
    public int display(){
        return get1()+20;
    }
    public int get1(){
        return count;
    }
}
class E extends D{
    public int count = 100;

//    public int display() {
//        return get1();
//    }
    public int get1(){
        return count;
    }
}//输出 120 
//!!!只要是方法,就去子类中找,只要是属性,就在本类中找

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值