zoukankan      html  css  js  c++  java
  • 封装、继承与多态

     

    • 面向对象的三大特征:封装、继承与多态

    封装的概念

        将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问

    • 封装的好处:只能通过规定方法访问数据、隐藏类的实现细节、方便加入控制语句、方便修改实现

     


     

    继承:在父类的基础上创建更为特殊的子类的一种机制

       继承的最大功能:体现代码的复用

           继承体现的是一种is-a关系

           关联体现的是has-a关系

      特点: java中的继承是单继承(extends关键字后面只能有一个父类)

       Everything is Object,任何一个类都直接或者间接的继承了Object类

       类继承父类的特征和行为,使得子类具有父类的非私有属性和方法

       子类除了具有父类的特征和行为,还具有一些自己特殊的特征和行为。

    •  带有继承关系的子类创建对象的步骤:

      1.分配内存(父类对象和子类对象)

      2.递归的构造父类对象(先调用父类构造器,默认调用父类无参构造器,如果父类没有无参构造器,子类也没有显示地调用父类的有参构造器,编译失败)

      3.初始化属性

      4.调用构造器

     


     

    java中的访问修饰符(Access Modifier):

    • 访问修饰符可以修饰:属性,方法,类 (接口,抽象类)

                     

     本类 

     同包中的其它类

    不同包的子类

     任意类

    private(本类)   

      YES

            NO

      NO

       NO

    (defult)(本包)

      YES 

        YES 

       NO

       NO

    protected(子类)

      YES

       YES

       YES

       NO

    public(公共)

      YES

       YES

       YES

       YES

     


     

    方法覆盖(方法重写Override ):

    •  要求

    1. 在继承关系中,子类有一个方法和父类的方法同名

    2. 参数列表一致

    3. 访问修饰符大于等于父类方法的访问修饰符

     


     

    多态

    ( 参考文章:http://www.cnblogs.com/jack204/archive/2012/10/29/2745150.html )

    • 程序的最终状态只有在执行过程中才能被决定,而非在编译期间就决定了。
    • 父类的变量指向子类的对象;一个接口类型变量引用实现类的对象。
      •     例如:Aimal dog=new Dog();

    多态存在的3个必要条件

    • 要有继承
    • 要有方法重写
    • 父类引用指向子类对象

    引用对象的两种类型:

    • 编译时类型(模糊一点,一般是一个父类),有声明的类型决定
    • 运行时类型(运行时,具体是哪个子类就是那个子类),有实际对应的对象类型决定

      

    多态中方法调用的特点:

    • 子类有,父类没有,编译失败。
      • 提示:找不到符号。因为引用变量是父类类型,编译器在父类的方法表中查找方法,找不到,编译失败。
    • 子类重写了父类的非静态方法,调用子类方法
    • 子类重写了父类的静态方法,调用当前引用类型变量类型中的方法(父类)。

    编译期根据引用类型变量所属的类型方法表中是否有调用的方法,没有编译失败。

    运行期根据在堆中创建对象的实际类型找到对应的方法表,从中确定具体的方法在内存中的位置。

     总之:只有实例方法有多态作用,其他成员全部没有。

    多态中成员变量的特点:

    无论编译期还是运行期,都只参考引用类型变量所属的类中是否有对象的成员变量。

     (参考文章: http://blog.csdn.net/xiaochuhe_lx/article/details/9126325 )


     

    对象类型之间的类型转化:

    class Animal

    class Dog extends Animal

    class Hashiqi extends Dog

    class Cat extends Animal

    1.向上自动转型

           Hashiqi  h=new Hashiqi();

          Dog  d=h;

          Animal  a=h;

          Object  aa=h;

          Dog  d=new Dog();

           Animal  a=d;//向上转型

          Animal c=new Dog();

          Object  ages=new int[10];

    2.向下强制转型

           Animal a=new Hashiqi();

          Dog  d=(Dog)a;

          Hashiqi  h=(Hashiqi)a;

          Cat  c=(Cat)a;//ClassCastException(类型转化异常)

     


     

    super关键字

           构造器和方法,都用关键字super指向父类,但是用的方法不一样。

           方法用这个关键字去执行被重写的父类中的方法。构造器使用super

           去调用父类中的构造器。而且这行代码必须放在子类构造器的第一行,否则编译将出错。

     

  • 相关阅读:
    Ng-model undefined in the controller
    使用nvm进行node多版本管理
    AngularJS内置指令
    angularjs ng-switch
    Interpreting NotifyCollectionChangedEventArgs zz
    XAML控件不可访问,它具有一定的保护级别
    WPF RadioButton的绑定
    WPF中的ObservableCollection数据绑定
    C#语法中一个问号(?)和两个问号(??)的运算符是什么意思?zz
    python 获取mac地址zz
  • 原文地址:https://www.cnblogs.com/tsai/p/5299773.html
Copyright © 2011-2022 走看看