• Java初识:类和对象(上)


    ✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

    编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。


    学习目标

    本篇我们来了解Java中的类和对象,这里与C语言会有区别,我们不再注重过程,而倾向于对象。本篇将认识面向对象,类的定义,对象的实例化,成员方法和变量的使用,对象初始化过程等。文章可能有错误,如有发现,请在评论区指正,让我们一起交流,共同进步!


    本文开始

    1.面向对象的初步认识

    1.1认识面向对象

    Java介绍:
    Java是一门纯面向对象的语言(ObjectOrientedProgram,简称OOP),在面向对象的世界里,一切皆为对象。
    面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。

    1.2 区分面向对象和面向过程

    面向过程:关注的是过程
    对于实现一个程序,我们需要思考,怎么实现,需要准备变量,实现选择或者循环等操作。
    例如冒泡排序,我们需要考虑一共需要交换几趟排序,每趟我们需要实现几次交换,在这之前还需要考虑设几个变量等等细节操作,与思考过程。
    示例:洗衣过程,考虑过程,细节操作。

    在这里插入图片描述

    面向对象: 实体(对象)之间协作完成的
    我们只需要对象之间的交互完成即可。不需要关系如何具体实现操作的过程,我们只需要调用对象方法即可;
    例如:我们需要实现排序,我们只需要知道Arrays这个类里面有sort(排序)方法即可;排序方法直接使用,而不是像C语言一样一步步考虑细节,与过程;
    示例:直接把衣服洗衣粉放入洗衣机即可,不用考虑过程。

    在这里插入图片描述

    2.类当定义与使用

    2.1认识简单类

    类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥)。

    例如:电脑
    属性:产品品牌,型号,产品重量,外观尺寸,颜色等
    功能:上网,视频等

    2.2 类的定义格式

    在Java中定义类是需要用到class关键字,语法格式:

    class: 为定义类的关键字,Test为类的名字,{ }中为了的主体
    属性:描述类的成员
    方法:类具有哪些功能

    class Test {
       filed;// 字段、属性、成员变量
       method; // 行为 、成员方法
    }
    
    • 1
    • 2
    • 3
    • 4

    【注】类名采用大驼峰
    面向对象第一步,学会定义类。

    2.3 小试身手-定义类的小练习

    定义一个学生类:

    public class Student {
        public String name;//学生的属性(成员变量)
        public String gender;
        public short age;
    
        public void DoHomeWork() {//学生的行为(成员方法)
            System.out.println("写作业!");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    【注】
    1.一般我们在一个文件中只定义一个类
    2.mian方法所在的类一般使用public修饰(public class)
    3.public 修饰的类必须与文件名相同
    4.不用轻易修改public 修饰的类

    3.类的实例化

    3.1 什么是实例化

    我们想要实例化对象,就需要获取对象,而获取对象就需要得到类,通过类来定义实例化。而用类类型创建对象的过程,称为类的实例化。
    在java中采用new关键字,配合类名来实例化对象。
    new Person =>new 的对象

    在这里插入图片描述

    【注】
    1.new关键字用于创建一个对象的实例(每个对象都有自己的成员,通过引用访问成员)
    2.使用点(.)来访问对象中的属性和方法
    3.同一个类可以创建多个实例
    4.类不占内存,代码片段先存放在方法区中(以后的文章会介绍)

    3.2 实例化注意事项:

    1.实例化对象赋值为null=>不指向任何对象

    public static void main(String[] args) {
            Person person = null;
            //代表person 不指向任何对象
            person.name = "zhang";//err
            person.age = 12;//err
            //person不指向任何对象无法引用
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    报错:

    在这里插入图片描述

    2.引用能不能指向引用?=》不能
    引用只能 指向引用的对象,而不是指向引用

    //引用指向引用的例子;
        public static void main3(String[] args) {
            Person person1 = new Person();
            Person person2 = new Person();
            //引用不能指向引用=》说法错误
            //引用person1可以指向引用person2所指向的对象 =>正确(引用一定指向对象,而不是指向引用)
            person1 = person2;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.一个引用能同时指向多个对象?=》不能
    一个引用能指向多个对象?=》err;可以换对象但不能有多个对象

        public static void main4(String[] args) {
            Person person1 = new Person();//引用的地址
    //        Person person1 = new Person();
    //        Person person1 = new Person();
    //        Person person1 = new Person();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    【注】
    1.属性(成员变量)没有赋值不会报错,编译器会给他们默认值
    引用类型:默认null;浮点型:0;Boolean:默认false
    字符型:‘\u0000’
    2.局部变量必须赋值,不负责编译器报错

    3.3 类和对象说明

    1. 类只是一个模板,用来对一个实体进行描述,限定了类有哪些成员。
    2. 类是一种自定义的类型,可以用来定义变量 =》自己定义
    3. 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。
    4. 类实例化出对象:现实中使用建筑设计图建造出房子。
      类就像是设计图,但是并没有实体存在,类也只是一个设计。
      实例化出的对象才能实际存储数据,占用物理空间如:盖好的房子。

    4. this 引用

    4.1为什么要用this

    我们实例化对象,可能需要创建多个对象,例如创建三个对象,代码里面是如何区分而找到正确的对象呢? =》根据this,我们来看一下!

    public class DateUtil {
        public int year;
        public int month;
        public int day;
    
        public void setDate(int y, int m, int d) {//利用方法,多个赋值,
            // 如果new对象,给对象里面一个个赋值太麻烦
            year = y;
            month = m;
            day = d;
        }
        public void show() {
            System.out.println("年:" + year + " 月:" + month + " 日" + day);
        }
        
            //方法前面是那个引用,就调用那个对象的方法
            public static void main(String[] args) {
                DateUtil dateUtil = new DateUtil();
                dateUtil.setDate(2022,11,9);
                dateUtil.show();
    
                DateUtil dateUtil2 = new DateUtil();
                dateUtil2.setDate(2022,11,9);
                dateUtil2.show();
    
                DateUtil dateUtil3 = new DateUtil();
                dateUtil3.setDate(2022,11,9);
                dateUtil3.show();
            }
    }
    
    • 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

    上述代码看似正确,但存在问题!

    问题1:出现形参名与成员变量名相同的情况
    函数体中是谁给谁赋值?参数谁给谁?

    //错误代码:
    public void setDate1( int year, int month, int day) {//利用方法,多个赋值
     //这里的year,month,day都是形参, 等号左边是局部变量 优先使用
    //实例变量int默认0,相当于形参被默认的值赋值为0;(形参被默认值覆盖)
            year = year;
            month = month;
            day = day;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    为了防止这种情况出现,我们使用this关键字
    代码改正:加上this:给当前对象的属性赋值

     //this:访问成员变量
        public void setDate1( int year, int month, int day) {//利用方法,多个赋值
            //这里的year,month,day都是形参,加上this:来表示给当前的对象的属性赋值
            this.year = year;
            this.month = month;
            this.day = day;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    问题2:为什么this能精准找到对应的对象呢?

    每个成员方法的第一参数默认是this => 隐藏的参数,可不写;this可根据谁引用方法,就会找到对应的引用对象

     public void setDate(DateUtil this, int y, int m, int d) {//利用方法,多个赋值,
            // 如果new对象,给对象里面一个个赋值太麻烦
            year = y;
            month = m;
            day = d;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.2 this引用的特性

    this作用:this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。

    一般this的三种用法:
    ①this.成员变量
    ②this.成员方法
    ③this(…)访问构造方法:且必须是构造方法的第一句

    this引用的特性:
    1.this的类型:当前对象的引用。谁(对象)调用就是谁对象的引用类型
    2.在"成员方法"中,this只能引用当前对象,不能再引用其他对象(this只能在成员方法中使用)
    3. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收(例如:public void setDate(DateUtil this, int y, int m, int d))

    5. 对象的构造及初始化

    5. 1 如何初始化对象

    通过引用给变量赋值的方式对变量个数多的情况下就不适用了,此时我们可以使用构造方法,为多个变量赋值。

    构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

    实例化对象时,会调用 构造方法(下面介绍),此时我们可以直接在new 的对象中直接赋值。
    例如:

    DateUtil dateUtil = new DateUtil(2022,11,10);
    
    • 1

    5.2 构造方法

    构造方法:特殊的成员方法:①没有返回值(不能设置void)②方法名和类名一样

    5.2.1构造方法特性

    构造方法:无参构造与有参构造

      //构造方法可以重载
      //无参数的构造方法
        public DateUtil(){
            //如果没有构造方法,java默认空构造方法
            //可以写this.year =year;
        }
        //有3个参的构造方法,参数是任意的个数
        public DateUtil( int y, int m, int d) {
            this.year = year;
            this.month = month;
            this.day = day;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
    2. 构造方法可以重载(根据自己的需求提供不同参数的构造方法);重载:名字相同,参数列表不同
    3. 用户没有定义有参的构造方法,编译器会默认生成无参构造方法;如果设置有参构造,编译器就不会有无参构造,想要再次使用必须自己构造无参方法。

    5.2.2this 调用构造方法

    this(…)必须是构造方法中第一条语句
    this 不能调用静态的成员方法和属性

     public DateUtil(){
            this(2000,11,10);//调用当前对象的构造方法
            //可以写this.year =year;
        }
         public void setDate( int year, int month, int day) {
            this.year = year ;
            this.month = month;
            this.day = day;//访问当前对象的成员变量
            this.show();//访问成员方法
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    this()调用构造方法:循环调用的错误示范

    在这里插入图片描述

    5.3 默认初始化

    1.初始化分配空间:对象空间被申请好之后,对象中包含的成员已经设置好了初始值。
    2.调用构造方法,给对象各个成员赋值。
    3.声明变量是,直接给出初始值


    总结

    ✨✨✨各位读友,本篇分享到内容是否让你认识了JAVA的类和对象,如果对你有帮助给个👍赞鼓励一下吧!!
    感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

  • 相关阅读:
    软件测试(二)用例
    什么是WebAssembly?
    postman 密码rsa加密登录-2加密密码
    重难点详解-根据函数依赖求第几范式
    NLP工具——自制英文时间标准化工具
    利用PerconaTookit工具在线修改表结构
    Map介绍
    腾讯云轻量应用服务器怎么样?来自学生的评价
    《MySQL 数据库(二)》
    Abbexa丨Abbexa mPEG-生物素的化学性质和相关研究
  • 原文地址:https://blog.csdn.net/m0_69119792/article/details/127765953