JAVASE 【Java基础五之面向对象1】
1、面向对象概述
- 1.1 什么是面向对象
Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下, 使用Java语言去设计、开发计算机程序。 这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。面向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件的设计思想。 它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去操作实现。
- 1.2 面向过程与面向对象
面向过程: 完成一个功能时,功能的每一个步骤,都需要我们进行参与,每一个细节都需要了解清楚,才能完成。强调的是过程。
面向对象强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去 操作实现
举例 洗衣服
面向过程:把衣服脱下来–>找一个盆–>放点洗衣粉–>加点水–>浸泡10分钟–>揉一揉–>清洗衣服–>拧干–>晾起来
面向对象:把衣服脱下来 --> 打开全自动洗衣机 -->扔衣服 --> 按钮 --> 晾起来
举例 吃饭
面向过程 :> 买菜 --> 切菜 --> 洗菜 --> 上锅烧油 爆炒(调料) --> 上盘 --> 开吃 --> 洗碗
面向对象: 饭馆 --> 老板娘来一盘饺子 --> 开吃
- 1.3 面向对象的特点
1. 符合了我们人类思考习惯的思想
2. 将复杂的事情进行简单化了
3. 将执行者变成了指挥者(角色发生了改变)
- 1.4 面向对象的三大特征
1.封装
2.继承
3.多态
2、类和对象
- 2.1、什么是类
类是一组相关属性和行为的集合。类就是现实生活的一个事物,事物由属性和行为组成。
【类就是描述现实生活中的某一个事物,这个事物是由属性和行为组成】
-
属性:就是该事物的状态信息。
-
行为:就是该事物能够做什么。
-
2.2、什么是对象
对象:是一类事物的具体体现。对象是类的一个实例(对象并不是找个女朋友),必然具备该类事物的属性和行为
-
举例:一只小猫。
-
属性:tom、5kg、2 years、yellow。
-
行为:溜墙根走、蹦跶的跑、喵喵叫。
-
-
2.3 、类与对象的关系
类是对一类事物的描述,是抽象的
对象是一类事物的实例,是具体的
类是对象的模板,对象是类的实体
类:学生 汽车图纸
对象: 班长,一个具体的对象 大众 宝马 MG
3、创建类和对象
- 3.1类的组成部分
[1]属性(对应程序中的数据)
通过程序中的各种数据类型,来描述一个类的『特征』,例如:汽车的颜色、汽车的排量、汽车的价格……
[2]行为(对应程序中的操作)
通过程序中的方法(也就是面向过程视角中的函数),来执行这个类的对象能够做的『动作』。例如:汽车的行驶、汽车的鸣笛、汽车的启动、汽车的停泊……
属性 | 行为 | |
---|---|---|
猫 | 毛色 品种 年龄 体重 性别 | 吃猫粮 抓老鼠 走猫步 撒娇 喵喵 |
树 | 品种 年龄 高度 功用 | 生长 落叶 结果 枯萎 |
英文名 | 面向过程角度名称 | 面向对象角度名称 |
---|---|---|
Filed | 成员变量 | 属性 |
Method | 成员函数 | 方法 |
- 3.2、声明类
public class Person {
// 属性/成员变量
// 暂时先不管声明属性的具体规则,像以前一样声明变量先使用
// 这个成员变量即使没有初始化,系统也会为它分配初始值
// int类型的初始值是0
int weight;
// 方法/成员函数
// 暂时先不管声明函数的具体规则,先声明一个最简单的
// public:表示这个方法可以在任何地方被调用
// void:表示这个方法没有返回值
// (int food):声明这个方法在被调用时可以传入的参数
public void eat(int food) {
weight = weight + food;
}
public void say() {
System.out.println("我现在的体重是:" + weight);
}
}
- 声明一个对Person进行测试的类
public class PersonTest {
public static void main(String[] args) {
// 1.创建Person类的对象
// 第一步:声明一个Person类这个类型的变量
// 第二步:使用new关键字创建Person类的对象,对象赋值给第一步声明的变量
// 在new关键字后面的,是Person类的『构造器』
// 构造器在以后还会介绍更多细节,现在大家就按照:类名()的格式写就行
Person person = new Person();
// 2.调用Person对象的eat()方法:让这个人吃饭
// 调用有参数方法的格式:指向对象的那个变量.方法名(参数)
person.eat(5);
// 3.调用Person对象的say()方法:让这个人说说他的体重
// 调用无参数方法的格式:指向对象的那个变量.方法名()
person.say();
// 4.直接修改weight属性
// 在类之外的其他地方是否可以操作类的属性,取决于属性的修饰符
// 在将来学习了面向对象的『封装』特性后,我们会知道,在类的外部不建议直接操作类的属性
person.weight = 20;
person.say();
}
}
4、类中的属性
- 4.1、声明属性的语法格式
修饰符 数据类型 属性名;
或
修饰符 数据类型 属性名 = 初始化值;
- 4.2、初始化值
声明一个属性时,如果没有明确的对这个属性进行初始化值的设置,那么系统会给这个属性设置默认值。所以如果有确定的需要可以设置属性的默认值,如果没有特殊需要,不设置也行。
- 4.3、数据类型
- 基本数据类型
- 引用数据类型
- 4.4、权限修饰符
权限修饰符不仅对类的属性有要求,对类中的方法的要求是完全一样的:
修饰符名称 | 含义 | 本类 | 同包其他类 | 子类 | 同工程其他类 |
---|---|---|---|---|---|
private | 私有 | √ | × | × | × |
default | 缺省 | √ | √ | × | × |
protected | 受保护 | √ | √ | √ | × |
public | 公共 | √ | √ | √ | √ |
- 同包类访问私有属性:
- 同工程、不同包的类访问缺省权限属性:
- 同工程、不同包的类访问受保护权限属性:
- 4.5、属性名
属性也叫成员变量,所以属性名作为标识符适用变量的标识符规则和规范。
5、对象的内存分析
public class Cat {
private String catName = "dingdang";
int weight;
public void say(String master) {
boolean emotion = true;
if (emotion) {
int food = 5;
System.out.println("My name is " + catName + ",I want food:" + food);
}
}
}
- 5.1基本情况
[1]声明变量
// 1.声明Cat类型的变量
Cat cat;
[2]创建对象
大家可以记住:只要看见使用了new关键词,就表示在堆内存中一定开辟了新的空间,一定创建了新的对象。
// 2.给Cat类型的变量赋值一个Cat类型的对象
cat = new Cat();
[3]调用方法
// 3.调用Cat对象的方法
cat.say("tom");
[4]say()方法执行完成
局部变量就会被释放掉
[5]main()方法执行完成
main()方法中的cat局部变量也会被释放掉。然后Cat对象就成了“断了线的风筝”被垃圾回收机制回收。
- 5.2创建两个对象
证明:两个对象在堆空间中分别有自己的副本,分别进行操作时互不影响。
[1]创建第一个对象
Cat cat01 = new Cat();
[2]创建第二个对象
Cat cat02 = new Cat();
[3]第一个变量设置属性
cat01.weight = 10;
[4]第二个变量设置属性
cat02.weight = 20;
- 两个变量指向同一对象
Cat cat03 = new Cat();
Cat cat04 = cat03;
分别用两个变量修改weight属性:
cat03.weight = 66;
cat04.weight = 88;
- 变量置空
[1]将cat04置空
cat04 = null;
[2]将cat03置空
cat03 = null;
6、方法
-
6.1 为什么使用方法
-
[1]代码复用
- [2]参数和返回值
方法的参数和返回值都不是必须有的,根据需要设置。
- 方法的参数:我们命令方法替我们干活的时候,有时需要给方法提供一些数据。
- 形式参数:声明方法时指定的参数,用来说明这个方法可以接受哪些参数(简称形参)
- 实际参数:调用方法时实际传入的参数,用于方法执行过程中实际的运算(简称实参)
- 方法的返回值:方法执行完成后,给方法的调用者返回的结果数据。
- 6.2、方法的声明和调用
洗衣机 | 方法 |
---|---|
工厂生产洗衣机 | 声明方法 |
用户使用洗衣机 | 调用方法 |
[1]声明方法的代码
// 声明一个方法:求两个整数的和
// int a,int b声明方法的参数:形式参数
// public int:表示方法的访问权限是public,返回值是int类型
// 方法名:add
public int add(int a, int b) {
// 计算a + b的和
int addResult = a + b;
// 使用return关键字将a + b的和返回给方法的调用者
return addResult;
}
[2]调用方法的代码
// 1.要调用一个方法,需要先创建方法所在类的对象
Calculator calculator = new Calculator();
// 2.通过对象调用方法
// 这里传入给方法的5、11,我们叫做实际参数
int addResult = calculator.add(5, 11);
[3]方法相关规则
- 方法调用一次就会执行一次
- 方法必须写在类中,不能独立存在。
- 方法如果没有返回值,方法体内可以没有return;如果写了return,那么表示方法结束。
- 方法声明的返回值类型必须和实际返回的数据类型一致。
- 方法内部不能再声明方法。
返回值是int类型
// 方法名:add
public int add(int a, int b) {
// 计算a + b的和
int addResult = a + b;
// 使用return关键字将a + b的和返回给方法的调用者
return addResult;
}
[4]调用方法的代码
// 1.要调用一个方法,需要先创建方法所在类的对象
Calculator calculator = new Calculator();
// 2.通过对象调用方法
// 这里传入给方法的5、11,我们叫做实际参数
int addResult = calculator.add(5, 11);
- 6.3 方法相关规则
- 方法调用一次就会执行一次
- 方法必须写在类中,不能独立存在。
- 方法如果没有返回值,方法体内可以没有return;如果写了return,那么表示方法结束。
- 方法声明的返回值类型必须和实际返回的数据类型一致。
- 方法内部不能再声明方法。
- 6.4、方法重载
①需求
计数器类中已有方法:做两个int类型的加法
public int add(int a, int b)
想要增加新的方法:做两个double类型的加法
public double add(double a, double b)
为了满足更多使用情况,还想有更多方法:
public int add(int a, int b, int c)
小结:在一个类中,很可能会有很多类似的需求,为了满足这些需求,我们会声明很多相似的方法。同时为了让方法的调用者体验更好、更容易找到所需方法,这些功能相近的方法最好使用『同一个方法名』。
②前提
- 同一个类中
- 同名的方法
③方法重载的好处
- 没有重载不方便:让方法调用者,在调用方法的时候,不必为了相似的功能而查阅文档,查找各种不同的方法名,降低学习成本,提高开发效率。
- 有了重置很方便:在调用一系列重载的方法时,感觉上就像是在调用同一个方法。对使用者来说,只需要知道一个方法名就能够应对各种不同情况。
④规则限制
限制的来源:本质上只要让系统能够区分清楚我们具体要调用哪一个方法。
- 在同一个类中,如果两个方法的方法名一致,那么参数列表必须不同。
- 参数列表区分
- 要么是参数个数不同
- 要么是参数类型不同
- 重载方法举例
[1]参数个数不同
public int add(int a, int b)
public int add(int a, int b, int c)
[2]参数类型不同
public int add(int a, int b)
public double add(double a, double b)
或:
public double add(int a, double b)
public double add(double a, int b)
- 方法可变参数
①需求
在实际开发过程中,确实有一些情况不确定在调用方法时传入几个参数。所以为了让调用方法时能够弹性传参,JavaSE5.0标准增加了可变参数功能。
②声明和调用
// 能够计算任意个数整数之和的加法
// 使用String ... args来声明可变参数
public String add(String ... args) {
System.out.println("暗号:可变参数");
String sum = "";
// 在方法体内,可变参数按照数组形式来处理
for (int i = 0; i < args.length; i++) {
sum = sum + args[i];
}
return sum;
}
测试代码:
String addResultStr = calculator.add("a");
System.out.println("addResultStr = " + addResultStr);
addResultStr = calculator.add("a", "b");
System.out.println("addResultStr = " + addResultStr);
addResultStr = calculator.add("a", "b", "c");
System.out.println("addResultStr = " + addResultStr);
addResultStr = calculator.add();
System.out.println("addResultStr = " + addResultStr);
③语法规则
-
可变参数必须在整个参数列表的最后
-
当调用方法时实际传入的参数既匹配可变参数列表方法,又匹配一个具体的参数列表方法,那么系统会优先调用具体的参数列表方法
举例:调用方法add(5, 3)
可变参数方法:add(int … args)
具体参数方法:add(int i, int j)【系统会调用这个方法】
- 一个方法只能声明一个可变参数
-
方法参数值传递
-
①基本数据类型
- ②引用数据类型