• 22_面向对象思想


    第22章 面向对象思想

    作者:张子默

    一、面向对象思想概述

    1、概述

    Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,在面向对象思想的指引下,使用Java语言区设计、开发计算机程序。这里的对象泛指现实中一切事物,每种事物都具备自己的属性行为。面向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件的设计思想。它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步地去操作实现。

    2、举例

    洗衣服:

    • 面向过程:把衣服脱下来–>找一个盆–>放点洗衣粉–>加点水–>浸泡十分钟–>揉一揉–>清洗衣服–>拧干–>晾起来
    • 面向对象:把衣服脱下来–>打开全自动洗衣机–>扔衣服–>按钮–>晾起来

    区别:

    • 面向过程:强调步骤。
    • 面向对象:强调对象,这里的对象就是洗衣机。

    3、特点

    面向对象思想是一种更符合我们思考习惯的思想,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。面向对象的语言中,包含了三大基本特征,即封装、继承和多态。

    二、类和对象

    环顾一下周围会发现很对对象,比如桌子、椅子、同学、老师等。桌椅属于办公用品,师生属于人类。

    1、类的概念

    是一组相关属性行为的集合。可以看成是一类事物的模板,使用事务的属性特征和行为特征来描述该类事物。

    现实中,描述一类事物:

    • **属性:**该事物的状态信息。
    • **行为:**该事物能够做什么。

    举例:小猫

    • 属性:名字、体重、年龄、颜色
    • 行为:走、跑、叫

    2、对象的概念

    对象是一类事物的具体体现。对象是类的一个实例(对象并不是找个女朋友),必然具备该类事物的属性和行为。

    现实中,一类事物的一个实例:一只小猫

    • 属性:Tom、5KG、2 Years、Yellow
    • 行为:溜墙根走、蹦跶的跑、喵喵叫

    3、类与对象的关系

    • 类是对一类事物的描述,是抽象的
    • 对象是一类事物的实例,是具体的
    • 类是对象的模板,对象是类的实体
      在这里插入图片描述

    三、类的定义

    1、事物与类的对比

    现实世界的一类事物:

    • 属性:事物的状态信息。
    • 行为:事物能够做什么。

    Java中用class描述事物也是如此:

    • 成员变量:对应事物的属性
    • 成员方法:对应事物的行为

    2、类的定义格式

    public class ClassName {
        //成员变量
        //成员方法
    }
    
    • 1
    • 2
    • 3
    • 4
    • 定义类:定义类的成员,包括成员变量成员方法
    • 成员变量:和之前定义变量几乎是一样的。只不过位置发生了改变。在类中,方法外。
    • 成员方法:和以前定义方法几乎一样。只不过把static去掉,static的作用会在后续的章节中提到。

    类的定义格式举例:

    public class Student {
        //成员变量
        String name;//姓名
        int age;//年龄
        //成员方法
        //学习的方法
        publicvoid study() {
        	System.out.println("好好学习,天天向上");
        }
        //吃饭的方法
        publicvoid eat() {
        	System.out.println("学习饿了要吃饭");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    四、对象的使用

    1、对象的使用格式

    创建对象:

    类名 对象名 = new 类名();
    
    • 1

    使用对象访问类中的成员:

    对象名.成员变量;
    对象名.成员方法()
    • 1
    • 2

    对象的使用格式举例:

    public class Test01_Student {
        public static void main(String[] args) {
            //创建对象格式:类名 对象名 = new 类名();
            Student s = new Student();
            System.out.println("s:"+s); //cn.itcast.Student@100363
            //直接输出成员变量值
            System.out.println("姓名:"+s.name); //null
            System.out.println("年龄:"+s.age); //0
            System.out.println("‐‐‐‐‐‐‐‐‐‐");
            //给成员变量赋值
            s.name ="赵丽颖";
            s.age = 18;
            //再次输出成员变量的值
            System.out.println("姓名:"+s.name); //赵丽颖
            System.out.println("年龄:"+s.age); //18
            System.out.println("‐‐‐‐‐‐‐‐‐‐");
            //调用成员方法
            s.study(); // "好好学习,天天向上"
            s.eat(); // "学习饿了要吃饭"
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2、成员变量的默认值

    数据类型默认值
    基本类型整型(byte、short、int、long)0
    浮点数(float、double)0.0
    字符(char)‘\u0000’
    布尔(boolean)false
    引用类型数组、类、接口null

    五、类与对象的练习

    定义手机类:

    public class Phone {
        // 成员变量
        String brand; //品牌
        int price; //价格
        String color; //颜色
        // 成员方法
        //打电话
        public void call(String name) {
        	System.out.println("给"+name+"打电话");
        }
        //发短信
        public void sendMessage() {
        	System.out.println("群发短信");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    定义测试类:

    public class Test02Phone {
        public static void main(String[] args) {
            //创建对象
            Phone p = new Phone();
            //输出成员变量值
            System.out.println("品牌:"+p.brand);//null
            System.out.println("价格:"+p.price);//0
            System.out.println("颜色:"+p.color);//null
            System.out.println("‐‐‐‐‐‐‐‐‐‐‐‐");
            //给成员变量赋值
            p.brand = "锤子";
            p.price = 2999;
            p.color = "棕色";
            //再次输出成员变量值
            System.out.println("品牌:"+p.brand);//锤子
            System.out.println("价格:"+p.price);//2999
            System.out.println("颜色:"+p.color);//棕色
            System.out.println("‐‐‐‐‐‐‐‐‐‐‐‐");
            //调用成员方法
            p.call("紫霞");
            p.sendMessage();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    六、对象内存图

    1、一个对象,调用一个方法内存图

    在这里插入图片描述

    通过上图,我们可以理解,在栈内存中运行的方法,遵循"先进后出,后进先出"的原则。变量p指向堆内存中的空间,寻找方法信息,去执行该方法。

    但是,这里依然有问题存在。创建多个对象时,如果每个对象内部都保存一份方法信息,这就非常浪费内存了,因为所有对象的方法信息都是一样的。

    2、两个对象,调用同一方法内存图

    在这里插入图片描述

    对象调用方法时,根据对象中方法标记(地址值),去类中寻找方法信息。这样哪怕是多个对象,方法信息只保存一份,节约内存空间。

    3、一个引用,作为参数传递到方法中内存图

    在这里插入图片描述

    引用类型作为参数,传递的是地址值。

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

    变量根据定义位置的不同,我们给变量起了不同的名字。如下图所示:
    在这里插入图片描述

    • 在类中位置不同重点
      • 成员变量:类中,方法外
      • 局部变量:方法中或方法声明上(形式参数)
    • 作用范围不一样重点
      • 成员变量:类中
      • 局部变量:方法中
    • 初始化值不同重点
      • 成员变量:有默认值
      • 局部变量:没有默认值。必须先定义、赋值,最后使用
    • 在内存中位置不同了解
      • 成员变量:堆内存
      • 局部变量:栈内存
    • 生命周期不同了解
      • 成员变量:随着对象的创建而存在,随着对象的消失而消失
      • 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

    八、实例

    • 面向对象引入
    package com.zzm.day06.demo01;
    
    import java.util.Arrays;
    
    /**
     * 用途:
     * 时间:2021/5/26 20:34
     * 创建人:张子默
     */
    
    /*
    面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节。
    面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我做事儿。
     */
    public class Demo01PrintArray {
    
        public static void main(String[] args) {
            int[] array = {10, 20, 30, 40, 50, 60};
    
            // 要求打印格式为:[10, 20, 30, 40, 50]
            // 使用面向过程,每一个步骤细节都要亲力亲为。
            System.out.print("[");
            for (int i = 0; i < array.length; i++) {
                if (i != array.length - 1) { // 如果不是最后一个元素
                    System.out.print(array[i] + ", ");
                } else { // 如果是最后一个元素
                    System.out.println(array[i] + "]");
                }
            }
    
            System.out.println("===============");
    
            // 使用面向对象
            // 找一个JDK给我们提供好的Arrays类
            // 其中有一个toString方法,直接就能把数组变成想要的格式的字符串
            System.out.println(Arrays.toString(array));
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 类的概念
    package com.zzm.day06.demo01;
    
    /**
     * 用途:
     * 时间:2021/5/26 21:04
     * 创建人:张子默
     */
    
    /*
    定义一个类:用来模拟"学生"事物。其中有两个组成部分:
        属性(是什么):
            姓名
            年龄
        行为(能做什么):
            吃饭
            睡觉
            学习
    
    对应到Java的类当中:
        成员变量(属性):
            String name; // 姓名
            int age; // 年龄
        成员方法(行为):
            public void eat() {} // 吃饭
            public void sleep() {} // 睡觉
            public void study() {} // 学习
    
    注意事项:
        成员变量是直接定义在类当中的,在方法外边。
        成员方法不要写static关键字。
     */
    public class Student {
    
        // 成员变量
        String name; // 姓名
        int age; // 年龄
    
        // 成员方法
        public void eat() {
            System.out.println("吃饭饭!");
        }
    
        public void sleep() {
            System.out.println("睡觉觉!");
        }
    
        public void study() {
            System.out.println("学习!");
        }
    }
    
    
    package com.zzm.day06.demo01;
    
    /**
     * 用途:
     * 时间:2021/5/26 21:13
     * 创建人:张子默
     */
    
    /*
    通常情况下,一个类并不能直接使用,需要根据类创建一个对象,才能使用。
        导包:也就是指出需要使用的类,在什么位置。
            import 包名称.类名称;
            import com.zzm.day06.demo01.Student;
            对于和当前类属于同一个包的情况,可以省略导包语句不写。
        创建,格式:
            类名称 对象名 = new 类名称();
            Student stu = new Student();
        使用,分为两种情况:
            使用成员变量:对象名.成员变量名
            使用成员方法:对象名.成员方法名(参数);
            (也就是,想用谁,就用对象名点儿谁)
    
    注意事项:
        如果成员变量没有进行赋值,那么将会有一个默认值,规则和数组一样。
     */
    public class Demo02Student {
    
        public static void main(String[] args) {
            // 1.导包
            // 我需要使用的Student类和我自己Demo02Student位于同一个包下,所以省略导包语句不写
    
            // 创建,格式
            // 类名称 对象名 = new 类名称();
            // 根据Student类,创建了一个名为stu的对象
            Student stu = new Student();
    
            // 3.使用其中的成员变量,格式
            // 对象名.成员变量名
            System.out.println(stu.name); // null
            System.out.println(stu.age); // 0
            System.out.println("===============");
    
            // 改变对象当中的成员变量数值内容
            // 将右侧的字符串,赋值交给stu对象当中的name成员变量
            stu.name = "赵丽颖";
            stu.age = 18;
            System.out.println(stu.name); // 赵丽颖
            System.out.println(stu.age); // 18
            System.out.println("===============");
    
            // 4.适用对象的成员方法,格式
            // 对象名。成员方法名();
            stu.eat();
            stu.sleep();
            stu.study();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 类与对象
    package com.zzm.day06.demo02;
    
    /**
     * 用途:
     * 时间:2021/5/27 11:43
     * 创建人:张子默
     */
    
    /*
    定义一个类,用来模拟"手机"事物。
        属性:品牌、价格、颜色
        行为:打电话、发短信
    
    对应到类当中:
        成员变量(属性):
            String brand; // 品牌
            double price; // 价格
            String color; // 颜色
        成员方法(行为):
            public void call(String who) {} // 打电话
            public void sendMessage() {} // 群发短信
     */
    public class Phone {
    
        // 成员变量
        String brand; // 品牌
        double price; // 价格
        String color; // 颜色
    
        // 成员方法
        public void call(String who) {
            System.out.println("给" + who + "打电话");
        }
    
        public void sendMessage() {
            System.out.println("群发短信");
        }
    
    }
    
    package com.zzm.day06.demo02;
    
    /**
     * 用途:
     * 时间:2021/5/27 11:56
     * 创建人:张子默
     */
    public class Demo01PhoneOne {
    
        public static void main(String[] args) {
            // 根据Phone类,创建一个名为one的对象
            // 格式:类名称 对象名 = new 类名称();
            Phone one = new Phone();
            System.out.println(one.brand); // null
            System.out.println(one.price); // 0.0
            System.out.println(one.color); // null
            System.out.println("===============");
    
            one.brand = "苹果";
            one.price = 8388.0;
            one.color = "黑色";
            System.out.println(one.brand); // 苹果
            System.out.println(one.price); // 8388.0
            System.out.println(one.color); // 黑色
            System.out.println("===============");
    
            one.call("乔布斯"); // 给乔布斯打电话
            one.sendMessage(); // 群发短信
        }
    
    }
    
    package com.zzm.day06.demo02;
    
    /**
     * 用途:
     * 时间:2021/5/27 11:56
     * 创建人:张子默
     */
    public class Demo02PhoneTwo {
    
        public static void main(String[] args) {
            // 根据Phone类,创建一个名为one的对象
            // 格式:类名称 对象名 = new 类名称();
            Phone one = new Phone();
            System.out.println(one.brand); // null
            System.out.println(one.price); // 0.0
            System.out.println(one.color); // null
            System.out.println("===============");
    
            one.brand = "苹果";
            one.price = 8388.0;
            one.color = "黑色";
            System.out.println(one.brand); // 苹果
            System.out.println(one.price); // 8388.0
            System.out.println(one.color); // 黑色
            System.out.println("===============");
    
            one.call("乔布斯"); // 给乔布斯打电话
            one.sendMessage(); // 群发短信
            System.out.println("===============");
            
            Phone two = new Phone();
            System.out.println(two.brand); // null
            System.out.println(two.price); // 0.0
            System.out.println(two.color); // null
            System.out.println("===============");
    
            two.brand = "三星";
            two.price = 5999.0;
            two.color = "蓝色";
            System.out.println(two.brand); // 三星
            System.out.println(two.price); // 5999.0
            System.out.println(two.color); // 蓝色
            System.out.println("===============");
    
            two.call("欧巴"); // 给欧巴打电话
            two.sendMessage(); // 群发短信
        }
    
    }
    
    package com.zzm.day06.demo02;
    
    /**
     * 用途:
     * 时间:2021/5/27 11:56
     * 创建人:张子默
     */
    public class Demo03PhoneSame {
    
        public static void main(String[] args) {
            // 根据Phone类,创建一个名为one的对象
            // 格式:类名称 对象名 = new 类名称();
            Phone one = new Phone();
            System.out.println(one.brand); // null
            System.out.println(one.price); // 0.0
            System.out.println(one.color); // null
            System.out.println("===============");
    
            one.brand = "苹果";
            one.price = 8388.0;
            one.color = "黑色";
            System.out.println(one.brand); // 苹果
            System.out.println(one.price); // 8388.0
            System.out.println(one.color); // 黑色
            System.out.println("===============");
    
            one.call("乔布斯"); // 给乔布斯打电话
            one.sendMessage(); // 群发短信
            System.out.println("===============");
            
            Phone two = one;
            System.out.println(two.brand); // 苹果
            System.out.println(two.price); // 8388.0
            System.out.println(two.color); // 黑色
            System.out.println("===============");
    
            two.brand = "三星";
            two.price = 5999.0;
            two.color = "蓝色";
            System.out.println(two.brand); // 三星
            System.out.println(two.price); // 5999.0
            System.out.println(two.color); // 蓝色
            System.out.println("===============");
    
            two.call("欧巴"); // 给欧巴打电话
            two.sendMessage(); // 群发短信
        }
    
    }
    
    package com.zzm.day06.demo02;
    
    /**
     * 用途:
     * 时间:2021/5/27 12:47
     * 创建人:张子默
     */
    public class Demo04PhoneParam {
    
        public static void main(String[] args) {
            Phone one = new Phone();
            one.brand = "苹果";
            one.price = 8388.0;
            one.color = "土豪金";
    
            method(one); // 传递进去的参数其实就是地址值
        }
    
        public static void method(Phone param) {
            System.out.println(param.brand); // 苹果
            System.out.println(param.price); // 8388.0
            System.out.println(param.color); // 土豪金
        }
    
    }
    
    package com.zzm.day06.demo02;
    
    /**
     * 用途:
     * 时间:2021/5/27 13:01
     * 创建人:张子默
     */
    public class Demo05PhoneReturn {
    
        public static void main(String[] args) {
            Phone two = getPhone();
            System.out.println(two.brand); // 苹果
            System.out.println(two.price); // 8388.0
            System.out.println(two.color); // 玫瑰金
        }
    
        public static Phone getPhone() {
            Phone one = new Phone();
            one.brand = "苹果";
            one.price = 8388.0;
            one.color = "玫瑰金";
    
            return one;
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 局部变量和成员变量
    package com.zzm.day06.demo03;
    
    /**
     * 用途:
     * 时间:2021/5/28 15:01
     * 创建人:张子默
     */
    
    /*
    局部变量和成员变量
        定义位置不一样【重点】
            局部变量:在方法内部
            成员变量:在方法外部,直接写在类当中
    
        作用范围不一样【重点】
            局部变量:只有方法当中才可以使用,出了方法就不能再用
            成员变量:整个类全都可以通用
    
        默认值不一样【重点】
            局部变量:没有默认值,如果要想使用,必须手动进行赋值
            成员变量:如果没有赋值,会有默认值,规则和数组一样
        内存的位置不一样(了解)
            局部变量:位于栈内存
            成员变量:位于堆内存
    
        生命周期不一样(了解)
            局部变量:随着方法进栈而诞生,随着方法出栈而消失
            成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失
     */
    public class Demo01VariableDifference {
    
        String name; // 成员变量
    
        public void methodA() {
            int num = 20; // 局部变量
            System.out.println(num);
            System.out.println(name);
        }
    
        public void methodB(int param) { // 方法参数就是局部变量
            // 参数在方法调用的时候,必然会被赋值的
            System.out.println(param);
            int age; // 局部变量
            // System.out.println(age); // 没赋值不能用
            // System.out.println(num); // 错误写法!
            System.out.println(name);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
  • 相关阅读:
    OpenCV学习(4.9) OpenCV中的轮廓
    Kubectl 的使用——k8s陈述式资源管理
    springboot整合sharding-jdbc实现分库分表详解
    Python下载及环境的安装
    如何做回头率高的咖啡店?
    【R包开发:入门】 简介+ 包的结构
    【Rust 日报】2022-09-18 Linus提议将Rust添加到Linux6.1内核
    《财富》500 强企业要求 curl 开源工具作者提供免费及时的支持;基于Chromium的Edge浏览器正在整合文本预测功能 | 开源日报
    软件工程毕业设计课题(5)基于python的毕业设计python高校新生报到系统毕设作品源码
    【SpringCloud-学习笔记】初识Docker
  • 原文地址:https://blog.csdn.net/a1448824839/article/details/125558937