今日内容
- 面向对象概述
- 类和对象的关系
- 面向对象内存图
- private、this关键字和封装
面向对象之构造方法
面向对象三大特征
- 封装
- 继承
- 多态
01. 面向过程和面向对象思想概述
- 1. 什么是面向过程?
- 2. 什么是面向对象?
- 3. 面向对象思想的好处是什么?
总结:
1. 面向过程强调的是过程,通过第一步,第二步...一步步的自己去实现功能。
2. 面向对象强调的是对象,通过【指挥】对象中的功能,来帮我们完成需求
3.
1. 面向对象是一种思想,更符合我们思考问题得一种习惯
2. 面向对象将我们从执行者的位置变成了指挥者
3. 将复杂的问题简单化
结论:万物皆对象
-> 现实生活中的任何一种事物都具备自己的功能
-> 使用代码的形式去描述这个事物,并使用该事物的具体功能
02. 面向对象思想特点和举例
- 举例说明
总结:
懒人思想, 指挥对象去做某件事情.
买电脑:
面向过程:1. 上网学习各个参数的解释
2. 了解各个品牌的性价比
3. 购买..
面向对象:找一个懂电脑的人帮我去买
洗衣服:
锅包肉:
03. 类和对象的概述
- 1. 如何通过java描述现实生活中事物
- 2. 类是由什么组成的?
- 3. 类和对象的关系是什么?
总结:
1. java描述现实生活中的任何一种事物, 都是通过类的形式进行描述
--> JavaBean类 -> 封装数据的
class Dog{}
class Student{}
--> 测试类
class Demo{
main(){
}
}
2.
属性 : 该事物具体的特征
例如:姓名,年龄,学号...
行为 : 该事物具体可以做的事情
例如:学习,吃饭,睡觉
3.
类:一组相关属性和行为的集合,可以将类看作为一个模子,或者说是一张图纸
对象:具体存在的事物
结论:根据类,才能创建出对象
04. 学生类的定义
- 1. 属性和行为分别用什么表示?
- 2. 又该如何编写?
总结:
1.
属性: 成员变量
行为: 成员方法
2.
成员变量: 跟之前定义变量的格式的一样, 只不过位置发生了改变, 在类中方法外.
成员方法: 跟之前定义方法的格式一样, 只不过去掉了static关键字
- 3. 成员变量和局部变量的区别:
只要是跟局部有关的, 就都跟方法有关.
(这只是部分)
总结:
1:
位置不同:
局部变量: 方法内, 或者是方法的声明上(形参).
成员变量: 类中方法外.
2:
初始化值不同:
局部变量: 没有默认初始化值, 在使用之前必须完成赋值才能使用.
成员变量: 有默认初始化值.
- 5分钟时间练习
05. 学生类的使用
- 1. 创建对象的格式?
- 2. 如果调用对象中的属性?
- 3. 如何调用对象中的行为?
总结:
1. 类名 对象名 = new 类名();
2. 对象名.属性名;
3. 对象名.方法名();
- 5分钟时间练习
06. 手机的定义和使用
- 分析:
属性: 品牌, 价格, 颜色
行为: 打电话, 发短信
打电话的功能要求加入姓名
例如: 给李小璐打电话.
5分钟时间自己编写.
07. 一个对象的内存图
- 要求自己会画
08. 方法共用的内存图
- 示例代码:
public class PhoneDemo2 {
public static void main(String[] args) {
Phone p = new Phone();
p.brand = "小米5s";
p.price = 1999;
p.color = "银色";
System.out.println(p.brand+"---"+p.price+"---"+p.color);
p.call("林青霞");
p.sendMessage();
Phone p2 = new Phone();
p2.brand = "IPhone7S";
p2.price = 7999;
p2.color = "土豪金";
System.out.println(p2.brand+"---"+p2.price+"---"+p2.color);
p2.call("张曼玉");
p2.sendMessage();
}
}
总结: 在一次程序的执行过程中如果创建了多个对象
- .class文件只加载一次
扩展:
垃圾回收机制
Java语言有完善的垃圾回收机制, 会在不定时的时候对内存中的垃圾进行清扫
啥是内存中的垃圾?
当一个对象的地址值没有任何一个引用记录住的时候, 那么此对象就会变成垃圾
Phone p = new Phone();
p.brand = "小米5s";
p.price = 1999;
p.color = "银色";
System.out.println(p.brand+"---"+p.price+"---"+p.color);
p.call("林青霞");
p.sendMessage();
注意: p = null;
09. 两个对象的内存图(两个引用指向同一个堆内存)
- 看图说话
10. 成员变量和局部变量的区别
总结:
A:位置不同
成员变量:类中,方法外
局部变量:在方法内部,或者是方法的声明上(形参)
B:初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,使用之前必须完成赋值才能使用。
C:生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的弹桟而消失
D:内存位置不同
成员变量:存放在【堆内存】的对象中
局部变量:存放在【桟内存】的方法中
E:作用域不同(编写代码)
局部变量:仅在他所在的大括号中有效
成员变量:在整个类当中
11. private关键字的概述和特点
- private权限修饰符可以修饰什么?
- 被其修饰的(成员)有什么特点?
总结:
1. 成员
A. 成员变量
B. 成员方法
2. 只能在本类当中进行使用
12. private修饰后的标准类代码
- 案例演示
- 5分钟时间练习
问题: setXxx和getXxx方法一定要成对儿出现吗?
总结:
不一定, 需要根据具体的业务去组织.
13. 封装的概述和好处
- 1. 概述下什么是封装?
- 2. 封装的好处又是什么?
总结:
1. 封装:隐藏实现细节,仅对外暴露公共的访问方式
体现:私有成员变量,提供setXxx和getXxx方法
2.
A:提高了代码的安全性
B:提高了代码的复用性
封装是一种思想,并非是一个技术点.
将一段带有功能的逻辑代码抽取到方法中,这是对代码的一种封装
让数据抽取到一个JavaBean类中,这是对数据的一种封装
14. this关键字的概述和使用
- 1. 什么是this关键字
- 2. this关键字的作用是什么?
总结:
1. this代表当前对象的引用,谁来调用我,我就代表谁
大白话:用来调用本类成员变量的
2. 用来区分局部变量和成员变量的重名问题
public void setAge(int age){
this.age = age;
}
- 练习
(6分钟)
定义一个学生类
属性:姓名和年龄
生成对应的getter/setter方法
使用this关键字区分局部和成员变量
新建一个测试类测试学生类
15. 构造方法的概述和使用
- 1. 什么是构造方法?
- 2. 构造方法的格式为?
- 3. 构造方法可以有return语句吗?
总结:
1. 构建或者说创造一个对象时,调用的方法
换句话来说,如果一个类,没有构造方法,就不能创建对象
2.
1. 方法名与类名相同,大小写也要一致
2. 没有返回值类型,连void都没有
3. 没有具体的返回值
3.
可以写return语句,用来结束方法
但是return后面绝对不能跟具体的值
正确:
public Person(){
return;
}
错误:
public Person(){
return 10;
}
问题: 构造方法在什么时候被调用? 能不能手动调用?
[每一次]创建对象的时候,由系统自动调用.
构造方法不能手动调用
错误代码: p.Person();
问题: 构造方法的作用是什么?
用来给对象中的数据(成员变量)进行,初始化!
16. 构造方法的注意事项
- 1. 构造方法注意事项?
- 2. 构造方法能够重载吗?
- 3. 给成员变量的两种初始化方式有什么区别?
总结:
1. 一个类,如果没有给出构造方法,系统将会提供一个空参数的构造方法 -> public Person(){}
如果手动给出了构造方法,系统就不会再提供那个默认的空参构造了
建议:今后编写代码的时候,空参有参都手动给出
2.
构造方法也是方法,允许进行重载
一般我们会在空参构造的基础上,重载一个有参构造方法,方便对成员变量进行初始化。
3.
1. 通过有参构造初始化
2. 通过setXxx方法
一般都是配合使用的,往往会通过有参构造进行【初始化】,随后通过setXxx方法【修改】属性值
17. 标准的学生类代码编写和测试
- 案例演示
- 5分钟时间操作
1. 私有成员变量
2. 提供setXxx和getXxx方法
3. 提供空参有参构造
定义一个标准的汽车类
包含以下属性:
品牌 价格 颜色
私有成员变量
提供setXxx和getXxx方法
提供空参有参构造
包含以下行为:
跑
定义一个测试类测试刚定义的汽车类
// 空参构造: Alt + shift + s + c
// 有参构造:Alt + shift + s + o
// setXxx\getXxx : Alt + shift + s + r