面向对象
什么是类
类是具有相同的状态和相同的行为的一组对象的集合
什么是对象
对象就是真实具体存在的个体
类和对象的关系
类是对象的模版 对象是类的具体实例 类和对象的关系就是抽象和具体的关系
类的组成
类由字段和方法两部分组成
创建类
类是一类事物的集合和抽象,代表这这类事物共有的字段和行为,一个对象称为类的一个实例,是类一次实例化的结果
创建语法:
类名 对象名 = new 类名();
- new是关键字,称为实例化
- 左边的类名为对象的数据类型
- 右边的类名()成为类的构造方法
- 使用new运算符实例化了一个Person的对象
- 实例化的结果是产生一个Person类的实例,这个实例的名称就是对象名
new
new是实例化对象,实例化对象就是定义变量,定义变量时jvm就要分配内存,因此实例化的过程就是为对象分配内存的过程
初始化实例的过程
在Java中,创建一个对象时,使用类的构造函数来初始化对象。下面是创建一个Person
对象的语句Person person = new Person();
的执行顺序以及各部分的操作意义:
new Person()
:这部分代码使用new
关键字创建一个Person
类的新实例。它会在内存中分配一块空间来存储该对象的数据。Person()
:这是Person
类的构造函数。构造函数是一个特殊的方法,用于初始化对象的状态。它没有返回类型,并且与类名相同。在创建对象时,构造函数会被自动调用。=
:赋值操作符,将右侧的对象引用赋值给左侧的变量person
。这样,变量person
就指向了新创建的Person
对象。Person person
:这是声明一个变量person
,类型为Person
。这样,我们可以使用变量person
来引用和操作该对象。
成员变量
成员变量的作用域
类中的字段是直接定义在类的内部、方法的外部的变量,称为成员变量
局部变量
局部变量就是定义在方法内部的遍历,局部变量只能在方法内部使用
成员变量和局部变量的区别
- 作用域不同。局部变量的作用域仅限定于定义他的方法,在方法外无法使用,成员变量的作用域是在整个类内,所有的成员方法都可以使用它,如果访问权限容许,还可以在外部类使用成员变量
- 初始值不同。对于成员变量,如果在类定义中没有给他赋予初始值,
java
会给他一个默认值。但是java
不会给局部变量赋初始值,因此局部变量在使用前必须初始化 - 在同一个方法中不容许有同名的局部变量,在不同的方法中可以有同名的局部变量
- 局部变量可以和成员变量名相同,并且使用时局部变量有更高的优先级
按值传递
对于基本数据类型,不同的变量会分别在不同的存储空间中,并且存储空间中存储的是该变量的值。赋值操作传递的是变量的值,改变一个变量的值不会影响另一个变量的值
对于引用数据类型,赋值是吧源对象的引用(内存地址编号)传递给另一个引用,这两个引用指向一个内存空间,其中任何一个引用修改了属性的值,另一个属性的值同时也被改了
构造方法
在java
中当创建一个类的对象时,会自动调用该类的构造方法。
- 构造方法分为默认构造方法和自定义构造方法。
- 构造方法时一种特殊的实例方法
- 它的名称和类名相同,没有返回值
- 使用new关键字创建对象实例时会自动被调用
- 每个类都必须有一个构造方法,如果没有定义构造方法,系统就会自定义一个构造方法
- 构造方法不能被继承
new Xxx()
来创建对象实例
方法的重载
方法重载是指在一个类中定义多个同名方法,但要求每个方法具有不同的参数类型或参数个数或参数顺序
方法的返回值不能作为方法是否构成重载的依据
this关键字
this
关键字是对一个对象的默认引用,每个实例方法内部都有一个this引用变量,指向这个方法的对象
- 使用this调用成员变量,解决成员变量与局部变量的同名冲突
- this可以调用成员方法
- this调用重载的构造方法,只能在构造方法中使用,且必须是构造方法的第一条语句
- 因为this是在对象内部代表自身的引用,所以this只能调用实例变量、实例方法和构造方法,不能调用类变量、类方法,也不能调用局部变量
访问修饰符
类访问修饰符
java
的类访问修饰符只有两个,分别是public和package-access(包访问修饰符)
同一包中 | 不同包中 | |
---|---|---|
public | 可以使用 | 可以使用 |
package-access | 可以使用 | 不可以使用 |
类成员访问修饰符
位置 | public | protected | 包访问修饰符 | private |
---|---|---|---|---|
同类访问 | 可以 | 可以 | 可以 | 可以 |
同包其他类访问 | 可以 | 可以 | 可以 | 不可以 |
同包子类访问 | 可以 | 可以 | 可以 | 不可以 |
不同包子类访问 | 可以 | 可以 | 不可以 | 不可以 |
不同包非子类访问 | 可以 | 不可以 | 不可以 | 不可以 |
注:访问修饰符不能用于方法中声明的变量或形式参数,因为方法中的变量或形式参数的作用域仅限于该方法,在方法外是不可见的,在其他类无法访问
static关键字
一个类可以创建n个对象,如果把n个对象中的某些数据需要n个对象共用,就可以使用static关键字修饰这些数据
在java
中使用static关键字可以通过类名.直接调用类的成员
static修饰属性
使用static修饰的属性称为静态属性或类变量,没有static修饰的属性称为实例变量。使用static修饰的属性属于类,不属于具体的某个对象,类属性在首次被加载时初始化,即时没有创建对象,类属性也是存在的
static修饰方法
用static修饰的方法称为静态方法或者类方法,不是static修饰的方法称为实例方法,类方法不依赖于如何对象,用类名直接.调用,对象名也可以调用。使用static修饰的方法属于类,不属于某个具体的对象
提示:静态方法中不能直接访问实例变量和实例方法
提示:在实例方法中可以直接调用类中定义的静态变量和静态方法
静态初始化
Java
中静态初始化是一种在类被加载时执行的初始化方式,用于初始化类的静态变量和执行一些静态代码块
静态初始化代码块在类被加载时只执行一次,且只能访问类的静态变量和方法。静态初始化的执行顺序是按照代码块在类中出现的顺序执行的
静态成员和实例成员的区别
- 静态成员是类的成员,实例成员是对象的成员。静态成员是在类加载时初始化,只有一个副本,可以被类的所有对象共享;实例成员是在对象创建时初始化,每个对象都有自己的一份。
- 静态成员可以直接通过类名访问,不需要创建对象;实例成员需要对象来访问
- 静态成员可以在静态初始化块中初始化,实例成员需要再构造函数中初始化
封装
Java
中封装的实质就是将类的状态信息(成员变量)、方法等隐藏在类内部,不容许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问,在java
中,可以使用访问修饰符来控制类中的数据和方法的访问级别,从而实现封装
封装的优点
- 防止外部直接访问类的内部数据,可以保护数据的安全性
- 通过限制外部访问,可以更好的控制数据的正确性和完整性
- 可以隐藏类的实现细节,使的类的用户不需要了解类的内部实现细节,只需要知道如何使用提供的接口
封装的步骤
- 修改字段的可见性==将字段改为private
- 设置getter/setter方法
- 设置字段的存取限制
封装的意义
- 隐藏类的内部细节
- 通过限制外部访问,可以更好的控制数据的正确性和完整性
- 可以更加灵活的修改类的内部代码
- 封装可以提高代码的重用性
继承
java
类中只支持单继承,即一个类只能有一个直接的父类
继承的基本概念
- 子类可以继承父类的非私有属性和方法
- 子类可以添加自己的属性和方法
- 子类的构造方法可以调用父类的构造方法
- Object类是所有类的根类
使用继承和重写实现子类
- 使用继承定义部门类及子类
- 使用super关键字调用父类的成员