【JavaSE】类和对象 【this引用和构造方法】(二)

news2025/1/17 5:55:37

目录

1、this引用

1.1、this的三种用法

1.1.1、this.属性名

1.1.2、this.方法名

1.1.3、this ( ) 访问构造方法 


详细讲解

1、this引用

1.1、为什么要有this引用

问题1:形参名不小心与成员变量名形同会发生什么问题?

问题2:

1.2、什么是this引用

1.2.1、解决重名问题   

1.2.2、编译器如何能够分辨那个引用调用成员方法

2、对象的构造及初始化

2.1、如何初始化对象

2.2、构造方法

2.2.1、提出问题

2.2.3、构造方法可以重载

3、构造方法的注意事项和使用

3.1、注意事项

 3.2、构造方法的使用

4、就地初始化


1、this引用

1.1、this的三种用法

1.1.1、this.属性名

通过this关键字可以明确访问一个类的成员变量,解决成员变量与局部变量名称的冲突问题。

在构造方法中局部变量名和成员变量名相同,不加this的结果为

  加了this的结果

 上面代码中构造方法中定义了局部变量day,mouth和year。在类中也定义了成员变量year,mouth和day,在构造方法中使用day是访问局部变量,想要访问成员变量,则要写成this.day。

 总结:

当一个类的属性(成员变量)名与访问该属性的方法参数名相同时,则需要使用this关键字来访问类中的属性,以区分类的属性和方法中的参数。


1.1.2、this.方法名

通过this关键字调用成员方法

this关键字最大的作用就是让类中一个方法,访问该类里的另一个方法或实例变量。

public class Student {

    public void test1(){
        System.out.println("test1方法执行了");
    }
    
    public void test2(){
     //调用test1()方法
        this.test1();
    }
}

在test2()方法中通过this.test1()访问test1()方法注意此处的this关键字可以不写,效果是一样的。

public class Student {

    public void test1(){
        System.out.println("test1方法执行了");
    }
    
    public void test2(){
     //省略this关键字
        test1();
    }
}

1.1.3、this ( ) 访问构造方法 

构造方法是在对象实例化的时候被调用,所以不能像调用其他方法一样调用构造方法,但是在构造方法中使用this([参数1,参数2,...])来调用构造方法。

 在有参构造方法中调用了午餐构造方法,在使用this调用构造方法时有以下注意几点:

  • 只能在构造方法中使用this()调用其他的构造方法,不能再成员方法中使用
  • 在构造方法中使用this()调用构造方法的语句必须位于第一行,而且只能使用一次
  • 不能在一个类中的两个构造方法中使用this()互相调用

这里先对this的用法做一个简单的了解,接下来站看了解。 


详细讲解

1、this引用

1.1、为什么要有this引用

先来看一个代码

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

    public void setDay(int y,int m, int d){
        year =y;
        month = m;
        day = d;
    }
    public void printDate(){
        System.out.println("年:"+year+"月:"+month+"日:"+day);
    }
}
public class TestUtil {
    public static void main(String[] args) {
        Date date1 = new Date();
        date1.setDay(2022,11,14);
        date1.printDate();

        Date date2 = new Date();
        date2.setDay(2022,11,15);
        date2.printDate();
        
        Date date3 = new Date();
        date3.setDay(2022,11,13);
        date3 .printDate() ;
    }
}

我们创建了一个Date类,然后在main方法中创建了三个对象,并通过Date类中的成员方法对对象进行设置和打印,代码逻辑非常简单,没有任何问题。但这里有两个疑问

问题1:形参名不小心与成员变量名形同会发生什么问题?

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

问题2:

上述代码中三个对象都在调用setDate和printDate函数,但是这两个函数中没有任何有关对象的说明,在代码层面,对setDate和printDate函数而言、如何知道打印的是那个对象的数据呢?


1.2、什么是this引用

1.2.1、解决重名问题   

  this.属性名

通过this关键字可以明确访问一个类的成员变量,解决成员变量与局部变量名称的冲突问题。

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

当一个类的属性(成员变量)名与访问该属性的方法参数名相同时,则需要使用this关键字来访问类中的属性,以区分类的属性和方法中的参数。

1.2.2、编译器如何能够分辨那个引用调用成员方法

总结:

  1. this的类型:对应类类型引用,即那个对象调用就是那个对象的引用类型
  2. this只能在"成员方法"中使用,不能在静态(static)方法中使用
  3. 在"成员方法"中,this只能引用当前对象不能再引用其他对象
  4. this是"成员方法"第一个隐藏的参数,编译器会自动传递,再成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收
  5. 我们以后要习惯使用this,不仅增加了代码的可读性,也可以解决重名问题。

2、对象的构造及初始化

2.1、如何初始化对象

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

来看这个代码

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

    public void setDay(int y,int m, int d){
        year =y;
        month = m;
        day = d;
    }
    public void printDate(){
        System.out.println("年:"+year+"月:"+month+"日:"+day);
    }
}
public class TestUtil {
    public static void main(String[] args) {
        Date date1 = new Date();
        date1.setDay(2022,11,14);
        date1.printDate();

        Date date2 = new Date();
        date2.setDay(2022,11,15);
        date2.printDate();
        
        Date date3 = new Date();
        date3.setDay(2022,11,13);
        date3 .printDate() ;
    }
}

对象创建好之后需要调用写好的SetDate方法才能将具体的日期设置到对象中。这样每次创建一个对象就得调用一次前面写的SetDate方法,这样写比较麻烦,我们可不可以在创建这个对象时就把赋值完成呢?

就这个问题展开下面来了解一下构造方法


2.2、构造方法

构造方法(也称为构造器)是一种特殊的成员方法。

1. 名字必须与类名相同
2. 没有返回值类型,设置为void也不行
3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)

2.2.1、提出问题

在概念中说到,创建方法时,调用构造方法,但是在前面的代码中,并没用写构造方法,为什么代码在运行时没有报错?

问题一:如何写一个构造方法

问题二:默认构造方法是什么

问题三:如何实现带有参数的构造方法


 1、问题1和问题2

 这是我们自己写的无参构造方法,但是在写代码时没有写任何的构造方法,此时Java会帮我们提供一个默认的、不带参数的构造方法!

如果自己写了就会调用自己写的。

2、问题3

上边问题中提出,在new一个对象时,就把赋值完成,现在来看这个问题的解决方法。

 下面的代码解决了上述的问题,可以在new一个对象时进行赋值


2.2.3、构造方法可以重载

关于重载,方法中说到过

方法名相同、参数不同、与返回类型无关


3、构造方法的注意事项和使用

3.1、注意事项

讲到this时,说过this代表当前对象的引用,当我们调用完构造方法对象就生成了!!

 这里我们可以理解一下,一个对象生成可以分为几步?

 3.2、构造方法的使用

1、当我们写了构造方法之后,编译器就提供了,如果我没写有参的构造方法,但是却new了一个有参的对象,那么编译器会报错,无参也同理

 

 2、构造方法中,可以通过this调用其他构造方法来简化代码

3、this(....)必须时构造方法中的第一条语句

 4、不可以形成环,举例

4、就地初始化

在声明成员变量时,就直接给出了初始值

public class Date {
    public int year = 1900;
    public int month = 1;
    public int day = 1;
    public Date(){
    }
    public Date(int year, int month, int day) {

    }
  public static void main(String[] args) {
      Date d1 = new Date(2021,6,9);
      d2 = new Date();
  }
}

注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各种构造方法中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《前端》css总结(上)

前言: css的定义有很多很多,大家不会的就去这个网站现查一下就好:https://developer.mozilla.org/zh-CN/docs/Web/CSS/text-decoration 文章目录样式定义方式行内样式表(inline style sheet)内部样式表(in…

计算机毕业设计Python+Django的学生作业管理系统

项目介绍 在各学校的教学过程中,学生的作业管理是一项非常重要的事情。随着计算机多媒体技术的发展和网络的普及,“基于网络的学习模式”正悄无声息的改变着传统的教室学习模式,“基于网络的教学平台”的研究和设计也成为教育技术领域的热点…

接口高可用

架构决定系统质量上限,代码决定系统质量下限 接口高可用整体框架 雪崩效应:请求量超过系统处理能力后导致系统性能螺旋快速下降 链式效应:某个故障引起后续一连串的故障 限流 用户请求全流程各个环节都可以限流: 请求端限流&a…

区块链溯源相比传统追溯有什么优点?

区块链溯源:通过使用区块链和物联网技术的结合,记录产品的物流信息,并基于区块链不可篡改的特性把商品的物流信息、质量信息、质检信息等相关商品信息全部记录在上。从而实现了产品全过程的质检、物流、管理等,解决了信息缺乏透明…

01_网络概述

知识点1【分组交换】 知识点2【交换方式】存储-转发 知识点3【网络分层结构】(重要) 知识点4【协议的介绍】 1、IP协议 网际协议(网络层) 2、TCP协议 传输控制协议 (传输层)(重要&#xff…

工程建设行业智能供应链系统:优化产业链运作效率,实现全链路数字化建设

工程建设行业是对建筑工程、线路管道和设备安装工程、建筑装饰装修工程等工程项目进行新建、扩建和改建的行业,对促进国民经济发展和改善人民生活提供了重要的物质技术基础。近年来,我国城镇化的迅速推进为工程建设行业带来了广阔的市场发展空间&#xf…

低压MOS管AONS36344、AONS36348 MOSFET N-CH DFN

特点 沟槽功率MOSFET技术30V 低RDS(ON) 门票费低 高电流能力 符合RoHS和无卤标准 应用 DC/DC转换器在计算、服务器和POL中的应用 电信和工业中的隔离DC/DC转换器 产品参数 1、型号:AONS36344 低压MOS管 类型:单 - N型MOS管 VDS (V)漏极电压:…

阿里P8架构师强推java程序员人手一套116页JVM吊打面试官专属秘籍

说在前面的话 只要是java程序员,肯定对于JVM来说并不陌生,甚至是从熟悉到陌生,为什么这样说呢? 因为你看似熟悉的东西,其实对于源码层级了解得少之又少,到头来只有一种陌生的感觉,使用了吗&…

基于matlab的强化学习QLearning路径规划性能仿真

目录 1.算法概述 2.仿真效果预览 3.核心MATLAB代码预览 4.完整MATLAB程序 1.算法概述 假设我们的行为准则已经学习好了, 现在我们处于状态s1, 我在写作业, 我有两个行为 a1, a2, 分别是看电视和写作业, 根据我的经验, 在这种 s1 状态下, a2 写作业 带来的潜在奖励要比 a1 看…

LeetCode | 一探环形链表的奥秘【快慢双指针妙解BAT等大厂经典算法题】

前言 本文总结了力扣141.环形链表|以及142.环形链表||这两道有关环形链表的求解方案,去求证链表是否带环已经如何找出入环口的结点。 有关环形链表,在BAT等大厂面试中均有出现,一般是属于中等难度的题,需掌握 环形链表| &&…

教你vue-router命令视图应该怎么玩

引言 在VUE实战项目开发中,为了减少代码冗余,便于后期维护,我们经常会把相同布局的代码封装为公共组件,例如移动开发中NavBar导航栏、Tabbar标签栏等公共组件,需要使用时导入、注册、调用即可,但是相对NavB…

JSRPC的三种实现方式

RPC 为远程过程调用,本文通过在浏览器端(服务端)开启一个WebSocket服务,接收命令,执行浏览器网页的加密代码,得到密文。 CMD端(客户端)也开启一个WebSocket服务与浏览器端交互&#…

【Spring Boot】Day03

文章目录一、Value和ConfigurationProperties的区别二、PropertySource一、Value和ConfigurationProperties的区别 区别: 数据校验:判断数据是否合法 Value: 不支持数据校验ConfigurationProperties:支持数据校验 开启数据校验功能&#xf…

软考证书可积分落户、评职称、抵扣个税等,快来考一个吧!

很多人想要在工作的城市落户、买房、生活、小孩上学,但由于对于城市落户政策不了解,担心自己条件不够!今天给大家介绍一本软考证书帮你解决落户等问题。 软考,是由国家人力资源和社会保障部、工业和信息化部领导下的国家级考试;既…

[附源码]java毕业设计价格公示系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

C. Bouncing Ball(从后往前的前缀和)

Problem - 1415C - Codeforces 你正在为某个手机游戏创建一个游戏关卡。这个关卡应该包含一些从左到右排列的单元格,并以从1开始的连续整数编号,在每个单元格中,你可以放一个平台,也可以让它空着。 为了通过一个关卡,…

牛客网-《刷C语言百题》第四期

✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!! 📃个人主页:rivencode的个人主页 🔥系列专栏:《C语言入门必刷百题》 &#x…

QStyleFactor和QPalette

Qt中的分格都继承自QStyle,QStyle类是一个抽象基类,封装了一个GUI的外观。 QStyle常见的子类有: QStyleFactory类QPalette类QStyleFactor类 函数为: create()创建并返回与给定键匹配的QStyle对象keys()返回有效键的列表 获取有…

面试灵活拷问:对于数据库的索引,你是怎么理解的?

文章目录一、索引的概念及作用概念作用二、索引的应用场景三、索引的相关语法1.查询索引2.创建索引3.删除索引注意四、索引背后的数据结构什么是B树B树有什么特点采用B树结构能为索引带来什么好处五、索引的分类1.唯一索引(unique键对应的字段)2.主键索引…

Selenium基础 — 拓展:使用浏览器加载项配置实现用户免登陆

1、什么是加载项配置 在很多情况下,我们在登录网站的时候,浏览器都会弹出一个是否保存登录账号的信息。如果我们选择保存,那么我们在下次登录时就不用再次输入账号,直接免登录了。 在我们实际的测试过程中,测试注册登…