对面向对象的认识

面向对象是区别于面向过程的,它是把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象。对同类对象抽象出其共性,即类。

面向过程是以事件为中心的开发方法,自顶向下顺序执行。

面向对象特征:抽象、继承、封装、多态

抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面:一是过程抽象;二是数据抽象

继承:继承实现了IS-A关系,例如Cat和Animal就是一种IS-A关系,因此Cat可以继承自Animal非private的属性和方法。Cat可以当作Animal来使用,也就是说可以使用Animal引用Cat对象。继承应该遵循里氏替换原则(子类对象必须能够替换掉所有父类对象,子类需要能够当成父类来使用,并且需要比父类更特殊),如果不满足这个原则,各个子类的行为上就会有很大差异,增加继承体系的复杂度。

Animal animal = new Cat();//父类引用指向子类对象(向上转型)

封装:利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能的隐藏内部细节,只保留一些对外接口使之与外部发生联系。用户无须知道对象内部的细节,但是通过对象对外提供的接口来访问该对象。

封装的好处:减少耦合、隐藏内部细节,因此内部结构可以自由修改、可以对成员进行更精确的控制(比如在setter方法中加值合法判断)。

//Person类封装name,gender,age属性
public class Person {
    private String name;
    private String gender;
    private String age;
    //只能通过get()方法获取Person对象的name属性和gender属性,无法获取age属性,但是age属性可以供work()方法使用
    public String getName(){
        return name;
    }
    //gender属性使用int数据类型进行存储,封装使得用户注意不到这种实现细节。在修改gender属性使用的数据类型时,也不影响客户端代码
    public String getGender(){
        return gender ==0 ? "male" :"female"
    }
    public void work(){
    if(18 <= age) {System.out.println(name + "can't work!")}
    else{System.out.println(name + "can work!")}
}
}

多态:多态表示当同一个操作作用在不同对象时,会有不同的语义,从而产生不同的结果。多态分为编译时多态和运行时多态。编译时多态主要指方法的重载(Overload),运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定。运行时多态有三个条件:继承、覆盖(Override)、向上转型。

重载:方法的重载,指同一个类中有多个同名的方法,但这些方法有不同的参数,因此在编译时就可以确定到底调用哪个方法,重载可以被看作一个类中的方法多态性。

覆盖:方法的覆盖,子类可以覆盖父类的方法,因此同样的方法会在父类与子类中有不同的表现形式。在Java中,基类的引用变量不仅可以指向基类的实例对象,也可以指向其子类的实例对象。而程序调用的方法在运行期间才动态绑定(绑定是指将一个方法调用和一个方法主体连接到一起),就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。通过动态绑定的方法实现了多态。由于只有运行时才能确定调用哪个方法,因此通过方法覆盖实现的多态也可以被称为运行时多态。成员变量是无法实现多态的。子类和基类被覆盖的方法有相同的函数名和参数,返回值类型必须相同。

根据资料整理

猜你喜欢

转载自blog.csdn.net/u013015065/article/details/79704063