封装、继承与多态

 

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

封装的概念

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

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

 


 

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

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

       继承体现的是一种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

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

 

posted @ 2016-03-20 21:39  穆清  阅读(173)  评论(0编辑  收藏  举报