什么是面向对象
- 本质:以类的方式组织代码,以对象的组织封装数据(每一个具体的对象有自己特有的数据)
- 三大特性:
- 封装
- 继承
- 多态
类与对象的关系
- 类是一种抽象的数据类型,他是对某一类事物整体的描述/定义,但是并不能代表一个具体的事物
- 手机,动物 这都是一类事物
- Person类,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为
- 对象是抽象概念的具体实例(Person person=new Person();)person就是一个具体的实例
- 张三是一个Person的具体实例
- 能够体现出特点,展现出功能的是一个具体的实例(对象),不是一个抽象的概念(类)
- 先有对象还是先有类?
- 类是对象的抽象,是对象的模板
创建与初始化对象
- 使用new关键字创建对象
- 使用new关键字创建的时候,会进行内存空间的分配,除此之外,还会给创建好的对象,进行默认的初始化,以及对类中构造器的调用
- 构造器:
- 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的
- 构造器的特点:
- 必须和类名相同
- 必须没有返回值类型,也不能使用void
- 有两种类型:无参构造和有参构造
- 无参构造器是一个类默认就有的(隐式存在)
- 若定义了有参构造器,无参构造器就需要显示定义
- 作用:
- new 的本质是在调用构造方法
- 初始化对象的值
封装
- 程序设计追求“高内聚,低耦合”
- 高内聚:类的内部数据操作都由自己完成
- 低耦合:对外开放少量的接口使用
- 封装(数据的隐藏)
- 禁止直接访问对象的数据的实际表示,应该通过接口进行访问,称为信息隐藏(设置属性私有通过get/set方法访问)
- 封装的意义:
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口
- 增加系统的可维护性
继承
- 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模(Student类和Teacher类都可以继承Person类)
- extends的意思是“扩展”,子类是父类的扩展
- Java中只有单继承,没有多继承
- 继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖,组合,聚合等。
- 继承关系的两个类,一个为子类(派生类)一个为父类(基类)。子类继承父类,使用关键字extends来表示。
- object类(超级父类)
- Java中所有的类都默认继承object类
- super
- 用于访问父类的属性,方法(Super.name="";)
- 注意点:
- super调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或者构造方法中
- super和this不能同时在构造方法中调用构造方法
- this与super
- 代表的对象不同
- this:本身调用者这个对象
- super:代表父类对象的应用
- 使用的前提条件
- this:没有继承也可以使用
- super:只有在继承条件下才可以使用
- 构造方法
- this():本类的构造方法
- super():父类的构造方法
- 代表的对象不同
- 方法的重写
- 方法的重写只对非静态方法有作用
- 方法的重写对私有修饰的方法没有作用
- 重写特点:
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围可以扩大但是不能缩小(public>protected>default>private)
- 抛出异常:异常的范围可以被缩小不能被扩大(Exception>...)
- 为什么要进行父类方法的重写?
- 父类的方法功能不一定满足子类
- 子类重写父类的方法后,方法被调用时执行子类的方法
- 子类不能继承父类的private修饰的属性和方法,“子类可以继承父类所有的方法和属性”
多态
- 作用:动态编译,增强可扩展性
- 定义:同一方法可以根据发送对象的不同而采用多种不同的行为方式
- 一个对象的实际类型是确定的,但可以指向的引用类型有很多
- 例子:(环境:A extends B;实现:A a = new A();B b = new A();)
- 解释:这里的A()是一个实际的对象类型,A 和 B是引用类型
- 多态存在的条件
- 有继承关系
- 子类重写父类的方法
- 父类引用指向子类对象
- 注意点:
- 方法具有多态性,属性不具有
- 父类型的引用可以指向子类,但是不能调用子类独有的方法(若要调用需要进行强转,有时候会出现类型转换异常),例如:((Student)a).run();
- instanceof(引用类型之间的类型转换)