面向对象
什么是类
类是具有相同状态和相同行为的一组对象的集合
什么是对象
万事万物皆对象,对象是真实存在的个体
类和对象的关系
类是对象的模板,对象是类的静态实现
类的字段
类内部包含字段和方法。对象所拥有的特征在类中表示时称为诶的字段,字段使用变量表示
对象的特征就是类中的字段
类的方法
对象执行操作的行为称为类的方法
创建对象
- new是关键字,称为实例化
- 左边的类名为对象的数据类型
- 右边的类名()称为类的构造方法
new是实例化对象,实例化对象就是定义变量,定义变量时JVM就要为变量分配内存,
因此实例化的过程就是为对象分配内存的过程。
构造函数
在Java中调用构造方法时生成实例对象的唯一方法
成员变量和局部变量的区别
- 作用域不同,成员变量的作用域是整个类中,如果访问权限容许,可以在外部的其他类中使用,局部变量只能够在定义它的方法体内使用,在该方法外部无法使用
- 初始值不一样:对与成员变量,如果在类定义中没有给初始值,Java会给它默认的初始值,次默认初始值符合基本数据类型的和引用数据类型的默认值。但是Java不会给局部变量赋默认值,因此局部变量必须初始化
- 在同一个方法中不容许有同名的局部变量,在不同的方法中可以有同名的局部变量
- 局部变量可以和成员变量的名称相同,并且在使用时局部变量具有更高的优先级
按值传递
在Java中,方法调用采用按值传递的方式,参数(也成形参)是在方法定义中声明的变量,用于接受传递给方法的值,二实参是在方法调用时传递给方法的具体值。
对于基本数据类型,不同的变量会分别在不同的存储空间中,并且存储空间中存储的是该变量的值。赋值操作传递的是变量的值,改变一个遍历的值不会影响另一个变量的值。
对于引用数据类型,赋值是把原对象的引用(内存地址编号)传递给了另一个引用,这两个引用指向同一个内存,其中如何一个引用修改了属性的值,另一个引用属性的值同时也被修改
构造方法
- 构造方法是一种特殊的实例方法,具有特殊的功能
- 他的名称和类名相同,没有返回值
- 在使用new关键字创建对象实例时会自动调用
- 每个类都必须有至少一个构造方法
访问修饰符
public:修饰的成员变量、方法可以在如何类中使用
private:修饰的成员方法、变量只能在声明同名的类中使用
protected:修饰的成员方法、变量可以在声明他的类中使用,在该类的子类中也可以使用,也可以在该类位于同一个包中的类访问,但是不同包的非子类不能够使用
默认:可以在声明他的类中访问,也可以在于该类位于同一个包中的类访问,但不能再其他包的类中访问
static关键字
- 使用static修饰的属性称为静态属性或类变量,没有使用static修饰的属性称为实例变量,使用static修饰的属性属于类,不属于具体的某个对象,类属性在类首次被加载时初始化,即时没有创建对象,类属性也是存在的。
- 静态方法中不能直接访问实例变量和实例方法
- 在实例方法中可以直接调用类中定义的静态变量和静态方法
- 静态初始化只执行一次
静态成员和实例成员的区别
- 静态成员是类的成员,实例成员是对象的成员。静态成员是在类加载时初始化,只有一个副本,可以被的所有对象共享:实例成员是在对象创建时初始化,每个对象都有自己的一份
- 静态成员可以直接通过类名访问,不需要创建对象,实例成员需要通过对象来访问
- 实例成员可以访问静态成员和实例成员,但是静态成员不能直接访问实例成员,这是因为在实例化对象之前静态成员已经被初始化,二实例成员需要通过对象来访问。
- 静态成员可以在静态初始化中初始化,实例需要需要通过构造函数中初始化
封装
Java中封装的实质是将类的状态信息(成员变量)、方法等隐藏在类的内部,不容许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问,通过访问修饰符来控制类中的数据和方法的访问级别,从而实现封装
封装的优点
- 防止外部直接访问类的内部数据,可以保护数据的安全性
- 通过限制外部访问,可以更好的控制数据的正确性和完整性
- 可以隐藏类的实现细节,使的用户不需要了解类的内部实现细节,只需要知道如何使用提供的接口
封装的步骤
- 修改字段的可见性
- 设置setter/getter方法
- 设置字段的存取限制
遮蔽
Java中的遮蔽指的是在一个作用域中使用了一个和外层作用于相同的变量名,导致内部变量“遮蔽”了外部变量,既无法直接访问外部变量
局部变量遮蔽成员变量:当一个方法中的参数或者局部变量和成员变量同名时。方法内部就无法直接访问该成员变量,此时需要使用关键字this来引用当前对象的成员变量
this关键字
- 引用当前对象的成员变量
- 调用当前对象的成员方法
- 调用当前对象的成员方法
继承
Java类只支持单继承,即一个类只能继承一个直接父类
继承最基本的就是使得代码可以重用
继承的一些基本概念
- 子类可以继承父类的非私有属性和方法。子类可以使用父类的属性和方法,无需重新编写相同的代码
- 子类可以添加自己的属性和方法,子类可以增加父类中没有的属性和方法,从而增加代码的灵活性和科扩展性
- 子类的构造方法可以调用父类的构造方法,在子类的构造方法中使用super关键字可以调用父类的构造方法,从而初始化父类的属性
- Object类是所有类的根类
- Java中的类只支持单继承,即一个类只能继承一个父类
- 子类可以成为其他类的父亲
方法隐藏
父类和子类拥有相同的名字的属性或者方法时,父类的同名的属性或者方法形式上可不见了,实际还存在;【隐藏是对于静态方法和成员变量(静态变量和实例变量)而言的】
- 当发生隐藏的时候,声明类型是什么类,就调用对应的类,而不是发生动态绑定
- 属性只能被隐藏,不能被覆盖
- 变量可以交叉隐藏:子类实例变量/静态变量可以隐藏父类的实力/静态变量
- 不能用子类的静态方法隐藏父类中的非静态方法
this和super的区别
Java中this和super都是关键字,用于引用当前对象或父类对象。他们的主要区别在于他们引用的对象不同:this关键字用于引用当前对象,二super关键字用于引用父类的对象
final关键字
在Java中,final是一个关键字,用于修饰变量、方法和类,表示他们是不可改变的或不可继承的
- final修饰的变量:final修饰的变量称为常量,一旦被初始化,就无法再被修改
- final修饰方法:final修饰的方法称为不可覆盖方法,子类无法重写该方法
- final修饰类:final修饰的类称为不可继承类,表示该类不能被其他类继承
多态
一个特定类型的变量可以引用不同类型的对象,并且能够自动的调用引用的对象的方法。方法重写是多态的基础。【父类类型指向子类对象】
实现多态的3个条件
- 子类继承父类,并且重写父类的方法
- 父类引用指向子类对象(父类引用可以指向任意一个子类的对象)
- 父类引用调用方法时,实际上调用的是子类的方法,不同的子类有不同的方法实现,体现出同一个方法在不同子类中的不同形态的表示
注意
- 父类只能调用子类从父类继承的方法或重新方法
- 父类不能调用子类新增的方法