• 类和对象详解(开篇)


    目录

    什么是面向过程?什么又是面向对象?

    什么是类?如何定义类?

    什么是类?

    如何定义类?

    有了类之后如何产生对象?

    如何访问对象中的属性和方法?

     使用 . 来访问对象中的属性和方法.

    通过访问类里面的方法设置:

    当形参名和成员变量名相同时,成员变量会被赋值吗?

    当一个类有多个对象时,编译器是如何值知道每个对象所对应的数据的?

     1.通过.号前面被访问的对象

    2. 通过方法默认的隐藏参数

    初始化对象:

    1.默认初始化:

    2.就地初始化:

    如何调用构造方法?

    如何调用一个带参数的构造方法?

    编译器自动生成的构造方法:


    什么是面向过程?什么又是面向对象?

    我们手洗衣服会经历以下步骤:拿盆子——放水——放衣服——放洗衣服——手搓——换水——手搓——拧干——晾衣服等步骤。而这一系列步骤就是我们用手洗衣服的过程,我们需要通过很多的步骤才能完成洗衣服这个任务。

    用洗衣机洗衣服:我们只需要把衣服和洗衣粉放如洗衣机即可我们不需要关注洗衣服的过程,只需要把它放入洗衣机就可以完成洗衣服这个任务。

    用手洗衣服我们可以理解为是面向过程,我们需要完成洗衣服的每个步骤。

    用洗衣机洗衣服可以理解为面向对象,我们只需要把衣服放入洗衣机即可,不需要关注具体是怎么洗衣服的。

    什么是类?如何定义类?

    什么是类?

    类是用来对一个实体对象进行描述的。

    每个类别都有自己的属性,和功能(行为)

    比如洗衣机,在java中可以将其看成一个类别。

    属性:品牌,颜色,型号,尺寸,重量

    功能:洗衣,脱水,烘干。

    根据类自身属性和功能内容不同,一个类可以有多个具体的实例(对象)。

    比如现在有俩台洗衣机,一台是海尔品牌的,白色,又洗衣和脱水的功能。另一台是美的品牌的,黑色,有洗衣,脱水,和定时功能。这样我们就从一个抽象的类,具体到俩个实例(对象)了。

    如何定义类?

    类的定义格式
    在java中定义类需要用到 class关键字
    具体语法:
    1. // 创建类
    2. class ClassName{ field; // 字段(属性) 或者 成员变量
    3. method; // 行为 或者 成员方法 }
    class 定义类的关键字, ClassName 为类的名字, {} 中为类的主体。
    类中包含的内容称为类的成员属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类 具有哪些功能,称为类的成员方法。
    比如上面提到的洗衣机
    1. class WashMachine{
    2. public String brand; // 品牌
    3. public String type; // 型号
    4. public double weight; // 重量
    5. public double lenght; // 长
    6. public double weidth; // 宽
    7. public double height; // 高
    8. public String color; // 颜色
    9. public void WashClothes(){// 洗衣服
    10. System.out.println("洗衣功能"); }
    11. public void dryClothes(){ // 脱水
    12. System.out.println("脱水功能"); }
    13. public void SetTime(){ // 定时
    14. System.out.println("定时功能"); } }

    我们再来定义一个学生类:

    1. class Student{
    2. //属性 - 成员变量
    3. public String name;//名字
    4. public String gender;//年级
    5. public int age;//年龄
    6. public double score;//成绩
    7. //行为-成员方法
    8. public void doClass(){}//听课
    9. public void doHoemwork(){}//做作业
    10. public void exame(){}//考试
    11. public void output(){//输出姓名,年龄,分数
    12. System.out.println(name+" "+age+" "+score);
    13. }
    14. }
    定义成员属性可以不用初始化。
    注意事项:
    1. 一般一个文件当中只定义一个类
    2. main 方法所在的类一般要使用 public 修饰 ( 注意: Eclipse 默认会在 public 修饰的类中找 main 方法 )
    3. public 修饰的类必须要和文件名相同
    4. 不要轻易去修改 p ublic 修饰的类的名称

    有了类之后如何产生对象?

    类的实例化:
    定义了一个类,就相当于在计算机中定义了一个新的类型,与int,double类似,只不过int和double都是java语言自带的内置类型,而 类是用户自定义了一个新的类型。比如上述的WashMachine和Student就是我们自己创建的类,我们 可以使用这些类来定义实例(对象)
    通过new关键字实例化对象。
    语法格式:类型名 对象名 = new 类型名();
    一个类可以实例化多个对象
    1. public static void main(String[] args) {
    2. Student student1 = new Student();
    3. Student student2 = new Student();
    4. }

     当成员变量没有初始化的时候,默认值就是对应的初始值。

    1. public static void main(String[] args) {
    2. Student student1 = new Student();
    3. Student student2 = new Student();
    4. System.out.println(student1.name);
    5. }

    如何访问对象中的属性和方法?

     使用 . 来访问对象中的属性和方法.

    1. public static void main(String[] args) {
    2. Student student1 = new Student();
    3. student1.name = "zhangsan";
    4. student1.age = 18;
    5. student1.score = 99.5;
    6. student1.output();
    7. }

    定义一个TestDate类

    1. public class TestDate {
    2. public int year;
    3. public int month;
    4. public int day;
    5. public void setDay(int y,int m ,int d){
    6. year = y;
    7. month = m;
    8. day = d;
    9. }
    10. public void printDate(){
    11. System.out.println(year+"-"+month+"-"+day);
    12. }
    13. }

    设置TestDate里面的成员变量。

    1.通过.号访问成员变量设置。

    1. public static void main(String[] args) {
    2. TestDate data1 = new TestDate();
    3. data1.year = 2022;
    4. data1.month = 8;
    5. data1.day = 06;
    6. data1.printDate();
    7. }

    通过访问类里面的方法设置:

    2.通过.号访问TestDate里面的方法setDay设置

    1. public static void main(String[] args) {
    2. TestDate data1 = new TestDate();
    3. data1.setDay(2022,8,06);
    4. data1.printDate();
    5. }

    当形参名和成员变量名相同时,成员变量会被赋值吗?

    把上面的代码setDay里面的内容改成:

    1. public void setDay(int year,int month ,int day){
    2. year = year;
    3. month = month;
    4. day = day;
    5. }

     这时候我们再用访问setDay的方式来改变成员变量:

    1. public static void main(String[] args) {
    2. TestDate data1 = new TestDate();
    3. data1.setDay(2022,8,06);
    4. data1.printDate();
    5. }

    结果会是默认值,也就是说month,year,day,并没有被赋值。

    这是为什么呢?

    原因是局部变量优先:此时的形参名和成员变量名相同,形参的year,month,day是局部变量,所以认为这里的2022,8,06是赋值给了形参。

    简单来说就是 year = year;的左右俩边都是形参。而之前 year = y;左边year是成员变量,右边y是形参。

    当一个类有多个对象时,编译器是如何值知道每个对象所对应的数据的?

    1. public static void main(String[] args) {
    2. TestDate data1 = new TestDate();
    3. TestDate data2 = new TestDate();
    4. data1.setDay(2022,8,06);
    5. data2.setDay(2022,8,05);
    6. data1.printDate();
    7. data2.printDate();
    8. }

     1.通过.号前面被访问的对象

    2. 通过方法默认的隐藏参数

    每个方法的第一个参数都隐藏了一个this

    比如这里的setDay方法

    public void setDay(TestDate this,int y,int m ,int d)

    this可以理解为:当前对象的引用,谁调用这个方法,谁就是this。

    比如这里的data1.setDay(TestDate this,int y,int m,int d),这里的this指的就是data1。

    再回到之前形参名和成员变量名相同,形参会给形参赋值。如何解决这个问题?

    我们只需要加上this:

    1. public void setDay(int year,int month ,int day){
    2. this.year = year;
    3. this.month = month;
    4. this.day = day;
    5. }

    访问setDay的方式来改变成员变量:

    1. public static void main(String[] args) {
    2. TestDate data1 = new TestDate();
    3. data1.setDay(2022,8,06);
    4. data1.printDate();
    5. }

    原因:this指当前对象的引用,那么 这里的this指的就是data1。

    也可以看成 data1.year = year,左边是当前成员变量的year。而右边是形参year。

    this 引用的特性
    1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
    2. this只能在"成员方法"中使用
    3. "成员方法"中,this只能引用当前对象,不能再引用其他对象
    4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法 对象的引用传递给该成员方法,this负责来接收。

    初始化对象:

    1.默认初始化:

    在创建成员变量的时候不给它赋值。

    比如:
    1. public int year;
    2. public int month;

    2.就地初始化:

    在创建成员变量的时候给他一个值

    1. public int year = 2022;
    2. public int month = 8;

    构造方法

    (也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次

    特性

    1. 名字必须与类名相同

    2. 没有返回值类型,设置为void也不行

    3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次 ( 相当于人的出生,每个人只能出生一次 )
    4. 构造方法可以重载 ( 用户根据自己的需求提供不同参数的构造方法 )
    5. 一般情况下使用public修饰构造方法

    这里就写了一个带参数的构造方法,和一个不带参数的构造方法。

    如何调用构造方法?

    在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次

     

    用Student类创建了一个student对象,此时自动调用不带参数的构造对象。

    当构造方法调用完成之后,对象才实际上产生了。

    如何调用一个带参数的构造方法?

    在创建对象时,由编译器自动调用

    编译器自动生成的构造方法:

    此外,当我们没有提供任何的构造方法的时候,编译器会帮我们提供一个不带参数的构造方法。

    也就是说:即使我们类里面没有写构造方法,编译器会自动提供一个不带参数的构造方法。在创建对象时,也会自动调用这个由编译器自动生成的不带参数的构造方法。

    但是如果定义了一个构造方法(无论有参或者无参),此时编译器不会自动提供不带的构造方法,如果定义了一个有参数的构造方法,创建对象时,要写上参数,否则会报错。

    构造方法中,可以通过 this 调用本类当中其他构造方法,且必须放在第一行。

     不能形成循环。

    形成了环,永远调不完,这是错误的! 

    代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中;
    也就是说成员变量初始化的内容会被添加到构造函数中。
  • 相关阅读:
    阿里妈妈获得商品详情 API 返回值说明
    ISO20000信息技术服务管理体系认证条件
    思考-贪心算法
    3种方式自动化控制APP
    【研究生学术英语读写教程翻译 中国科学院大学Unit3】
    一文搞懂 连接池,线程池,内存池,异步请求池 ,学会实现异步效果
    Go编译原理系列9(函数内联)
    事务的四大特性----ACID
    复盘:卷积神经网络、池化、乘法运算操作、RNN/transformer/CNN复杂度
    Leetcode—104.二叉树的最大深度【简单】
  • 原文地址:https://blog.csdn.net/qq_62712350/article/details/126160141