1.面向对象
1.1面向对象三大特征
- 封装: 隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。
- 继承: 子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,提高代码复用率
- 多态: 多态同一个行为具有多个不同表现形式或形态的能力。可以把不同的子类对象都当作父类来看,屏蔽不同子类对象之间的差异,统一调用标准。
1.2 类和对象
- 类:Java语言最基本单位就是类。类是创建对象的模板,它描述一类对象的行为和状态。
- 对象:对象是类具体的实现,对象的状态用来描述对象的基本特征,对象的行为用来描述对象的功能。
2.封装
通过private关键字(权限修饰符)来修饰成员变量/成员方法,被修饰的成员就实现了私有化,访问权限只能在本类中访问。
如何访问私有资源?
- 成员变量:通过创建公共的get/set方法
- 成员方法:把私有方法放在公共方法里供外界调用
3.构造方法
- 定义:构造方法是一种特殊的方法,与类同名且没有返回值类型的方法,当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。
- 形式:修饰符 方法名([参数列表]){代码…}
- 执行时机:创建对象时立即执行
- 类中默认存在无参构造,同一类中手动定义任何构造都会覆盖默认的无参构造
4.构造代码块、局部代码块
构造代码块:
- 位置: 类里方法外
- 作用: 抽取构造方法中的共性代码
- 执行时机: 每次调用构造方法前都会调用构造代码块
局部代码块:
- 位置: 方法里
- 作用: 控制变量的作用范围
5.继承
继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。
这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。
5.1继承的特征
- 继承关系是传递的。
- Java只支持单继承
- 继承提供了软件复用功能。
- 子类不继承父类的构造方法,只是调用,如果父类中没有提供无参构造,子类可以通过super来调用父类其他的含参构造
6.this和super
- This代表本类对象的引用
- super代表父类对象的引用
- this可以在两个变量名相同时,用于区分成员变量和局部变量
- this 可以在本类的构造方法之间调用,位置必须是第一条语句,但不能相互调用,会死循环
- super是发生了继承关系以后,子类如果想用父类的功能,可以通过super调用
7.重载Overload与重写Override
- 重载: 是指在一个类中的现象,是指一个类中有很多同名的方法,但是方法的参数列表不同
- 重载的意义: 是为了方便外界对方法进行调用,什么样的参数程序都可以找到对应的方法来执行,体现的是程序的灵活性
- 重写: 是指发生了继承关系以后(两个类),子类去修改父类原有的功能
语法规则:子类的方法签名(返回值类型 方法名(参数列表) )与父类一致
重写方法的修饰符: 子类权限 >= 父类的权限 - 重写的意义:是在不修改源码的前提下,进行功能的修改和拓展
(OCP原则:面向修改关闭,面向拓展开放)
8.static
- 随着类的加载而加载,优先于对象加载
- 只加载一次,就会一直存在,不再开辟新空间, 直到类消失才一起消失
- 静态资源也叫做类资源,全局唯一,被全局所有对象共享
- 可以直接被类名调用
- 静态只能调用静态
9.final
- final可以修饰类,方法,成员变量
- 被final修饰的类,不能被继承
- 被final修饰的方法,不能被重写
- 被final修饰的变量是个常量,值不能被改变
10. 静态代码块、构造代码块、局部代码块
- 静态代码块:在类里方法外被static修饰的代码块,类加载时就加载,并且只被加载一次
- 构造代码块:在类里方法外的代码块,创建对象时会自动调用,每次创建对象都会被调用,提取共性
- 局部代码块:方法里的代码块,限制局部变量的范围
- 执行顺序:静态代码块 --> 构造代码块 --> 构造方法 --> 局部代码块(调用所在方法时执行)
11.多态
多态同一个行为具有多个不同表现形式或形态的能力。可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。
多态的前提有3点:
- 继承
- 方法的重写
- 父类引用 指向子类实现
总结:
- 多态中编译看左边,运行看右边
- 多态不能使用子类特有的方法
- 成员变量使用的是父类的
- 成员方法使用的是父类的声明,子类的实现
- 静态成员随着类的加载而加载,谁调用就返回谁的
12.异常
异常的顶级父类为Throwable,Throwable包含 Error 和 Exception,Error 和 Exception 是平级。
异常的处理方式有两种:向上抛出和捕获异常
如果方法抛出异常,那么谁调用这个方法,就需要解决这个方法抛出的异常
13.抽象类
抽象类:被abstract关键字修饰的类
抽象方法:被abstract关键字修饰且只有方法声明,没有方法体
总结:
- 如果类中有抽象方法,那么该类必须定义为一个抽象类
- 抽象类中可以没有抽象方法
- 子类继承了抽象类以后,要么还是一个抽象类,要么就把父类的所有抽象方法都实现(重写)
- 抽象类不可以被创建对象(实例化)
- abstract不可以和private(子类无法重写)、static(存在加载顺序问题)、final(无法重写)一起使用
14.接口interface
总结:
- 接口中的方法全部都是抽象方法
- 接口和接口之间可以多继承,接口和类之间可以多实现
- 接口中没有构造方法,默认调用Object的无参构造
- 接口中没有成员变量,都是静态常量(默认拼接public static final)
- 接口中的方法,默认就都是抽象的(默认拼接public abstract)
抽象类与接口的区别:
- 抽象类是一个特殊的类,抽象类中可以包含没有方法体的方法(抽象方法)
接口可以理解成一个特殊的抽象类,特殊在,接口里的都是抽象方法,没有普通方法 - 接口会为方法自动拼接public abstract,还会为变量自动拼接public final static
- 抽象类可以有构造方法–用来给子类创建对象,接口中没有构造方法
- 抽象类和接口都不能实例化(创建对象)
- 接口可继承接口,并可多继承接口,但类只能单继承
- 抽象方法只能声明,不能实现,接口是设计的结果 ,抽象类是重构的结果