• 03.类跟对象


    3. 类与对象

    3.1 面向过程与面向对象

    3.1.1 面向过程

    面向过程思想是一种解决问题的思想/思路,该思路更多的关注功能的实现过程,对实现的细节更加了解。

    使用这种思想解决问题,我们关心的是事情中有哪些步骤, 然后一步步进行具体实现;

    使用面向过程写程序,首先要分析需求由那些功能组成,然后写函数实现各个功能,最后根据需求依次调用各个函数;在这个过程中,开发者需要参与到实现的每一步中,就是劳动者。

    1. 需求简单时,程序设计简单明了,结构清晰;

    2. 需求复杂时,开发和维护困难;

    3. 不利于二次开发,各功能函数之间耦合度高,不利于代码复用;

    4. 在Java中的体现:定义函数,关注所有的细节/经过

    5. 面向过程开发,代码更多的集中在一个文件中

    3.1.2 面向对象

    面向对象思想也是一种解决问题的思想/思路, 更多的是关注代码复用问题, 追求低耦合高内聚;

    使用这种思想解决问题,我们关心的是事情的整体,功能实现需要的参与者;

    使用这种思想写程序,开发者更多的是关心系统的整体性(高级开发),功能的可替换性(中级开发),代码的可复用性(初级开发)。

    (初级开发)首先分析需求有那些功能,然后找有没有已经实现好功能的类,如果有,就直接拿来,创建它的对象,通过对象调用功能;如果没有,就需要根据系统原型/类图设计开发类,然后在类中书写实现功能的函数【面向过程】,然后创建这个类的对象,通过对象调用功能;

    在这种过程中,开发者更多的是在调用其他已经写好的类,是功能的调用和指挥者。

    在JAVA中,封装、继承、多态是面向对象(OOD)重要体现。

    核心 是 代码复用性

    使用此编程思想开发程序,使我们程序员从劳动者变成了一个指挥者

    1. 优点:适合开发复杂的功能;

    2. 使用在Java语言中的体现:封装、继承、多态

    在面向过程中,程序的基本单位是函数;面向对象,程序的基本组成就是类

    在开发过程中,是面向对象和面向过程结合的开发,面向对象负责抽象,进行系统的搭建;面向过程负责具体实现

    3.2 类与对象

    ​ 在应用领域中有意义的、与所要解决的问题有关系的任何事物都可以作为对象(object),它既可以是具体的物理实体的抽象,也可以是人为的概念,或者是人和有明确边界和意义的东西。

    任何事物都可以用对象来进行描述——万物皆对象。

    3.2.1 概念

    类:具有相同属性(数据元素)和行为(功能)的对象的抽象就是类

    类是对一种或多种事务/过程/事物的共同特征(属性、行为)的抽象描述,是事物的共性,是普遍性质。

    在JAVA种,类的实质是一种数据类型,由用户自定义的数据类型。在编程中,类不能直接进行操作,需要用类定义具体的对象,对这对象进行操作。

    类的主要作用是对代码复用的一种变革,将共同的逻辑属性进行抽取,防止重复开发,提高效率。

    继承解决的是事物的个性问题。

    对象: 具有某种身份的事物就是对象

    对象是类的具体实现。

    ​对象的性质:唯一性,每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。

    类是对象的抽象,对象是类的实现。

    3.2.2 类的定义格式

    public class 类名{
        属性(成员变量);
        方法(成员方法);
    }
    
    • 1
    • 2
    • 3
    • 4

    3.2.3 类包含的内容

    成员变量

    1. 概念:又称为属性

    2. 作用:描述事物的特征

    3. 位置:定义在class中,方法外

    4. 格式:数据类型 属性名/变量名;

      String name;	//此属性只有声明
      int i = 10;	//此属性声明同时初始化
      
      • 1
      • 2
    5. 属性操作

      1. 设置属性值: 对象名.属性 = 值;
      2. 获取属性值:一般配合打印语句System.out.println(对象名.属性名);

      补充:对象名又称为引用名

    局部变量

    位置:局部位置,不直接在class中

    1. 在方法体,方法的形参位置
    2. 代码块中
    
    • 1
    • 2

    局部变量和成员变量比较

    比较项成员变量局部变量
    定义位置class中,方法外不直接在class中
    内存位置
    默认值
    生命周期随着对象的创建而产生,随着对象被回收,而销毁随着方法被调用出现在栈中,方法一旦被执行完毕,就被弹栈了
    class Veriable1
    {
    	//定义成员变量
    	int a = 10;
    	public void show(){
    		//定义局部变量
    		int b = 20;
    
    		System.out.println("a=" + a);
    		System.out.println("b=" + b);
    	}
    	public void func(){
    		System.out.println("b=" + b);
    		/*
    		错误: 找不到符号
    		因为b的作用域是整个show方法,
    		出了show,外界无法访问它
    		*/
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    class Veriable2
    {
    	//定义成员变量
    	int i = 100;
    	public void show(){
    		//定义局部变量
    		int i = 1000;
    		/*
    			java编译器在执行到以下代码时,
    			会先去当前作用域查找是否有i变量存在;
    			如果有,就直接拿来使用;
    			如果没有,它会去外侧(类中)的作用域进行查找
    			如果有,也拿来使用,
    			如果没有,编译错误
    
    			特点:就近原则			
    		*/
    		System.out.println("局部变量i=" + i);	
    		System.out.println("成员变量i=" + this.i);
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    构造函数

    static

    1. 静态属性
    2. 静态方法
    3. 静态代码块

    代码块

    内部类

    1. 内部内部类,就是定义在其他类里面的类;

    2. 根据类写在其他类里面的位置的不同,可以分为成员内部类和局部内部类;

    3. 包含内部类的类就叫做外部类;

    3.2.4 类加载过程

    隐式三步

    1. JVM发现要使用一个类,首先要到方法区中找;
      1. 如果找到了,就直接使用,
      2. 如果没有找到,才会去找这个类的class文件,然后加载;(在找class文件时,是根据classpath配置的地址去找;如果没有配置,就在当前目录找)
    2. 在硬盘上找到class文件后,就开始加载这个class,根据书写顺序,先后将静态成员加载到静态区域,非静态成员加载到非静态区域;
    3. 接下来为所有的静态成员变量分配变量空间,同时赋默认值;
    4. 接下来根据书写的顺序为静态成员变量显示赋值,同时执行静态代码块;

    上面的步骤都执行完毕,类加载完成

    3.2.4 对象的创建过程

    1. 首先JVM在堆内存中开辟空间;

    2. 在对象空间中为类中的所有非静态成员变量分配空间,赋默认值;

    3. 调用相应的构造函数进栈;

    4. 在执行构造函数中的代码之前,先要执行隐式三步:

      • super():调用父类构造函数
      • 给对象空间中的非静态成员变量显示赋值
      • 执行构造代码块
    5. 完成隐式三步后,接下来开始执行构造函数中的代码;

    构造函数结束出栈,对象创建完成

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w47sRQnq-1656645827823)(assets/子类对象实例化的全过程图解.png)]

  • 相关阅读:
    计算机毕业论文Java项目源码下载基于SSM实现的宠物销售网站
    Android 11.0 framework添加自定义开机广播
    SpringBoot+Vue项目大学生心理服务系统
    uniapp 手动调用form表单submit事件
    【Spring Cloud】全面解析服务容错中间件 Sentinel 持久化两种模式
    快速分割视频,并提取原视频中的音频单独保存
    【JAVA UI】HarmonyOS如何跳转三方的地图导航
    Python用requests库采集充电桩LBS位置经纬度信息
    数据结构:平衡二叉树
    11个常见的分类特征的编码技术
  • 原文地址:https://blog.csdn.net/qq2512446791/article/details/125555440