Java类与对象详解(2)

这篇具有很好参考价值的文章主要介绍了Java类与对象详解(2)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java类与对象详解(2),java,开发语言

 

this引用

为什么要有this引用

先来看一个日期类的例子:

​
public class Date {
    public int year;
    public int month;
    public int day;

    //设置日期方法
    public void setDay(int y, int m, int d){//这里隐藏了一个Date this参数
        year = y;
        month = m;
        day = d;
    }

    public void printDate(){
        System.out.println(year + "/" + month + "/" + day);
    }

    public static void main(String[] args) {
        //构造三个日期类的对象d1,d2,d3
        Date d1 = new Date();
        Date d2 = new Date();
        Date d3 = new Date();

        //对d1,d2,d3三个日期进行设置
        d1.setDay(1931,9,18);
        d2.setDay(1937,7,7);
        d3.setDay(1932,1,28);

        //打印日期中的内容
        d1.printDate();
        d2.printDate();
        d3.printDate();
    }
}

​

以上代码定义了一个简单的日期类,然后在main方法中创建了三个对象,并通过Date类中的成员方法对对象进行设置和打印,代码整体逻辑非常简单,没有任何问题。

但是有以下几个疑问:

1.为了提高代码的可读性,我们将setDate中的参数改为year,month,day。但这里就出现了形参名不小心与成员变量相同的问题。

public void setDay(int year, int month, int day){
        year = year;
        month = month;
        day = day;
    }

这时究竟是谁给谁传参,我们很难搞清楚。

2.三个对象都在调用setDate和printDate方法,但是这两个方法中没有任何关于对象的说明,它们是怎么知道设置,打印的是哪个对象的呢???

Java类与对象详解(2),java,开发语言

什么是this引用

this引用指向当前对象(成员方法运行时调用该成员方法的对象),该成员方法中所有成员变量的操作,都是通过该引用去访问。 只不过对用户隐藏了这一过程(如上文代码public void setDay(int y, int m, int d){//这里隐藏了一个Date this参数),即用户不需要传递,由编译器自动完成。

简而言之,就是谁调用了这个方法,this就是哪个对象的引用。(下图可见,对象的哈希码相同,表明使用的同一对象)。

 this引用的特性

1.this的类型:对应类类型的引用,即哪个对象调用就是哪个对象的引用类型

2.this只能在成员方法中使用

3.在成员方法中,this只能引用当前对象,不能再引用其它对象

4.this是成员方法第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用的成员方法对象的引用传递给成员方法,this负责接收

第四个特性的演示

Java类与对象详解(2),java,开发语言

对象的构造及其初始化 

 如何初始化对象

通过前面的知识点的学习知道,在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。

public static void main(String[] args) {
    int a;
    System.out.println(a);
}

//Error:java:可能为初始化变量a

要让上述代码通过编译很简单,只需要在正式使用a前,给a设定一个初始值即可。如果是对象:

public static void main(String[] args) {
    Date d = new Date();
    d.printDate();
    d.setDate(1931, 9, 18);
    d.printDate();
}

//代码正常通过编译

需要调用之前的SetDate方法才可以将具体的日期设置到对象中。通过上述例子发现了两个问题:

1.每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象应该如何初始化?

2.局部变量必须初始化才能使用,为什么在这没有给值却能正常编译?

构造方法

概念

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

下面还是以Date来展示一下构造方法:

public class Date {
    public int year;
    public int month;
    public int day;

    //构造方法与类名相同,没有返回类型,设置为void也不行
    //一般情况下使用public修饰
    //在创建对象时由编译器自动调用,并且在对象的生命周期中只调用一次
    //带有参数的构造方法
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("Date(int, int, int)方法被调用了");
    }

    public void printDate() {
        System.out.println(year + "-" + month + "-" + day);
    }

    public static void main(String[] args) {
        //这里创建了一个Date类型的对象,并没有显式调用构造方法
        Date d = new Date(2021,6,9);//输出Date(int, int, int),表明方法被调用了
        d.printDate();
    }

}

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

特性

1.名字必须与类名相同

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

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

4.构造方法允许重载,(根据自己的需求提供不同的构造方法)

构造方法重载:

public class Date {
    public int year;
    public int month;
    public int day;

    //无参的构造方法
    public class Date () {
    }
    //带有三个参数的构造方法
    public class Date (int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
}

上述两个构造方法:名字相同,参数列表不同,构成了方法重载。

5.如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的(注意:若用户定义了,则编译器就不会再生成了)

public class Date {
    public int year;
    public int month;
    public int day;

    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("Date(int, int, int)方法被调用了");
    }

    public void printDate() {
        System.out.println(year + "-" + month + "-" + day);
    }

    public static void main(String[] args) {
        //如果编译器会生成,则生成的构造方法是无参的,则会通过编译
        //但此处未通过编译
        Date d = new Date();
        d.printDate();
    }
}
//这里没有通过编译,原因是编译器未生成构造方法,而是默认用用户的构造方法
//用户构造的和创建对象时的参数类型不匹配,所以没有通过编译

6.构造方法中,可以通过this引用调用其它构造方法来简化代码

​
public class Date {
    public int year;
    public int month;
    public int day;



    //无参的构造方法-内部给各个成员赋初值,该部分功能与三个参数的构造方法相重复
    //但是此处可以通过this调用带有三个参数的构造方法
    //this(1900,1,1);必须是构造方法的第一条语句

    public class Date () {
        //调用当前类的其它构造方法,不让自己构造自己
        this(1900,1,1);
        //this.year = 1900;
        //this.month = 1;
        //this.day = 1;
    }

    //带有三个参数的构造方法
    public class Date (int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
}

​

注意:this(...)必须是构造方法中的第一条语句

        不能形成环:

Java类与对象详解(2),java,开发语言

 //编译报错:递归构造器的使用

7.绝大多数情况下使用public来修饰,特殊场景下会被private修饰。

默认初始化

同上文的第二个问题:为什么局部变量在使用时必须初始化,而成员变量却不用呢

要搞清这个过程,就需要知道new 关键字背后发生的事情:

Date d = new Date(2021, 6, 9);

在程序表面可能是一条简单语句,在虚拟机层面可能要做很多事情,下面简单介绍如下:

1.检查对象对应的类是否加载了,如果没有加载的则加载

2.为对象分配空间

3.处理并发安全问题

比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突

4.初始化所分配的空间

即:对象空间被申请好之后,对象中所包含的成员已经设置好了初始值,如下:

Java类与对象详解(2),java,开发语言

5.设置对象头信息

6.调用构造方法,给对象中各个成员赋值

这一期就讲到这里了哈,谢谢各位支持!!!文章来源地址https://www.toymoban.com/news/detail-623366.html

到了这里,关于Java类与对象详解(2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java类与对象(超详细!)

    3. 类与对象 3.1 面向对象编程三特性: 封装 继承 多态 3.2 类的编写 java是面向对象语言,类是基本要素,一个java程序就是由若干类组成。 何为对象?对象就是用类声明的变量。 如何编写类是编写java程序的基础,接下来让我们看看如何编写一个java类叭。 编写格式: 类名规则

    2023年04月09日
    浏览(36)
  • Java中的类与对象

    类: 是共同特征的描述(设计图) 对象: 是真实存在的具体实例 Javabean类: 用来描述一类事物的类,在Javabean类里是不写main方法的 注意: 类名首字母要大写,见名知意,(驼峰模式) 注意: 在实际开发中,建议一个文件定义一个class类 代码: 是面向对象三大特征 (封装 继承 多态) 对象代表

    2024年03月23日
    浏览(47)
  • 关于java类与对象的创建

    我们在前面的文章中回顾了方法的定义和方法的调用,以及了解了面向对象的初步认识,我们本篇文章来了解一下类和对象的关系,还是遵循结合现实的方式去理解,不是死记硬背😀。 类是一种抽象的数据类型,它对某一类事物整体描述定义,但是不能代表某一个具体的事

    2024年01月19日
    浏览(32)
  • 我在VScode学Java类与对象(Java显式参数和隐式参数、静态方法+main方法、Java访问修饰符、static关键字、Java的包、对象数组)第三辑

    我的个人博客主页:如果’\\\'真能转义1️⃣说1️⃣的博客主页 关于Java基本语法学习----可以参考我的这篇博客:《我在VScode学Java》 方法会操作对象并访问他们的实例字段。 在Java中,显式参数和隐式参数是方法调用中的两种不同类型的参数。 注释: 第7行: sum 方法的参数

    2024年02月16日
    浏览(96)
  • c++类与对象详解

    在C++中,对象是类的实例。定义对象的语法为: 其中,class_name 是定义类时指定的类名,object_name 是对象的名称。 例如,在以下示例中,我们定义了一个名为 Rectangle 的类和两个对象 rect1 和 rect2: 这里我们创建了两个 Rectangle 类的对象:rect1 和 rect2。 在C++中,类可以通过以

    2024年02月13日
    浏览(35)
  • Python类与对象详解

    一、类和对象 类的意思:种类、分类、类别 对象是特征与技能的结合体,我可能有身高体重、而你也有身高体重,所以你会说你像我,但是你一定不会说你像阿猫阿狗。并且我和你其实就可以说成是一类,而你和选课系统不能说是一类,因此给出类的定义:类就是一系列对

    2024年02月05日
    浏览(34)
  • 编程开发8大语言详解,为什么Java是我最推荐的?

    很多没有接触过编程语言的同学,都会觉得编程开发特别高端和神奇,担心理解不了更担心学不会。 当然,也有人会认为,你既然是做编程的,那么你应该什么都会,什么软件的开发都能完成,这是平哥经常听到的两种声音。 在此,平哥需要给大家科普一下, 编程确实改变

    2024年02月05日
    浏览(69)
  • 深入篇【C++】类与对象:运算符重载详解 -上

    内置类型(int /double…… )是可以之间进行运算符之间的比较的,因为编译器知道它们之间的比较规则,可以之间转化为指令。 那如果自定义类型能否之间进行运算符之间的比较呢?当然不能了,因为编译器是不知道这个自定义类型的规则是什么,不知道如何进行比较。 1.内置

    2024年02月03日
    浏览(50)
  • C++初阶类与对象(二):详解构造函数和析构函数

    上次为类与对象开了一个头:C++初阶类与对象(一):学习类与对象、访问限定符、封装、this指针 今天就来更进一步 如果一个类中什么成员都没有,简称为空类。 空类中并不是什么都没有,任何类在什么都不写时,编译器会 自动生成上面6个默认成员函数 。 默认成员函数

    2024年01月19日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包