面向对象是一种思维方式,相当于面向过程而言。
面向对象的编程模式不注重具体的实现过程,而注重实现结果。
类与对象的关系
根据一类对象进行抽取和总结,将这类对象的特征抽取成属性,将这类对象的行为抽取为方法,用类表示着一类的对象。
成员变量和局部变量
- 定义位置:成员变量定义在类内方法外;局部变量定义在代码块中。
- 作用范围:成员变量作用于整个类内;局部变量时只能作用在定义它的代码块中。
- 内存位置:成员变量随着对象的创建而存在了堆内存中并且在堆内存中赋予了默认值;局部变量在栈内存中存储。
- 生命周期:成员变量在对象创建的时候出现,在对象呗回收的时候销毁;局部变量在方法或者语句执行的时候创建,方法或者语句执行完成后销毁。
构造方法
特点:与类同名而没有返回值类型的方法
作用:创建对象
this关键字
this关键字在类中调用本类里面的属性和方法,代表当前在活动的对象。
this语句 -> this(参数列表)-表示在本类中调用本类对应的方法 --this语句必须放在构造方法的第一行
代码块
构造代码块:定义在类中用{}包起来的代码 --- 在创建对象的时候先于构造方法执行
局部代码块:定义在方法中用{}包起来的代码 --- 提高了栈内存的利用率。
静态代码块:定义在类中,在类加载时执行,用于初始化类变量
代码块的构造方法的执行顺序:
父类静态变量,代码块-->子类静态变量,代码块---》父类代码块,构造方法---》子类代码块,构造方法
面向对象的特征
封装、继承、多态(抽象)
封装
将代码进行提取和总结,抽取成不同的形式 --- 封装
体现形式:方法、类(属性私有化--对外部提供方法,保证数据和合法性)
优势:提高了代码的复用性,保证了数据的合法性
权限修饰符
指在Java中用于限定使用范围的关键字
| 本类中 | 子类中 | 同包类中 | 其他类中 |
public | 可以 | 可以 | 可以 | 可以 |
protected | 可以 | 可以 | 可以 | 不可以 |
默认 | 可以 | 同包子类可以 | 可以 | 不可以 |
private | 可以 | 不可以 | 不可以 | 不可以 |
继承
复用代码的方式。
子类通过继承父类可以使用父类的一部分方法和属性
注意:子类继承了父类的全部的数据域(方法+属性),但是继承之后只有一部分数据域对子类可见,继承了私有方法,但不可见
多继承比单继承能够更好的提高代码的复用性
单继承可以避免方法的调用产生歧义
super关键字
在子类中用于表示父类对象的引用,可以在子类中调用父类中的方法的属性。
super语句 --- 子类在继承父类之后,子类的构造方法中会含有一个super语句。如果没有手动指定super语句,那么默认使用super()调用父类无参的构造;如果父类只提供了含参构造,那么子类就必须手动提供对应形式的super语句 --- super语句必须在子类构造方法的首行
多态
编译时多态:方法的重载
add(2, 4) -> add(int, int)
add(3, 1, 7) -> add(int, int, int)
运行时多态:向上造型和方法的重写 --- 基于继承的
注意:如果使用向上造型来创建对象,那么这个对象所能调用的方法看的是父类中的声明,方法如何执行看的是子类中的实现过程
重写的理解
1. 子类重写的方法的权限修饰符的范围要大于等于父类中对应方法的权限修饰符的范围
2. 如果父类中的方法的返回值类型是引用类型,那么子类在重写方法的时候,返回值类型要么与父类一致,要么是父类方法返回值类型的子类
注意:Java中所有的基本类型之间没有继承关系,之所以能够自动提升,是因为所表示的范围是否能够包含