面向对象
- 面向对象思想
回想一下,这几天当我完成一个需求的步骤:首先要搞清楚我在做什么,
然后在分析怎么做,最后再去代码体现。一步一步去实现,而具体的每一步
都需要我们去实现和操作。这些步骤相互调用和协作,完成我们的需求。
在上面的每一个具体步骤中我们都是参与者,并且需要面对具体的每一个步
骤和过程,这就是面向过程最直接的体现。
当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高。
可随着需求的更改,功能的增多,发现需要面对每一个步骤很麻烦了,这时就
开始思索,能不能把这些步骤和功能在进行封装,封装时根据不同的功能,进
行不同的封装,功能类似的封装在一起。这样结构就清晰了很多。用的时候,
找到对应的类就可以了。这就是面向对象的思想。
面向对象的思想:从现实世界中客观存在的事物出发来构造软件系统,在系
统的构造中尽可能的使用人类的自然思维方式,强调直接以问题域(现实世
界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把
它们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与
现实世界中的事物相关比较远,并且没有对应关系的其它概念来构造系统)。
这可以使系统直接地映射问题域,保持问题域中事物及其相互关系的本来面貌
面向对象的方法是面向对象的世界观在开发方法中的直接运用。它强调系统
的结构应该直接与现实世界的结构相对应,应该围绕现实世界中的对象来构造
系统,而不是围绕功能来构造系统 - 类与对象关系
编程语言,就是为了模拟现实世界的事物,实现信息化。比如:去超市买
东西的计费系统,去银行办业务的系统。
我们如何表示一个现实世界事物呢:
✓ 属性 就是该事物的描述信息
✓ 行为 就是该事物能够做什么
⚫ 类
类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物
的属性特征和行为特征来描述该类事物。
举例:小猫。
属性:名字、体重、年龄、颜色。 行为:走、跑、叫。
⚫ 对象
对象:是一类事物的具体体现。对象是类的一个实例(对象并不是找个女朋
友),必然具备该类事物的属性和行为。
现实中,一类事物的一个实例:一只小猫。
举例:一只小猫。
属性:tom、5kg、2 years、yellow。 行为:溜墙根走、蹦跶的跑、喵喵
叫。
⚫ 类与对象的关系
类是对一类事物的描述,是抽象的。
对象是一类事物的实例,是具体的。
类是对象的模板,对象是类的实体。 - 类和对象的定义
3.1 类的定义格式
✓ 定义类:就是定义类的成员,包括成员变量和成员方法。
成员变量:和以前定义变量几乎是一样的。只不过位置发生了改变。在类中,方法外。
成员方法:和以前定义方法几乎是一样的。
✓ 对象实例化:创建对象
类名 对象名 = new 类名();
✓ 使用对象访问类中的成员:
对象名.成员变量;
对象名.成员方法(); ✓ 匿名对象:就是没有名字的对象。
是对象的一种简化表示形式,只能使用一次
new 类名().成员方法();
3.2 对象的内存图
实例化对象时,会在内存堆中开辟空间存储对象的属性
Person p1 = new Person();在内存中做了哪些事情? • 加载 Person.class 文件进内存
• 在栈内存为 p1 开辟空间
• 在堆内存为 p1 对象开辟空间
• 对 p1 对象的成员变量进行默认初始化
• 对 p1 对象的成员变量进行显示初始化
• 通过构造方法对 p1 对象的成员变量赋值
• p1 对象初始化完毕,把对象地址赋值给 p1 变量
成员变量的默认值
练习:定义手机类,包含品牌,颜色和价格 - 成员变量和局部变量
⚫ 在类中的位置不同
成员变量 类中方法外
局部变量 方法内或者方法声明上
⚫ 在内存中的位置不同
成员变量 堆内存
局部变量 栈内存
⚫ 生命周期不同
成员变量 随着对象的存在而存在,随着对象的消失而消失
局部变量 随着方法的调用而存在,随着方法的调用完毕而消失
⚫ 初始化值不同
成员变量 有默认的初始化值
局部变量 没有默认的初始化值,必须先定义,赋值,才能使用。 - 形参问题
基本类型:形式参数的改变不影响实际参数
引用类型:形式参数的改变直接影响实际参数
基本类型作为参数,传递的是值,引用类型作为参数,传递的是地址值。 - this 关键字
this:代表所在类的对象引用, 当一个对象创建后,Java 虚拟机(JVM)就会
给这个对象分配一个引用自身的指针,这个指针的名字就是 this。并且 this 只
和特定的对象关联,而不和类关联,同一个类的不同对象有不同的 this。
this.成员变量
this.成员方法() - 构造方法
构造方法就是类构造对象时调用的方法,主要用来实例化对象,就像一个对
象加工厂。
⚫ 构造方法的定义格式 - 构造方法的名字必须与定义他的类名完全相同
- 构造方法的调用是在创建一个对象时使用 new 操作执行,不能显示调用
- 类中必定有构造方法,若不写,系统自动添加无参构造方法
- 不能被 static、final、synchronized、abstract 修饰
构造方法注意事项
⚫ 如果不提供构造方法,系统会给出默认构造方法
⚫ 如果提供了构造方法,系统将不再提供
⚫ 构造方法也是可以重载的 - 封装的操作
封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
⚫ 好处:
隐藏实现细节,提供公共的访问方式
提高了代码的复用性
提高安全性。
⚫ 封装原则:
将不需要对外提供的内容都隐藏起来。
把属性隐藏,提供公共方法对其访问。
⚫ 封装的步骤
使用 private 关键字来修饰成员变量。
对需要访问的成员变量,提供对应的一对 getXxx 方法 、setXxx 方法。 - setter 和 getter 方法
⚫ private 的含义
private 是一个权限修饰符,代表最小权限。
可以修饰成员变量和成员方法。
被 private 修饰后的成员变量和成员方法,只在本类中才能访问。
⚫ 提供 getXxx 方法 / setXxx 方法,可以访问成员变量
10.一个标准的 java 实体类
JavaBean 是 Java 语言编写类的一种标准规范。符合 JavaBean 的类,要
求类必须是具体的和公共的,并且具有无参数的构造方法,提供用来操作成员变
量的 set 和 get 方法。
例如:
11.static 关键字
当 static 修饰成员变量时,该变量称为类变量。该类的每个对象都共享同
一个类变量的值。任何对象都可以更改该类变量的值,但也可以在不创建该类的
对象的情况下对类变量进行操作。
静态变量定义格式:static 数据类型 变量名;
举例:static int country;
⚫ static 关键字特点
✓ 可以修饰成员变量和成员方法
✓ 随着类的加载而加载
✓ 优先于对象存在
✓ 被类的所有对象共享
✓ 可以通过类名调用
⚫ static 关键字注意事项
✓ 在静态方法中是没有 this 关键字的
✓ 静态方法只能访问静态的成员变量和静态的成员方法
11.1 静态变量和成员变量的区别
⚫ 所属不同
静态变量属于类,所以也称为为类变量
成员变量属于对象,所以也称为实例变量(对象变量) ⚫ 内存中位置不同
静态变量存储于方法区的静态区
成员变量存储于堆内存
⚫ 内存出现时间不同
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而存在,随着对象的消失而消失
⚫ 调用不同
静态变量可以通过类名调用,也可以通过对象调用
成员变量只能通过对象名调用
11.2 静态方法
当 static 修饰成员方法时,该方法称为类方法 。静态方法在声明中有
static ,建议使用类名来调用,而不需要创建类的对象。调用方式非常简单。
类方法:使用 static 关键字修饰的成员方法,习惯称为静态方法。
定义格式:
类名.静态方法名(参数);
静态方法调用的注意事项:
✓ 静态方法可以直接访问类变量和静态方法。
✓ 静态方法不能直接访问普通成员变量或成员方法。反之,成员方法可
以直接访问类变量或静态方法。
✓ 静态方法中,不能使用 this 关键字。
12.main 方法
public static void main(String[] args) {}
⚫ public 被 jvm 调用,访问权限足够大。
⚫ static 被 jvm 调用,不用创建对象,直接类名访问
⚫ void 被 jvm 调用,不需要给 jvm 返回值
⚫ main 一个通用的名称,虽然不是关键字,但是被 jvm 识别
13.代码块
在 Java 中,使用{}括起来的代码被称为代码块,根据其位置和声明的不
同,可以分为局部代码块,构造代码块,静态代码块。
⚫ 局部代码块
在方法中出现;限定变量生命周期,及早释放,提高内存利用率
⚫ 构造代码块
在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调
用构造都执行,并且在构造方法前执行
⚫ 静态代码块
在类中方法外出现,并加上 static 修饰;用于给类进行初始化,在加载
的时候就执行,并且值执行一次。