第五章 面相对象基础
1.面向对象
OOP(object oriented programming),面向对象编程
- 是一种以对象为中心的编程思想,通过借助对象实现具体的功能
- 将大问题拆分成小问题,然后借助不同对象分别解决,最终实现功能POP(procedure oriented Programming),面向过程编程
- 是一种以过程为中心的编程思想,靠自己一步一步去实现功能,需要对每
个步骤精确控制 - 强调按步骤实现功能,先分析解决问题所需步骤,再自定义方法实现每个步骤功能,然后依次调用方法,最终实现功能
面向对象的特点:
- 更符合人类思想习惯的思想
- 利用对象去实现功能
- 将复杂事情简单化
- 针对要解决问题的用户而言,可以把大问题拆解成小问题,分别指挥不同的对象去解决小问题
- 程序员的角色由执行者变成了指挥者、
面向对象开发:
- 就是不断创建对象,使用对象,指挥对象做事情实现功能
- 原则:如果有对象,就指挥对象实现功能;如果没有,就创建对象,然后再指挥
面向对象语言特征:封装,继承,多态
2.类
类的组成:
- 属性:指事物的特征,静态描述,例如:手机有品牌,价格,尺寸
- 行为:指事物所具有的功能,动态描述,例如:手机可以打电话,也可以发短信
类的理解: - 类是对现实生活中一类具有共同属性和行为的事物的抽象
- 类是对象的数据类型,类是具有相同属性和行为的一组对象的集合
- 类就是对现实事物的一种描述
- 类是引用数据类型中的一种
结论:类是对象的抽象,对象是类的实例
直接定义在类中的结构叫做成员。
类定义步骤:
- 定义类
- 编写类的成员变量
- 编写类的成员方法
3.对象使用
创建对象格式:
类名 对象名 = new 类名();
调用成员格式:
对象名.成员变量
对象名.成员方法();
类的使用总结:
- 一般Java程序会写两个类:基础类,测试类
- 基础类就是我们要实现封装出来的那个类
- 测试类就是包含main方法的类
- 注意:只能在一个类中定义main方法,其是程序的入口,必须唯一
类和对象的关系:
- 类是对一类事物的描述,是抽象的
- 对象是一类事物的实例,是具体的
- 类是对象的模板,对象是类的实体
结论:类是一种抽象的数据描述,对象是类的一个具体实例
4.对象内存
程序运行过程:
- 加载main方法并运行:在栈区开辟方法帧,支持main方法的运行
- 执行main方法代码,用到Student类,则加载该类:把Student.class加载到方法区
- 创建引用类型变量:在栈空间中开辟一块内存空间,用stu标识
- 在堆中开辟内存创建对象,并给属性赋上默认初始值
- 将堆空间对象内存地址值放入stu标识的内存区域中
- 对象属性赋值:将"tom"和20放入堆空间对象内存区域内
- 对象方法调用:找到方法区sayHello方法对应的代码,执行
- main方法继续执行,遇到 } ,程序执行结束
引用类型的理解:
上述案例中,stu是一个引用类型的变量,其对应栈区的一块内存区域,其放的是一个引用值(地址值),通过这个引用值,系统可以找到对象实际开辟的内存空间(堆区),进而进行对象属性操作或方法调用。
多个对象内存构成:
对象内存结论:
系统会为每个对象开辟单独的内存空间(堆空间),用来存储对象的属性。
类的成员方法存储在方法区,只保留一份,只要是该类的对象,都可以调
用。
5.变量对比
成员变量(全局变量)
局部变量(临时变量)
成员、局部变量区别:
- 定义位置不同
成员变量:类中方法外
局部变量:方法内部或方法声明上(形参列表) - 内存中位置不同
成员变量:堆内存
局部变量:栈内存 - 生命周期不同
成员变量:随着对象的存在而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失 - 初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须先定义、赋值才能使用
6.封装特性
封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
优点:
- 通过方法来控制成员变量的操作,提高了代码的安全性
- 把代码用方法进行封装,提高了代码的复用性
- 隐藏代码实现细节,提供公共访问方式,简化操作
封装原则:
- 把不需要对外提供的内容隐藏起来
- 把属性隐藏,提供公共方法对其访问
private
private、public都是权限修饰符,可以用来修饰成员变量、成员方法和构造方法;
private表示私有,用它修饰类的成员(含成员变量、成员方法),则这些成员只能在类内(类的成员函数内部)去使用,其他地方不可以操作;
public表示公有,用它修饰类的成员(含成员变量、成员方法),则这些成员在类内、类外都都可以操作。
封装实现:
- 使用private修饰成员变量
- 提供对应的set,get方法
- 具体使用时,借助对象的set方法给属性赋值,get方法获取属性值
7.this关键字
在类的普通成员方法中,可以使用this关键字,其表示调用当前方法的对象引用,即哪个对象对象调用该方法,this就代表哪一个对象。
this关键字的用法:
- 对成员变量和局部变量进行区分
固定格式:this.数据成员; - 调用类中的成员方法
固定格式:this.成员方法(实际参数列表); - 调用类中的其他构造器
固定格式:this(实际参数列表);
多参构造器调用时,只需要在this参数列表填入形参即可,少参调用多参时,是需要在this参数列表多出来的参数中填上其参数形式对应的默认值。
结论:成员方法被哪个对象调用,方法中的this就代表那个对象,即谁调用,this就代表谁。
注意: this(实际参数列表) 必须是构造方法中的第一行有效代码。
8.构造方法
构造方法可以对对象进行初始化操作,即为对象开辟内存空间的同时,给对象的成员赋初值。
注意事项:
- 构造方法一般使用 public 修饰
- 构造方法没有返回值类型,连 void 都没有
- 构造方法名和类名相同(区分大小写)
- 构造方法可以重载
//固定定义格式
[修饰符] 类名(参数列表) {
初始化语句s;
}
执行时机 :
- 创建对象的时候会被自动调用,每创建一个对象,就会执行一次构造方法
- 不要,也不能手动调用构造方法
注意事项补充:
- 用户不定义构造方法,则系统会提供一个无参构造方法
- 用户定义构造方法,则系统不再提供无参构造方法
- 用户不需要也不可以主动调用构造方法,系统会自动调用