🤼♀️ 面向对象和面向过程
C语言是面向过程
Java语言是面向对象
什么是面向过程?
就是强调过程,比如说我们要做一个大型的项目,但是呢,做这个项目需要划分为几个功能块(方法),这个几个功能块组合在一起就形成了这个项目,我们重点关注的就是这几个方法,因为这几个方法如果都做好,那项目自然也就完成了,那也就说我们重点强调的就是每一个方法,每一个过程,面向方法,面向过程。
什么是面向对象?
就是强调对象,比如说我们要做一个大型的项目,但是呢,做这个项目需要划分为几个功能块(方法),这个几个功能块组合在一起就形成了这个项目,但是,我们换了一种思想,我们找一个对象,该对象具备这几个功能,那我们只需要重点关注这个一个对象就可以了,面向对象
面向过程和面向对象有什么关系呢?
面向对象是基于面向过程的,是建立在面向过程基础之上的
面向对象的好处是什么?
- 它是一种更符合我们人类思想习惯的思想
- 它可以将复杂的事情简单化
- 它可以将我们程序员从执行者变成指挥者
举例子:
旅游:
面向过程:自己买各种旅游装备,自己查找攻略,自己准备食物,自己准备交通工具,什么事都要自己去做
面向对象:找一家旅游公司,就完事,指挥旅游公司办事就可以了
找对象:
面向过程:如果没有对象的话,我们生活很累,碗自己刷,衣服自己洗,什么活都要自己干
面向对象:如果我们有对象的话,我们什么都不干了,只要指挥对象做事情就可以了
🏄 类和对象
类是事物的属性(外在特征)和行为(具备的功能)的集合
想要知道Java中类是什么,我们要先知道现实生活中的类是什么,因为Java源于现实生活
现实生活中的”类”到底什么意思呢?
很多相似事物的综合,许多相似或者相同事物的综合
比如说人”类”,为什么我们人类呢,因为我们什么都相似,我们都有共同的外在特征,比如都有耳朵鼻子嘴巴等
都有姓名,年龄等等。我们都有相似相同的功能,比如都有吃喝拉撒睡,所以说把我们围在一起,就称为人类。
什么是对象?
对象是类的具体的体现
如果拿人”类”为例的话,那对象就是类中具体的你,我,他
怎么写一个类
定义类要用关键字class
格式:
class 类名 {
类的属性;
类的行为;
}
步骤:
- 知道你要写的类是什么,从现实生活中去寻找
- 该类事物中有哪些属性
- 该类事物中有哪些行为
什么是属性?
- 是事物的外在特征
什么是行为?
- 是事物所具备的功能,一般都是动词
成员变量
成员方法
- 举例子:
需求:定义一个人类
- 我们找描述的人类
- 属性:姓名,年龄,性别,血型,星座
动作:吃,喝,拉,撒,睡
class Person {
//类的属性
String name;
int age;
String sex;
String xuexing;
String xingzuo;
//类的行为;
public void eat() {
System.out.println("吃");
}
public void drink() {
System.out.println("喝");
}
public void la() {
System.out.println("拉");
}
public void sa() {
System.out.println("撒");
}
public void sleep() {
System.out.println("睡");
}
}
怎么使用一个类
我们不能说使用一个类,应该使用的是对象
创建对象的格式
类名 对象名 = new 类名();
Person p = new Person();
注意:创建对象一定要有这个类。
怎么使用对象中的属性?
对象名.属性名 = 属性值;
p.name = "tom";
p.age = 18;
p.sex = "女银";
p.xingzuo = "处女座";
p.xuexing = "AB型"
怎么使用对象中的行为?
对象名.方法名();
p.eat();
p.drink();
p.sleep();
🎯 对象内存模型分析
一个对象的内存图
二个对象的内存图
一个对象创建两个堆内存图
一个对象的地址值给另一个对象
🎪 成员变量和局部变量
局部变量
定义在方法中,或者方法声明上的变量就是局部变量
public static void main(String[] args) {
int i = 1;//局部变量
{
int j = 2; //局部变量
}
}
public static int getSum(int i, int j) {//形参也是局部变量
int sum = i + j;
return sum;
}
成员变量
定义在类中,方法外的变量就是成员变量
class Person {
String name; //成员变量
int age;
public void eat() {
}
}
成员变量和局部变量的区别
- 定义位置不同
- 局部变量:定义在方法中或者方法的声明上
- 成员变量:定义在类中方法外
- 内存位置不同
- 局部变量:存储在栈中的方法中
- 成员变量:存储在堆中的对象中
- 初始值不同
- 局部变量:没有默认初始值,想要使用一定要先赋值在使用
- 成员变量:有默认初始化值,如果不赋值也可以使用
- String类型的变量默认初始值 null
- int类型的变量默认初始值 0
- boolean类型的变量默认初始值 false
- double类型的变量默认初始值 0.0
- char类型的变量默认初始值 ‘\u0000’
- 生命周期不同
局部变量:因为是存储在方法中,所以是随着方法的存在而存在,随着方法的消失而消失
成员变量:因为是存储在对象中,所以是随着对象的存在而存在,随着对象的消失而消失
- 作用域范围不同
局部变量:出了方法就用不了了
成员变量:在本类中的方法中都可以使用
🎮 匿名对象
没有名字的对象就是匿名对象
匿名对象的格式
new 类名();
如:new Person();
匿名对象如何使用属性和方法
new 类名().属性名;
new 类名().方法名();
匿名对象的特点
- 一次性
- 只能使用一次
什么时候使用匿名对象
- 当我们只需要使用一次对象的属性或者方法的时候,就可以选择使用匿名对象
💡 匿名对象可以作为实际参数进行传递
举例子:
class Demo {
public static void main(String[] args) {
/*
常规写法
Person person = new Person();
Pig pig = new Pig();
person.eat(pig);
*/
new Person().eat(new Pig()); //匿名对象
}
}
class Person {
public void eat(Pig pig) {
//Pig pig = new Pig()
System.out.println("我喜欢吃" + pig.name);
}
}
class Pig {
String name = "烤乳猪";
}