4、面向对象

来源:互联网 发布:淘宝联盟链接转换源码 编辑:程序博客网 时间:2024/04/29 09:10
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------


面向对象:

 面相对象 (OOP) 和面向过程(OPP) 的关系

(1). 面相对象是把以前需要逐个执行的动作都全部封装起来

(2). 面向对象是基于面向过程的

    相对于面向过程的一种程序设计思想。所谓万物皆对象,每一个物体都可以看做事一个对象,每个对象都会有自己的特征和行为。例如:张三,李四,王五,这些人都有姓名,年龄,身高体重这些特征,也都会说话,走路这些行为,我们可以把他们的共性特征和行为抽取出来,用一个抽象的模型来表示,我们称之为类。这些共性特征称之为类的属性,共性行为称之为类的方法。

面向对象三大特征:
1、封装 :是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
    将对象的属性和方法一起包装到一个类中,就称之为封装。封装可以提高系统的独立性和重用性,实现数据的封装和隐藏。比如:汽车的发动机,我们可以发动,停止,但是我们不知道他到底是怎么发动和停止的,因为发动机将它的实现细节隐藏了起来,不对外公布,只对外提供了发动和停止的方法让我们使用。事实上,我们也只需要知道怎么发动和停止就行了。
   好处:将变化隔离;便于使用;提高重用性;安全性。
   封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。

2、继承:继承是类与类之间关系的一种,是一种所属关系,“isa”的关系
      不同的抽象级别之间的关系。例如:人可以抽象为Person类,学生可以抽象为Student类,但是学生肯定是一个人,我们就可以说Student类继承Person类。
   好处:
   1:提高了代码的复用性。
   2:让类与类之间产生了关系,提供了另一个特征多态的前提。
  继承体系的使用:对于一个继承体系的使用,查阅顶层父类中的内容,创建最底层子类的对象。
   【1】为什么子类对象初始化时,都需要调用父类中的函数?(为什么要在子类构造函数的第一行加入这个super()?)
    因为子类继承父类,会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。

3、多态:相同的行为可以有不同的表现方法。在Java中,多态的典型表现是重载(overloading)和覆盖(overriding)。
   体现:父类引用或者接口的引用指向了自己的子类对象。//Animal a = newCat();
   多态的好处:提高了程序的扩展性。
   多态的弊端:当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法。(前期不能使用后期产生的功能,即访问的局限性)
   多态的前提:
    1:必须要有关系,比如继承、或者实现。
    2:通常会有覆盖操作。
   多态的出现思想上也做着变化:以前是创建对象并指挥对象做事情。有了多态以后,我们可以找到对象的共性类型,直接操作共性类型做事情即可,这样可以指挥一批对象做事情,即通过操作父类或接口实现。
  转型
   (1) 向上转型:把子类的实例赋值给父类的引用 (也就是父类的引用指向了子类的实例)
         向上转型可以通过Java自动完成。
    (2)向下转型:把父类的引用强制转换成子类的引用
        向下转型通过手动强制类型转化来完成,如果不进行强制类型转换,会编译报错。
       子类引用指向了父类的实例,Java编译器可以通过!!但是在运行的时候直接抛出ClassCastException异常!!!
  多态在子父类中的成员上的体现的特点:
   (1) 成员变量:在多态中,子父类成员变量同名。
      在编译时期:参考的是引用型变量所属的类中是否有调用的成员。(编译时不产生对象,只检查语法错误)
      运行时期:也是参考引用型变量所属的类中是否有调用的成员。
      简单一句话:无论编译和运行,成员变量参考的都是引用变量所属的类中的成员变量。
      再说的更容易记忆一些:成员变量 --- 编译运行都看 = 左边。
      多态中父子类出现同名变量的时候,无论是编译还是运行的时候,都是以等式左边的父类引用为主,不会出现覆盖的情况。
   (2)成员函数。
    编译时期:参考引用型变量所属的类中是否有调用的方法。
    运行事情:参考的是对象所属的类中是否有调用的方法。
    为什么是这样的呢?因为在子父类中,对于一模一样的成员函数,有一个特性:覆盖。
    简单一句:成员函数,编译看引用型变量所属的类,运行看对象所属的类。
    更简单:成员函数 --- 编译看 = 左边,运行看= 右边。
  (3)静态函数。
    编译时期:参考的是引用型变量所属的类中是否有调用的成员。
    运行时期:也是参考引用型变量所属的类中是否有调用的成员。
    为什么是这样的呢?因为静态方法,其实不所属于对象,而是所属于该方法所在的类。
    调用静态的方法引用是哪个类的引用调用的就是哪个类中的静态方法。
    简单说:静态函数 --- 编译运行都看 = 左边。
    当子类父类中同名的静态函数的处理方式:子类父类同名静态方法是不会发生覆盖的,是以等式左边的父类引用为主。



0 0
原创粉丝点击