面向对象
面向对象编程(Object-Oriented Programming,OOP)
面向对象编程的本质就是:以类的方式组织代码,以对象的组织封装数据
对于描述复杂的事物,为了从宏观上把握、从整体上合理分析、我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理
三大特性
- 封装
- 继承
- 多态
- 从认识的角度,先有对象,再有类(例:先有人,再有教师,学生等)
- 从代码的角度,先有类,再有对象(对象是new出来的,类是对象的模板)
值传递和引用传递
- 值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
- 引用传递:指在调用函数时将实际参数复制一份传递到函数中,那么在函数中对参数所进行的修改,将会影响到实际参数
类
类与对象的关系
类是一种抽象的数据类型,它是对某一类失误整体描述/定义,但是并不能代表某一事物。
例:动物、植物、手机等
对象是抽象概念的具体实例
例:张三就是人类的一个实例,狗就是动物类的一个实例
类的组成
类由属性,方法,构造器,代码块,内部类这5部分组成
static关键字
- 可以修饰:属性、方法、代码块、内部类
- 被static修饰的部分随着类的加载而加载 ,所以该部分的加载早于对象的创建。举例
- 静态变量随着类的加载而加载,可以通过“类.静态变量”进行调用
- 由于类只会加载一次,所以静态变量也只会存在一份
- 在静态方法中,不能使用super或this关键字
abstract关键字
- 可以修饰:方法,类
- 修饰类:
- 此类不可实例化
- 一定会有构造器(以便子类实例化时调用)
- 一定会提供子类
- 修饰方法:只声明了方法,没有方法体
- 抽象类可能没有抽象方法,但是有抽象方法的类一定是抽象类
- 只有子类重写了父类所有的抽象方法,才能实例化
interface关键字
- 接口和类是并列的结构
- 全局变量:默认为public static final ,且省略;抽象方法:默认public abstract,且省略
- 不是类,所以没有构造器,意味着不能实例化
- 如果实现类覆盖了接口的所有抽象方法,则此实现类可以实例化,否则,该类还是为抽象类
- 可以实现多个接口,
public class UserImpl implement AA,BB,CC
,弥补了Java类不能多继承的缺点 - 接口之间可以继承,且可以多继承
new关键字
使用new关键字时,除了分配内存空间,还会给创建好的对象进行默认的初始化以及对类中构造器的调用
super关键字
- super调用父类地构造方法,必须在构造方法的第一行
- super必须只能出现在子类的方法或者构造方法中
- super和this不能同时出现在构造方法中
和this的不同:
- 对象不同
- this:本身调用者这个对象
- super:调用者的父类对象
- 前提不同
- this:没有继承也可以使用
- super:只有继承才可以使用
- 构造方法:
- this():本类的构造
- super():父类的构造
构造器
类自带一个无参的构造方法,构造器和类名相同,且没有返回值
idea快捷键:Alt + Shift + s(我的idea快捷键是延用eclipse的)
作用:
- 使用new关键字,必须要有构造器
- 一旦定义了有参构造,无参构造就必须显示定义
- 用来初始化值
权限修饰符
访问控制修饰符 | 同类 | 同包 | 不同包的子类 | 不同包的非子类 |
---|---|---|---|---|
private | √ | |||
default(默认) | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
重写和重载
重载:“两同以不同”,同一个类、相同方法名,但参数列表不同(参数类型不同或者个数不同)
重写:
- 重写以后,当创建子类对象以后,通过子类对象调用父类中的同名同参数的方法时,实际上执行的是子类重写父类的方法
- 规则
- 方法名和形参列表要一致
- 重写的权限修饰符不能小于父类的权限修饰符,特殊地,子类不能重写父类中修饰符为private的方法
- 返回值类型
- 父类为void,子类就为void
- 父类为基本数据类型,子类就为相同的基本数据类型
- 父类为A类型,子类就为A类型或A类型的子类
- 子类抛出的异常类型不大于父类抛出的异常类型
三大特性
封装
“高内聚,低耦合”:高内聚就是类的内部数据操作自己完成,不允许外部干涉,低耦合就是:仅暴露少量的方法给外部使用
作用
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口
- 系统可维护增加了
继承
继承的本质是对某一批类的抽象,从而实现对现实世界更好地建模。
-
关键字:extends,他的意思是拓展。子类是父类的拓展
-
Java中只有单继承,没有多继承,即一个类只有一个父类
-
在Java中,所有类都直接或者间接地继承Object类
多态
-
含义:父类的引用指向子类的对象
-
作用:提高了代码的通用性,常称作接口重用
-
举例:
Person s1 = new Student();
-
使用前提:类的继承关系和方法的重写
-
注意:对象的多态性只适用于方法,不适用于属性
向上转型与向下转型
-
向上转型:父类的引用指向子类的对象,向上转型时,子类对象当成父类对象,只能调用父类的功能,如果子类重写了父类中声明过的方法,方法体执行的就是子类重过后的功能。但是此时对象是把自己看做是父类类型的,所以其他资源使用的还是父类型的。
Cat c = new Cat(); Animal a1 = c; 或者 Animal a2 = new Cat();
-
向下转型:使用强转符(),是为了方便使用子类的特殊方法,也就是说当子类方法做了功能拓展,就可以直接使用子类功能
Person s1 = new Student(); Student stu = (Student) s1;