🤼‍♀️ 面向对象和面向过程

C语言是面向过程
Java语言是面向对象

什么是面向过程?

就是强调过程,比如说我们要做一个大型的项目,但是呢,做这个项目需要划分为几个功能块(方法),这个几个功能块组合在一起就形成了这个项目,我们重点关注的就是这几个方法,因为这几个方法如果都做好,那项目自然也就完成了,那也就说我们重点强调的就是每一个方法,每一个过程,面向方法,面向过程。

什么是面向对象?

就是强调对象,比如说我们要做一个大型的项目,但是呢,做这个项目需要划分为几个功能块(方法),这个几个功能块组合在一起就形成了这个项目,但是,我们换了一种思想,我们找一个对象,该对象具备这几个功能,那我们只需要重点关注这个一个对象就可以了,面向对象

面向过程和面向对象有什么关系呢?

面向对象是基于面向过程的,是建立在面向过程基础之上的

面向对象的好处是什么?

  1. 它是一种更符合我们人类思想习惯的思想
  2. 它可以将复杂的事情简单化
  3. 它可以将我们程序员从执行者变成指挥者

举例子:
旅游:
面向过程:自己买各种旅游装备,自己查找攻略,自己准备食物,自己准备交通工具,什么事都要自己去做
面向对象:找一家旅游公司,就完事,指挥旅游公司办事就可以了

找对象:
面向过程:如果没有对象的话,我们生活很累,碗自己刷,衣服自己洗,什么活都要自己干
面向对象:如果我们有对象的话,我们什么都不干了,只要指挥对象做事情就可以了

🏄 类和对象

类是事物的属性(外在特征)和行为(具备的功能)的集合

想要知道Java中类是什么,我们要先知道现实生活中的类是什么,因为Java源于现实生活
现实生活中的”类”到底什么意思呢?
很多相似事物的综合,许多相似或者相同事物的综合
比如说人”类”,为什么我们人类呢,因为我们什么都相似,我们都有共同的外在特征,比如都有耳朵鼻子嘴巴等
都有姓名,年龄等等。我们都有相似相同的功能,比如都有吃喝拉撒睡,所以说把我们围在一起,就称为人类。

什么是对象?

对象是类的具体的体现

如果拿人”类”为例的话,那对象就是类中具体的你,我,他

怎么写一个类

定义类要用关键字class

  1. 格式:
  2. class 类名 {
  3. 类的属性;
  4. 类的行为;
  5. }

步骤:

  1. 知道你要写的类是什么,从现实生活中去寻找
  2. 该类事物中有哪些属性
  3. 该类事物中有哪些行为
  • 什么是属性?

    • 是事物的外在特征
  • 什么是行为?

    • 是事物所具备的功能,一般都是动词

成员变量
成员方法

  • 举例子:

需求:定义一个人类

  1. 我们找描述的人类
  2. 属性:姓名,年龄,性别,血型,星座
  3. 动作:吃,喝,拉,撒,睡

    1. class Person {
    2. //类的属性
    3. String name;
    4. int age;
    5. String sex;
    6. String xuexing;
    7. String xingzuo;
    8. //类的行为;
    9. public void eat() {
    10. System.out.println("吃");
    11. }
    12. public void drink() {
    13. System.out.println("喝");
    14. }
    15. public void la() {
    16. System.out.println("拉");
    17. }
    18. public void sa() {
    19. System.out.println("撒");
    20. }
    21. public void sleep() {
    22. System.out.println("睡");
    23. }
    24. }

怎么使用一个类

我们不能说使用一个类,应该使用的是对象

创建对象的格式

  1. 类名 对象名 = new 类名();
  2. Person p = new Person();

注意:创建对象一定要有这个类。

怎么使用对象中的属性?

  1. 对象名.属性名 = 属性值;
  2. p.name = "tom";
  3. p.age = 18;
  4. p.sex = "女银";
  5. p.xingzuo = "处女座";
  6. p.xuexing = "AB型"

怎么使用对象中的行为?

  1. 对象名.方法名();
  2. p.eat();
  3. p.drink();
  4. p.sleep();

🎯 对象内存模型分析

一个对象的内存图

image.png

二个对象的内存图

image.png

一个对象创建两个堆内存图

image.png

一个对象的地址值给另一个对象

image.png

🎪 成员变量和局部变量

局部变量

定义在方法中,或者方法声明上的变量就是局部变量

  1. public static void main(String[] args) {
  2. int i = 1;//局部变量
  3. {
  4. int j = 2; //局部变量
  5. }
  6. }
  7. public static int getSum(int i, int j) {//形参也是局部变量
  8. int sum = i + j;
  9. return sum;
  10. }

成员变量

定义在类中,方法外的变量就是成员变量

  1. class Person {
  2. String name; //成员变量
  3. int age;
  4. public void eat() {
  5. }
  6. }

成员变量和局部变量的区别

  1. 定义位置不同
  • 局部变量:定义在方法中或者方法的声明上
  • 成员变量:定义在类中方法外
  1. 内存位置不同
  • 局部变量:存储在栈中的方法中
  • 成员变量:存储在堆中的对象中
  1. 初始值不同
  • 局部变量:没有默认初始值,想要使用一定要先赋值在使用
  • 成员变量:有默认初始化值,如果不赋值也可以使用
  • String类型的变量默认初始值 null
  • int类型的变量默认初始值 0
  • boolean类型的变量默认初始值 false
  • double类型的变量默认初始值 0.0
  • char类型的变量默认初始值 ‘\u0000’
  1. 生命周期不同

局部变量:因为是存储在方法中,所以是随着方法的存在而存在,随着方法的消失而消失
成员变量:因为是存储在对象中,所以是随着对象的存在而存在,随着对象的消失而消失

  1. 作用域范围不同

局部变量:出了方法就用不了了
成员变量:在本类中的方法中都可以使用

🎮 匿名对象

没有名字的对象就是匿名对象

匿名对象的格式

  1. new 类名();
  2. 如:new Person();

匿名对象如何使用属性和方法

  1. new 类名().属性名;
  2. new 类名().方法名();

匿名对象的特点

  1. 一次性
  2. 只能使用一次

什么时候使用匿名对象

  • 当我们只需要使用一次对象的属性或者方法的时候,就可以选择使用匿名对象

💡 匿名对象可以作为实际参数进行传递

  1. 举例子:
  2. class Demo {
  3. public static void main(String[] args) {
  4. /*
  5. 常规写法
  6. Person person = new Person();
  7. Pig pig = new Pig();
  8. person.eat(pig);
  9. */
  10. new Person().eat(new Pig()); //匿名对象
  11. }
  12. }
  13. class Person {
  14. public void eat(Pig pig) {
  15. //Pig pig = new Pig()
  16. System.out.println("我喜欢吃" + pig.name);
  17. }
  18. }
  19. class Pig {
  20. String name = "烤乳猪";
  21. }

image.png
image.png