Java 面向对象

1. 什么是面向对象

  • Java 的核心思想就是:OOP

1.1 面向过程 与 面向对象

  • 面向过程
    步骤清晰简单,按步骤执行
  • 面向对象
    物以类聚,分类的思维模式。面对问题先分类,再单一思考,对最后的细节进行面向过程的思索
    适合处理复杂的事物
  • 宏观上,通过面向对象的思路分析;微观上,通过面向过程的思路出路

面向过程和面向对象的区别

  • 面向过程:性能优于面向对象。
  • 面向对象:易维护、易扩展、易复用

面向过程性能比面向对象高?

  • 由于Java是半编译语言,最终的执行代码不是CPU可执行的二进制机器码。
  • 而面向过程的语言大多数是直接编译成机器码来执行,但是有一些脚本语言性能也不一定比Java好。

1.2 什么是面向对象

  • 面向对象编程:OOP (Object-Oriented Programming)
  • 面向对象的本质:以类的方式组织代码,以对象的形式封装数据。
  • 抽象
  • 三大特性
  • 封装
  • 继承
  • 多态
  • 从认识的角度先有对象 后有 类。类是抽象的,是对对象的抽象
  • 从代码的角度是先有类再有对象

1.3 方法

  • 静态方法与类一起加载的,非静态方法对象实例化之后才加载。因此静态方法可直接通过类调用。

2. 创建对象

  • 使用 new 关键字创建对象
  • 创建对象时除了分配内存空间外,还会给 创建好的对象 进行默认的初始化以及对类中的构造器的调用
  • 类中的构造器也称为构造方法,是创建对象时 必须要调用的。
  • 构造方法的特点
  1. 必须与类的名字相同
  2. 必须没有返回值类型,也不能写 void
  3. 构造函数分为:无参构造和有参构造
  • 构造函数的作用
  1. new 本质再调用构造函数
  2. 初始化对象的值

2.1 小结

  • 类与对象
    类是抽象的,对象是实例化的对象
    类的属性
  1. 静态的属性:
  2. 动态的行为:方法
  • 对象的引用:对象是通过引用来操作的:栈--->堆
  • 对象的创建和使用
  1. 必须使用 new 关键字,构造器
  2. 对象的属性

3. 三大特性

  • 程序设计追求 高内聚,低耦合
  • 高内聚:类的内部数据操作细节自己完成,不允许外部干涉
  • 低耦合:仅暴露少量的方法给外部使用

3.1 封装

  • (数据的隐藏)通常,应禁止直接访问一个对象中数据的实际表示,而应通过接口来访问
  • 属性私有:get / set
  • 封装的作用
  • 提高了代码的安全性
  • 隐藏了代码的实现细节
  • 统一接口
  • 可维护性提高了

3.2 继承

  • 继承的本质是某一批类的抽象,从而实现更好的建模
  • extends ; 子类是父类的扩展
  • Java 只可以单继承
  • 所有的类都直接或者间接继承 Object

关键点:

  • super 注意点
  1. super 调用父类的构造方法,必须在构造方法的第一个
  2. super 必须只能出现在子类的方法或者构造方法中
  3. super 和 this 不能同时调用构造方法
  • this
  • 代表的对象不同
  • this 本身调用者这个对象
  • super 代表父类对象的应用
  • 前提
  • this 没有继承也可使用
  • super 只能在继承条件才可使用
  • 构造方法
  • this 本类的构造方法
  • super 父类的构造方法

3.3 多态

  • 父类的引用指向子类的实例Person person = new Student();
  • 即同一个方法可以根据发送对象的不同而采用多种不同的行为方式
  • 一个对象的类型是确定的,但是可以指向对应的引用类型有很多
  • 多态是 方法 的多态,属性没有多态
  • 父类与子类 有联系
  • 多态存在的条件
  1. 存在继承关系
  2. 方法必须重写
  3. 父类的引用指向子类对象
  • new 左边是引用类型,右边是实际类型。而对象能使用的方法看引用类型

instanceof

  • 判断两个类之间是否存在父子关系

static

  • 类加载时就被加载,且只加载一次

4. 修饰符

  • public:公有的
  • protected:受保护的
  • private:私有的
  • static:静态
  • final:修饰常量
  • abstract:抽象

在一个静态方法中,调用一个非静态成员为什么是非法的?

  • 因为静态方法随着类加载就已经初始化完成了,而非静态成员需在对象实例化之后才完成初始化,所以没法调。

静态方法 和 实例方法的不同

  • 静态方法 可以以 类名.方法名 调用,而实例方法不可以,必须实例化之后
  • 静态方法随着类加载就已经初始化完成了

4.1 常用关键字:

  • static
  • final
  • this
  • super

5. 抽象类

  • Java 的类是单继承的,接口是可以多继承的
  • 抽象类不能new, 只能靠子类去实现。约束
  • 抽象类可以写普通方法,抽象方法必须存在抽象类中

6. 接口

  • 定义:interface
  • 接口都需要有实现类
  • 接口的作用:
  1. 约束
  2. 定义一些方法让不同的人实现
  3. 方法都是 public abstract
  4. 常量都是 public static final
  5. 接口不能被实例化,因为接口中没有构造方法

接口和抽象类的区别

  • 接口的方法默认是public, 抽象类中可以有public, protected, default 这些。(不能有private , 抽象类的方法就是为了要被重写)
  • 接口中的方法不能有实现(jdk8 可以有默认实现),抽象类可以有非抽象的方法
  • 一个类可以有多个接口,但只能实现一个抽象类。

7. 内部类

  • 局部内部类
  • 静态内部类:方法外面,类里面
  • 13匿名内部类:方法里面