【Java SE】this引用注意事项
何为this引用:
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
public class Date {public int year;public int month;public int day;public void setDay(int year, int month, int day){this.year = year;this.month = month;this.day = day;}public void printDate(){System.out.println(this.year + "/" + this.month + "/" + this.day);}
}
注意:this引用的是调用成员方法的对象
特别是在成员方法中形参名和成员变量(属性)的名字一样的时候一定要用this引用,否则该成员方法(行为)将与成员变量(属性)无关。因为由于局部变量优先原则,该行为中的参数已经与属性无关,所以属性的值都是默认值,并没有得到赋值。
this引用的3种用法:
1、this.成员变量
该用法也是最为普遍的一种用法,在上面的代码中也已经展示过如何使用。大部分时候,普通方法访问其他方法、成员变量时无须使用 this 前缀,但如果方法里有个局部变量和成员变量同名,但程序又需要在该方法里访问这个被覆盖的成员变量,则必须使用 this 前缀。
public void setDay(int year, int month, int day){this.year = year;this.month = month;this.day = day;}
this.
year=
year语句表示一个赋值语句,等号左边的this.
year是指当前对象具有的变量year,等号右边的year表示参数传递过来的数值。
提示:当一个类的属性(成员变量)名与访问该属性的方法参数名相同时,则需要使用 this 关键字来访问类中的属性,以区分类的属性和方法中的参数。
2、this.成员方法
this 关键字最大的作用就是让类中一个方法,访问该类里的另一个方法或实例变量。
这是一个Dog类
public class Test {public static void main(String[] args) {Dog dog=new Dog();dog.setDog("旺财","白色");dog.wag();dog.bark();}
}
class Dog{public String name;public String color;public void bark(){System.out.println(name+"汪汪叫");}public void wag(){System.out.println(name+"摇尾巴");}public void setDog(String name,String color){this.name=name;this.color=color;}
}
那么如何在一个方法里面调用另一个方法呢?
public class Test {public static void main(String[] args) {Dog dog=new Dog();dog.setDog("旺财","白色");dog.wag();// dog.bark();}
}
class Dog{public String name;public String color;public void bark(){System.out.println(name+"汪汪叫");}public void wag(){this.bark();System.out.println(name+"摇尾巴");}public void setDog(String name,String color){this.name=name;this.color=color;}
}
当把this引用去除之后改成这样:
public void wag(){bark();//this.bark();System.out.println(name+"摇尾巴");}
也是可以实现的。
大部分时候,一个方法访问该类中定义的其他方法、成员变量时加不加 this 前缀的效果是完全一样的。省略 this 前缀只是一种假象,虽然程序员省略了调用 bark() 方法之前的 this,但实际上这个 this 依然是存在的。
注意:对于 static 修饰的方法而言,可以使用类来直接调用该方法,如果在 static 修饰的方法中使用 this 关键字,则这个关键字就无法指向合适的对象。所以,static 修饰的方法中不能使用 this 引用。并且 Java 语法规定,静态成员不能直接访问非静态成员。
3、this();访问构造方法
this( ) 用来访问本类的构造方法(构造方法是类的一种特殊方法,方法名称和类名相同,没有返回值,且有无参构造方法和有参构造方法)
下面定义一个 Student 类,使用 this( ) 调用构造方法给 name 赋值,Student 类的代码如下所示:
public class Student {String name;// 无参构造方法(没有参数的构造方法)public Student() {this("张三");}// 有参构造方法public Student(String name) {this.name = name;}// 输出name和agepublic void print() {System.out.println("姓名:" + name);}public static void main(String[] args) {Student stu = new Student();stu.print();}
}
注意:
this()不能在普通方法中使用,只能在构造方法中使用。
this()在构造方法中的时候必须是第一条语句。
this引用的特点:
1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this只能在"成员方法"中使用
3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收
如最上面的Date类:
public class Date {public int year;public int month;public int day;public void setDay(Date this,int year, int month, int day){this.year = year;this.month = month;this.day = day;}public void printDate(Date this){System.out.println(this.year + "/" + this.month + "/" + this.day);}
}
这样也是可以编译通过的。
【Java SE】this引用注意事项相关推荐
- java se 导原码_Java SE 8新功能导览:Java开发世界中的重大变化
java se 导原码 我很自豪,像其他专业团队成员一样,是采用OpenJDK的成员之一,但是从过去8个月就加入了,我们经历了Java SE 8 开发,编译,编码,讨论等各个阶段,直到将其付诸实践为止 ...
- Java SE 8新功能导览:Java开发世界中的重大变化
与其他专业团队成员一样,我是采用OpenJDK的成员之一,但是从最近8个月开始加入,我们经历了Java SE 8 开发,编译,编码,讨论等各个阶段,直到将其付诸实践为止. . 它于2014年3月18日 ...
- Java SE 8 新特性之旅 : Java开发世界的大变动
我很自豪的成为了adopt-OpenJDK的一员,像其他专业团队成员一样,但是我只刚加入了8个月,我们一同经历了Java SE 8 的开发.编译.编码.讨论--等等,直到JDK上线.Java SE 8 ...
- JAVA SE、EE、ME,JRE、JDK,基本数据类型,访问修饰符、函数、封装的概念、UML类图、构造方法、this关键字、static关键字、方法重载、方法重写、包(packahe)
运行第一个JAVA程序: 这里使用的开发环境是eclipse,新建一个java工程,然后可以看到src这个是存放java代码的地方,然后在src文件右击新建一个class(类),然后可以看到下图,同样 ...
- Java SE 8新特性导览:使用Lambda Expression进行函数式编程
" Java SE 8新功能浏览 "系列的这篇文章将深入了解Lambda表达式 . 我将向您展示Lambda表达式的几种不同用法. 它们都具有功能接口的共同实现. 我将解释编译器如 ...
- Java SE 基础(一)
Java 0.基础内容 1.程序 计算机在执行某些操作或解决某些问题时,而编写的一系列有序指令的集合 2.java历史 1995年发布第一版 java 8.java 11.java 16为长期支持版 ...
- JAVA SE基础笔记
第一天 JDK安装.快捷键.JAVA语言特点 1.Java语言的概述 1.1 Java语言的背景 Java语言诞生于1995年,在编程语言排行榜占据重要的地位. Java语言之父是高斯林,以前隶属于 ...
- Java SE笔记(其三)
IO流 File类 java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关 File 能新建.删除.重命名文件和目录,但 File 不能访问文件内容本身.如果需要访问文件内容本身,则 ...
- Java SE 基础知识汇总
目录 一.Java概述 1.1 Java语言背景 1.2 Java语言的三个版本 1.3 Java语言的跨平台原理 1.4 JRE和JDK 1.5 DOS命令 二.Java环境搭建 2.1 环境变量的 ...
- Java SE 基础入门知识
系列文章目录 提示:阅读本章之前,请先阅读目录 文章目录 系列文章目录 前言 Hello world 注意事项 注释 关键字 变量命名 强类型语言 八大数据类型 字节类型和单位 进制转换 完全避免使用 ...
最新文章
- “chaos”的算法--之链表面试题
- SAS、R以及SPSS的比较__统计语言大战
- 教你两种黑掉“人工智能”的方法
- 无法消除恐惧?Nature发现肠道菌与大脑间更多的神秘联系...
- linux 软件包的安装
- Spring2 Hibernate3 Junit 应用示例1
- 阻止中文输入法输入拼音的时候触发input事件
- 数据预处理之将类别数据数字化的方法 —— LabelEncoder VS OneHotEncoder
- 用gulp计算合金弹性常数_考研结构力学 用3种方法解东南大学位移法大题
- 如何实现批量替换文件夹名称?
- 双下划线一粗一细怎么加_word 下划线 一粗一细
- 媒体查询之响应式布局
- python2个子线程等待_Python的并发并行[1] - 线程[3] - 多线程的同步控制
- 离散数学——成真赋值与成假赋值
- 前端同学需要知道的产品原型绘制技巧
- 把方形头像切成圆形的头像工具类
- BISTML-CRF项目源码
- JAVA并发编程的艺术-读书笔记
- 植物大战僵尸经典android,植物大战僵尸经典版
- 《Python数据分析与挖掘实战》第10章(下)——DNN2 筛选得“候选洗浴事件”3 构建模型
热门文章
- 【BZOJ2440】【中山市选2011】完全平方数
- irobot擦地机器人故障_简单修理irobot 380T拖地机器人 后退转圈故障
- 好玩的计算机操作,windows10系统功能详解,各种有趣好玩的功能,你是否了解
- JAVA练习59-连续子数组的最大和
- 一般纳税人给小规模纳税人一般都是开普通发票
- js 正则 限制 input 只能输入数字,不能输入特殊符号,保留两位小数等效果
- 深入理解:为什么要使用工厂模式?
- Nokia官方技术论坛
- godot3.4节点按照键盘方向键旋转和移动
- CUDA:cudaMalloc vs cudaMallocHost