【JavaSE】类和对象 【this引用和构造方法】(二)
创始人
2024-01-25 10:14:06
0

目录

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();}
}

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

相关内容

热门资讯

创业经历 创业经历 创业经历的... 图片发自简书App今天才注册了简书,之前一直在我的公号写原创文章,接下来几天我将和大家分享下我自己的...
小本创业致富项目做什么好 小本... 随着经济的发展,越来越多人选择了创业,但创业者一定要看好市场和前景,选择好项目,这样才能让自己的创业...
一个人创业干什么好 做什么生意... 很多项目,一个人单干足以,在没有月入十万之前,根本不需要招人。我们平时一说到创业,首先想到的是去注册...
服装创业计划书范文 服装创业计... 《服装项目商业计划书》是一份全方位的项目计划,是争取风险投资的敲门砖。其主要意图是递交给投资商,以便...
新手怎么买创业板股票 谢谢。 ... 创业板股票属于高风险板块,因而出现部分用户无法直接购买创业板股票。那么新手怎么买创业板股票?下面介绍...
散户如何购买创业板股票 怎么买... 创业板的创立会给更多的企业带来挑战和威胁,必将加快新兴企业的竞争地位分化和优胜劣汰。创业板的创立和私...
【小本办厂】小本办厂 小本投资... 小投资办厂项目家庭办厂加工小型投资办厂农村办厂好项目办厂好项目投资办厂项目小型办厂农村办厂创业项目办...
2017个人小本创业10个好项... “照片书”最早开始流行于欧美,于今年9月份,“照片书”悄然进军中国市场,并迅速抢占微信头牌,在中国“...
深圳白领辞职创业 月包吃住包玩... 作为男人,不能给心爱的女人安全感本身就是无能的表现,况且也到了谈婚论嫁的年纪了,总不能跟农村父母要钱...
青年创业如何跨越科创“死亡之谷...   找投资四处碰壁 初创面临高失败率  青年创业如何跨越科创“死亡之谷”  在科技成果从实验室走向市...