zoukankan      html  css  js  c++  java
  • linkin大话面向对象--多态



    java引用变量有2个类型,一个是编译时类型,一个是运行时类型:
    编译时类型:声明的类型,把它看做是什么东西
    运行时类型:真正的类型,实际上指的是什么东西


    如果编译时类型和运行时类型不同,就出现多态。相同类型的变量,调用同一个方法时呈现出多种不同的行为特征,这就是多态。

    注意这个定义里面的关键字:方法。和方法不同,对象的属性不具备多态性。

    编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给变量的对象决定。记住下面一句话就好:编译决定类型,运行绑定对象


    • 当一个引用类型的变量若声明为父类的类型,但实际上引用的是子类的对象(多态情况):
    此时该变量不能再访问子类中自己特有的字段和方法;
    若子类覆写了父类的方法,那么此时通过变量访问到的方法,实际上是子类的方法;


    • 实现多态的机制:
    父类的引用变量可以指向子类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的真正实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。 
    • 多态的作用:
    把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。只修改方法的实现,不必修改方法的声明。多态的使用,一般都会出现三方,第一方是父类,第二方是子类,第三方是调用多态的方法。


    继承是多态产生的前提条件:
    编译时多态:方法重载
    运行时多态:方法覆写 注意:静态方法不能被覆写!


    • 引用变量类型转换
    向上转型(子类→父类):(自动完成)  父类名称 父类对象 = 子类实例 ;

    向下转型(父类→子类):(强制完成)  子类名称 子类对象 = (子类名称)父类实例           对象名   instanceof  类;

    判断指定的变量名此时引用的真正类型是不是当前给出的类或子类;注意: 对象的类型和 类必须有继承关系。

    在进行强制类型转换之前,先用instanceof运算符判断是否可以成功转换,从而避免出现ClassCastException异常,这样可以使程序更加健壮。


    关于多态,代码如下:

    /**
     *
     * @version 1L
     * @author  LinkinPark 
     * @since   2014-10-28
     * @motto   梦似烟花心似水,同学少年不言情
     * @desc    ^多态的含义:编译决定类型,运行绑定对象,只是单纯的讲方法,和属性木有关系的
     */
    public class SubClass extends BaseClass{
        public String name = "LinkinPark";
        
        @Override
        public void test(){
            System.out.println("当你的才华撑不起你的野心的时候,就该默默的学习了,,,");
        }
        public void test2(){
            System.out.println("面向对象,春暖花开,,,");
        }
        
        public static void main(String[] args) {
            //以下2行运行时类型和编译时类型一致,不会发生多态
            SubClass subClass = new SubClass();
            BaseClass baseClass = new BaseClass();
            //下面运行时类型和编译时类型不一致,发生多态
            BaseClass linkin = new SubClass();
            //多态是针对方法来说的,属性不具备多态性,所以编译时是什么类型,就调用那个类型的属性值
            System.out.println(linkin.name);
            //子类的方法覆盖父类方法,调用子类方法
            linkin.test();
            //子类中不存在这个方法,那么只能调用父类的了
            linkin.test1();
            //尽管运行时类型是子类,但是编译的时候仍然不能调用子类的方法,除非向下强转
            //linkin.test2();
            //养成良好的习惯,在强制类型转换时候都要instanceof下判断下类型
            if(linkin instanceof SubClass){
                ((SubClass)linkin).test2();
            }
        }
    }
    
    class BaseClass{
        public String name = "Binger";
        public void test(){
            System.out.println("你以为你以为的真是就是你以为的么???");
        }
        public void test1(){
            System.out.println("梦想终究还是要有的,万一实现了呢,,,");
        }
    }









  • 相关阅读:
    WeChat-SmallProgram:组件 scroll-view 横向和纵向 案例
    Codeforces Round #277 (Div. 2) D. Valid Sets 树形DP
    Codeforces Round #243 (Div. 2) E. Sereja and Two Sequences DP
    Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp
    Codeforces Round #259 (Div. 2) D. Little Pony and Harmony Chest 状压DP
    Codeforces Round #274 (Div. 2) E. Riding in a Lift DP
    HDOJ 6069 素数筛
    在平面中,一个点绕任意点旋转θ度后的点的坐标
    HDOJ 5724 博弈SG函数
    Codeforces Round #422 (Div. 2) C. Hacker, pack your bags! 排序+贪心
  • 原文地址:https://www.cnblogs.com/LinkinPark/p/5233165.html
Copyright © 2011-2022 走看看