一、 this什么时候是不能省略的,我们举个例子来说明

class User2{

  private int id;

  public int getId() {

    return id;

  }

  public void setId(int id) {

    this.id = id;//这里如果写成了id=id,那么根据就近原则,第一个id就是形式参数,第二个id也是形式

    //参数,所以这里必须要加上this才行,类似于python中的self

  }

}

this用来区分局部变量和实例变量的时候,是不能省略的。

二、我们对于构造方法的再次练习,注意我们的注释,这是这个联系的重要总结。


package com.bjpowernode.java_learning;

public class D42_ {

  public static void main(String[] args) {

    User2 u1 = new User2(2155,"张三");

    //这里说明了两个问题

    //首相可以传入参数,说明这是调用了User2类中的构造方法,可以看一下函数原型是需要两个参数的

    //如果不写这连个参数,那么我们需要在类User2中增加不带参数的构造方法(也就是重载函数)

    //虽然id和name是private类型的,但是我们传入参数可以看出来,照样可以修改,但是我们后面再修改的时候

    //就必须得调用那两个实例函数了

    System.out.println(u1.getName());

  }

}

class User2{

  private int id;

  private String name;

​

  public int getId() {

    return id;

  }

  public void setId(int id) {

    this.id = id;//这里如果写成了id=id,那么根据就近原则,第一个id就是形式参数,第二个id也是形式

    //参数,所以这里必须要加上this才行,类似于python中的self

  }

  public String getName() {

    return name;

  }

  public void setName(String name) {

    this.name = name;

  }

  public User2(int id,String name) {

    this.id = id;

    this.name = name;

  }

}



三、我们需要创建一个Date类用来存储我们的日期,同时这里面有一个需求:如果创建对象的时候不提供年月日的话,我们需要给这个对象一个默认值1970-01-01

package com.bjpowernode.java_learning;

public class D42_ConstructerWithDefaultValue {

  public static void main(String[] args) {

    Date2 d1 = new Date2(2019,10,19);

    Date2 d2 = new Date2();

    d1.outputDate();

    d2.outputDate();

  }

}

class Date2{

  int year;

  int month;

  int day;

  /**

   * @param year

   * @param month

   * @param day

   */

  public Date2(int year, int month, int day) {

    this.year = year;

    this.month = month;

    this.day = day;

  }

  /**

   * 需求:如果创建对象的时候不提供年月日的话,我们需要给这个对象一个默认值1970-01-01

   */

  public Date2(){

    this(1970,1,1);

  }

  public void outputDate() {

    System.out.println("您想要的日期是:" + year + "年" + month + "月" + day + "日");

  }

}

我们看一下这里面的两个构造函数,一个是可以传入参数的,一个是不传入参数,我们不传入参数的有个固定的格式:this(默认参数),并且这个语句必须出现在这个构造方法的第一行,有什么其他的语句,在后面写

对此可以我们解释为啥可以多这个语法,我们可以这样写

public Date2(){

        year = 1970;

        month = 1;

        day = 1;

}

​这样写运行是没有问题的,可以这样写,但是这样写代码是冗余的,因此不合适

我们还可以这样写

public Date2(){

    new Date2(1970,1,1);

}

这样等于我们又创建了一个对象,这样也是不好的,因此也不用这个方法

四、我们总结一下​:

this​可以使用在哪里:

(1)可以使用在实例方法之中,代表当前对象【​语法格式:this.】

(2)可以使用在构造方法之中,通过当前的构造方法调用其他的构造方法【​语法格式:this(实参);】

(3)this()这种语法只能出现在构造方法的第一行

三、源码:

D42_theSitustionOfNotOmitTihsKeyword.java

D42_ConstructerWithDefaultValue

地址:

https://github.com/ruigege66/Java/blob/masterD42_theSitustionOfNotOmitTihsKeyword.java

https://github.com/ruigege66/Java/blob/master/D42_ConstructerWithDefaultValue

2.CSDN:https://blog.csdn.net/weixin_44630050(心悦君兮君不知-睿)

3.博客园:https://www.cnblogs.com/ruigege0000/

4.欢迎关注微信公众号:傅里叶变换,个人公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料

Java连载42-this不能省略的情况、构造方法设置默认值的方法的更多相关文章

  1. java 反射: 当Timestamp类型的属性值为null时,设置默认值

    import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Metho ...

  2. Java连载38-对象封装性格式、构造方法

    一.封装的步骤 (1)所有属性私有化,使用private关键字进行修饰,private表示私有的,修饰的所有数据只能在本类中进行访问. (2)对外提供简单的操作入口,也就是说以后外部程序要想访问age ...

  3. 【java】之Method和Field反射获取和设置属性值

    package com.javaluna.reflect; import java.lang.reflect.Field; import java.lang.reflect.Method; impor ...

  4. Centos7多内核情况下修改默认启动内核方法

    1.1  进入grub.cfg配置文件存放目录/boot/grub2/并备份grub.cfg配置文件 [root@linux-node1 ~]# cd /boot/grub2/ [root@linux ...

  5. java后台实体类设置默认值

    private String orderPrice;//定义类的属性 /* * get set方法 * String.trim() 返回字符串的副本,忽略前导空白和尾部空白. */ public St ...

  6. Java JPA设置默认值、Timestamp设置、自动获取时间

    设置默认值 @Column(name="state",columnDefinition="tinyint default 0") private Integer ...

  7. Java高并发与多线程(三)-----线程的基本属性和主要方法

    今天,我们开始Java高并发与多线程的第三篇,线程的基本属性和主要方法. [属性] 编号(ID) 类型long 用于标识不同的线程,编号唯一,只存在java虚拟机的一次运行 名称(Name) 类型St ...

  8. java变量的初始化之后的默认值

    对于类的成员变量 不管程序有没有显示的初始化,Java  虚拟机都会先自动给它初始化为默认值. 1.整数类型(byte.short.int.long)的基本类型变量的默认值为0. 2.单精度浮点型(f ...

  9. (转载)JAVA中八种基本数据类型的默认值

    原文链接: http://simon-c.iteye.com/blog/1016031 引用 For type byte, the default value is zero, that is, th ...

随机推荐

  1. Android五大布局详解——FrameLayout(帧布局)

    FrameLayout 这个布局相对前面两节介绍的布局就简单了很多,因此它的应用场景也就特别的少.这种布局没有方便的定位方式,所有的控件都会默认摆放在布局的左上角.新建UILayoutTestThre ...

  2. sqlserver的表变量在没有预估偏差的情况下,与物理表可join产生的性能问题

    众所周知,在sqlserver中,表变量最大的特性之一就是没有统计信息,无法较为准备预估其数据分布情况,因此不适合参与较为复杂的SQL运算.当SQL相对简单的时候,使用表变量,在某些场景下,即便是对表 ...

  3. 用 Python 破解 WiFi 密码

    如今,WiFi 跟我们的生活息息相关,无处不在.没有 WiFi 的地方是没有灵魂的! ​ 然而,比没有WiFi更让人绝望的,是有满格WiFi信号却没有密码…… ​ 今天我们就来尝试下,如何利用pyth ...

  4. 利用Python进行数据分析-Pandas(第五部分-数据规整:聚合、合并和重塑)

    在许多应用中,数据可能分散在许多文件或数据库中,存储的形式也不利于分析.本部分关注可以聚合.合并.重塑数据的方法. 1.层次化索引 层次化索引(hierarchical indexing)是panda ...

  5. Map 集合 和 String 字符串相互转换工具类

    package com.skynet.rimp.common.utils.util; import java.util.Arrays; import java.util.HashMap; import ...

  6. 基于STM32F429的ADS1115驱动程序

    1.ADS1115中文资料:https://wenku.baidu.com/view/8bab101feef9aef8941ea76e58fafab069dc44e7.html?rec_flag=de ...

  7. Thinkphp 5.0.15 设计缺陷导致Insert/update-SQL注入 分析

    分析 与上一个漏洞类似,这个也是前端可以传入一个数组变量,如['exp','123','123'],后端根据array[0]来将array[1]和array[2]直接拼接到SQL语句中. 由于TP只是 ...

  8. SpringMVC参数绑定,这篇就够了!

    SpringMVC参数绑定,简单来说就是将客户端请求的key/value数据绑定到controller方法的形参上,然后就可以在controller中使用该参数了 下面通过5个常用的注解演示下如何进行 ...

  9. DataTable实现分组

    有时候我们从数据库中查询出来数据之后,需要按照DataTable的某列进行分组,可以使用下面的方法实现,代码如下: using System; using System.Collections.Gen ...

  10. PlayJava Day019

    今日所学: /* 2019.08.19开始学习,此为补档. */ 1.this: ①this是成员方法的一个特殊的固有的本地变量,它表达了调用这个方法的那个对象. ②在成员方法内部直接调用自己(thi ...