面向对象的思想
- 面向对象的思想
A:面向过程思想概述
我们来回想一下,这几天我们完成一个需求的步骤:首先是搞清楚我们要做什么,然后在分析怎么做,最后我们再代码体现。
一步一步去实现,而具体的每一步都需要我们去实现和操作。这些步骤相互调用和协作,完成我们的需求。
在上面的每一个具体步骤中我们都是参与者,并且需要面对具体的每一个步骤和过程,这就是面向过程最直接的体现。
那么什么是面向过程开发呢? 面向过程开发,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求。
面向过程的代表语言:C语言
B:面向对象思想概述
当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高。
可随着需求的更改,功能的增多,发现需要面对每一个步骤很麻烦了。这时就开始思索,
能不能把这些步骤和功能在进行封装,封装时根据不同的功能,进行不同的封装,功能类似的封装在一起。
这样结构就清晰了很多。用的时候,找到对应的类就可以了。这就是面向对象的思想。
C:面向对象思想特点
a:是一种更符合我们思想习惯的思想
b:可以将复杂的事情简单化
c:将我们从执行者变成了指挥者,角色发生了转换
- 面向对象的特征
- 有三个特征
- 封装
- 继承
- 多态
类与对象及其应用
- 描述现实世界事物
- 描述学生事务
- 属性:姓名,年龄,性别
- 行为:学习,吃饭,睡觉
- 属性:就是该事物的描述信息【成员变量】
- 行为:就是该事物能够做什么【成员方法】
- 类和对象的概念
- a:类:是一组相关的属性和行为的集合
- b:对象:是该类事物的具体体现
- c:举例:
- 类 学生
- 对象 班长就是一个对象
对象的内存图
- 创建对象过程
- (1):加载A.class文件进内存
- (2):在栈内存为s开辟空间
- (3):在堆内存为学生对象开辟空间
- (4):对学生对象的成员变量进行默认初始化
- (5):对学生对象的成员变量进行显示初始化
- (6):通过构造方法对学生对象的成员变量赋值
- (7):学生对象初始化完毕,把对象地址赋值给s变量
- 一个对象的内存图
- 二个对象的内存图
- 三个对象的内存图
成员变量和局部变量的区别
- A:在类中的位置不同
- 成员变量:在类中方法外
- 局部变量:在方法定义中或者方法声明上
- B:在内存中的位置不同
- 成员变量:在堆内存
- 局部变量:在栈内存
- C:生命周期不同
- 成员变量:随着对象的创建而存在,随着对象的消失而消失
- 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
- D:初始化值不同
- 成员变量:有默认初始化值
- 局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
- 注意事项:: 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
匿名对象
- 什么是匿名对象
- 就是没有名字的对象
- 匿名对象应用场景
- a:调用方法,仅仅只调用一次的时候。
- b:匿名对象可以作为实际参数传递
封装
- 封装的概述
- 封装概述
- 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
- 封装好处
- 隐藏实现细节,提供公共的访问方式
- 提高代码复用性
- 提高安全性[禁止对象之间的不良交互提高模块化]
- 封装原则
- 将不需要对外提供的内容都隐藏起来。
- 把属性隐藏,提供公共方法对其访问。
- 案例展示
- 以下 Person 类封装 name、gender、age 等属性,外界只能通过 get() 方法获取一个 Person 对象的 name 属性和 gender 属性,而无法获取 age 属性,但是 age 属性可以供 work() 方法使用。
- 注意到gender属性使用int数据类型进行存储,封装使得用户注意不到这种实现细节。并且在需要修改 gender属性使用的数据类型时,也可以在不影响客户端代码的情况下进行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public class Person {
private String name;
private int gender;
private int age;
public String getName() {
return name;
}
public String getGender() {
return gender == 0 ? "man" : "woman";
}
public void work() {
if (18 <= age && age <= 50) {
System.out.println(name + " is working very hard!");
} else {
System.out.println(name + " can't work any more!");
}
}
}
面向对象之private关键字
- private关键字特点
- 是一个权限修饰符
- 可以修饰成员变量和成员方法
- 被其修饰的成员只能在本类中被访问
- private最常见的应用
- 把成员变量用private修饰,提供对应的getXxx()和setXxx()方法
面向对象之this关键字
- 为什么要有this
- 当我们的局部变量和成员变量相同的时候,如果我们不使用this关键字,那么会导致一个问题:就是局部变量隐藏了成员变量的问题
- this关键字特点
- 是当前类的对象引用
- 简单的记,它就代表当前类的一个对象。谁调用这个方法,那么该方法的内部的this就代表谁
- this的应用场景
- 解决局部变量隐藏成员变量
面向对象之构造方法
- 构造方法概述和作用
- 给对象中的成员进行初始化
- 构造方法格式特点
- 方法名与类名相同;没有返回值类型,连void都没有
- 构造方法注意事项
- 如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
- 如果我们给出了构造方法,系统将不再提供默认的无参构造方法。
- 注意:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法
创建对象的步骤
- 对象的创建步骤
- (1):加载A.class文件进内存
- (2):在栈内存为s开辟空间
- (3):在堆内存为学生对象开辟空间
- (4):对学生对象的成员变量进行默认初始化
- (5):对学生对象的成员变量进行显示初始化
- (6):通过构造方法对学生对象的成员变量赋值
- (7):学生对象初始化完毕,把对象地址赋值给s变量
面向对象之static关键字的特点
- static关键字的特点
- 随着类的加载而加载
- 优先于对象存在
- 被类的所有对象共享
- 可以通过类名调用【静态修饰的内容一般我们称其为:与类相关的,类成员】
- static的注意事项
- 在静态方法中是没有this关键字的
- 静态是随着类的加载而加载,this是随着对象的创建而存在。
- 静态比对象先存在。
- 静态方法只能访问静态的成员变量和静态的成员方法【静态只能访问静态,非静态可以访问静态的也可以访问非静态的】
- 在静态方法中是没有this关键字的
静态变量和成员变量的区别
- A:所属不同
- 静态变量属于类,所以也称为类变量
- 成员变量属于对象,所以也称为实例变量(对象变量)
- B:内存中位置不同
- 静态变量存储于方法区的静态区
- 成员变量存储于堆内存
- C:内存出现时间不同
- 静态变量随着类的加载而加载,随着类的消失而消失
- 成员变量随着对象的创建而存在,随着对象的消失而消失
- D:调用不同
- 静态变量可以通过类名调用,也可以通过对象调用
- 成员变量只能通过对象名调用
代码块
- A:代码块概述
- 在Java中,使用{}括起来的代码被称为代码块。
- B:代码块分类
- 根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块。
- C:常见代码块的应用
- a:局部代码块
- 在方法中出现;限定变量生命周期,及早释放,提高内存利用率
- b:构造代码块
- 在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行
- c:静态代码块
- 在类中方法外出现,加了static修饰
- 在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且只执行一次。
- a:局部代码块
继承
- 继承概述
- 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
- 继承格式
- 通过extends关键字可以实现类与类的继承
- class 子类名 extends 父类名 {}
- 单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类
- 继承的好处
- a:提高了代码的复用性
- b:提高了代码的维护性
- c:让类与类之间产生了关系,是多态的前提
- 继承的弊端
- 类的耦合性增强了。
- 开发的原则:高内聚,低耦合。
- 耦合:类与类的关系
- 内聚:就是自己完成某件事情的能力
- 继承的注意事项
- a:子类只能继承父类所有非私有的成员(成员方法和成员变量)
- b:子类不能继承父类的构造方法,但是可以通过super(待会儿讲)关键字去访问父类构造方法。
- c:不要为了部分功能而去继承
- 继承中成员变量的关系
- A:子类中的成员变量和父类中的成员变量名称不一样
- B:子类中的成员变量和父类中的成员变量名称一样
- 在子类中访问一个变量的查找顺序(“就近原则”)
- a: 在子类的方法的局部范围找,有就使用
- b: 在子类的成员范围找,有就使用
- c: 在父类的成员范围找,有就使用
- d:如果还找不到,就报错
- 继承中构造方法的注意事项
- 父类没有无参构造方法,子类怎么办?
- a: 在父类中添加一个无参的构造方法
- b:子类通过super去显示调用父类其他的带参的构造方法
- c:子类通过this去调用本类的其他构造方法
- 本类其他构造也必须首先访问了父类构造
- B:注意事项
- super(…)或者this(….)必须出现在第一条语句上
- 父类没有无参构造方法,子类怎么办?
this和super的区别
- A:通过问题引出super
- 子类局部范围访问父类成员变量
- B:说说this和super的区别
- this 代表的是本类对象的引用
- super 代表的是父类存储空间的标识(可以理解成父类的引用,可以操作父类的成员)
- C:this和super的使用
- a:调用成员变量
- this.成员变量 调用本类的成员变量
- super.成员变量 调用父类的成员变量
- b:调用构造方法
- this(…) 调用本类的构造方法
- super(…) 调用父类的构造方法
- c:调用成员方法
- this.成员方法 调用本类的成员方法
- super.成员方法 调用父类的成员方法
- a:调用成员变量
方法重写,方法重载
- 方法重写
- A:什么是方法重写
- 子类中出现了和父类中一模一样的方法声明(方法名,参数列表,返回值类型),也被称为方法覆盖,方法复写。
- B: Override和Overload的区别?Overload能改变返回值类型吗?
- C:方法重写的应用
- 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。
- 这样,即沿袭了父类的功能,又定义了子类特有的内容。
- 方法重写注意事项
- a:父类中私有方法不能被重写 ,因为父类私有方法子类根本就无法继承
- b:子类重写父类方法时,访问权限不能更低 ,最好就一致
- c:父类静态方法,子类也必须通过静态方法进行重写 ,其实这个算不上方法重写,但是现象确实如此,至于为什么算不上方法重写,多态中我会讲解
- 方法重载
- A.什么是方法重载?
- 一个类中,有若干个方法名字相同,但方法参数形式不同,成为方法重载
- B.方法重载原则?
- 方法名相同;方法的参数类型不同,或者参数个数不同;与方法的参数名,返回类型和修饰符无关
final关键字概述
- A:为什么会有final
- 由于继承中有一个方法重写的现象,而有时候我们不想让子类去重写父类的方法.这对这种情况java就给我们提供了一个关键字: final
- B:final概述
- final关键字是最终的意思,可以修饰类,变量,成员方法。
- C:final修饰特点
- 修饰类: 被修饰类不能被继承
- 修饰方法: 被修饰的方法不能被重写
- 修饰变量: 被修饰的变量不能被重新赋值,因为这个量其实是一个常量
- D:final关键字修饰局部变量
- 基本类型,是值不能被改变
- 引用类型,是地址值不能被改变