Java基础1:面向对象四大特性

面向对象四大特性

  • 抽象(有时候会省略)
  • 封装
  • 继承
  • 多态

抽象

将一类对象的共同特征提取出来构建的类。包括数据抽象和行为抽
象。抽象只关注对象有哪些行为和属性,而不关注具体的细节。

封装

利用抽象数据类型将对象的属性和对属性的操作封装起来,使之成为 一个整体。数据被保护起来,对外保留必要的接口。用户无需知道具体的细节,可以通过对象对外提供的接口来访问数据。

优点

  • 减少耦合:可以独立地开发、测试、优化、使用、理解和修改
    减轻维护的负担:可以更容易被程序员理解,并且在调试的时候可以不影响其他模块
  • 有效地调节性能:可以通过剖析确定哪些模块影响了系统的性能 提高软件的可重用性
  • 降低了构建大型系统的风险:即使整个系统不可用,但是这些独立的模块却有可能是可用的

如下代码,用户不需要知道name,gender,age属性的具体细节,只能通过相应的public接口实现具体的业务,保护了代码的完整性和安全性。

public class Person {

    private String name;
    private int gender;
    private int age;

    public String getName() {
        return name;
    }

    public String getGender() {
        return gender == 0 ? "man" : "woman";
    }

    public void work() {
        if (18 <= age && age <= 50) {
            System.out.println(name + " is working very hard!");
        } else {
            System.out.println(name + " can't work any more!");
        }
    }
}

继承

继承是从已有的类中得到(派生出)继承信息产生新类的过程(is-a)。在设计模式中,继承应当遵循里氏替换原则,即子类对象必须能够替换所有父类对象。

多态

不同子类型的对象对同一消息做出不同的响应。
包括运行时多态和编译时多态。

  • 运行时多态指方法的重写(程序中对象指向的具体类型要等到运行时才能够确定)。
  • 编译时多态指方法的重载。

运行时多态的条件:

  • 继承关系
  • 重写方法
  • 向上转型
public class Instrument {

    public void play() {
        System.out.println("Instument is playing...");
    }
}

//继承
public class Wind extends Instrument {

//重写父类的方法
    public void play() {
        System.out.println("Wind is playing...");
    }
}

//继承
public class Percussion extends Instrument {

//重写父类的方法
    public void play() {
        System.out.println("Percussion is playing...");
    }
}

public class Music {

    public static void main(String[] args) {
        List<Instrument> instruments = new ArrayList<>();
        //加入Wind对象
        instruments.add(new Wind());
        //加入Percussion对象
        instruments.add(new Percussion());
        for(Instrument instrument : instruments) {
        //运行时多态
            instrument.play();
        }
    }
}

Q:面向对象和面向过程的区别?用面向过程可以实现面向对象吗?

  • 面向对象和面向过程的区别
    • 面向过程就像是一个细心的管家,事无具细的都要考虑到。而面向对象就像是个家用电器,你只需要知道他的功能,不需要知道它的工作原理。
    • 面向过程是一种是“事件”为中心的编程思想。就是分析出解决问题所需的步骤,然后用函数把这些步骤实现,并按顺序调用。面向对象是以“对象”为中心的编程思想。
    • 简单的举个例子:汽车发动、汽车到站
      • 这对于 面向过程 来说,是两个事件,汽车启动是一个事件,汽车到站是另一个事件,面向过程编程的过程中我们关心的是事件,而不是汽车本身。针对上述两个事件,形成两个函数,之 后依次调用。(事件驱动,动词为主)
      • 然而这对于面向对象来说,我们关心的是汽车这类对象,两个事件只是这类对象所具有的行为。而且对于这两个行为的顺序没有强制要求。(对象驱动,名词为主,将问题抽象出具体的对象,而这个对象有自己的属性和方法,在解决问题的时候是将不同的对象组合在一起使用)
  • 用面向过程可以实现面向对象吗 ?
    • 如果是 C 语言来展现出面向对象的思想,C 语言中是不是有个叫结构体的东西,这个里面有自己定义的变量 可以通过函数指针就可以实现对象

Q:面向对象开发的六个基本原则

  • 单一原则:一个类应该仅有一个引起它变化的原因。
  • 里氏替换原则:任何时候子类型能够替换掉它们的父类型。
  • 开闭原则:软件实体应当对扩展开放,对修改关闭。
  • 依赖倒置原则:要依赖于抽象,不要依赖于具体类。
  • 接口隔离:不应该强迫客户依赖于他们不用的方法 。
  • 最少知道原则(迪米特法则):只和你的朋友谈话。

猜你喜欢

转载自blog.csdn.net/greenjoe/article/details/83624751
今日推荐