菜鸡的Java笔记 第十五 this 关键字
this 关键字
对于this关键字有三种用法:表示本类属性,调用本类方法,当前对象
this 关键字如何实现属性,方法的调用,以及对象本身的描述
this 首先明确是一个灵活的关键字,他不会明确的表示出任何一个固定的概念
例如:写一个int永远都知道这是一个整型
调用本类属性
类之中有许多的成员,那么在大部分情况下,类里面是直接进行成员的调用
但是很多时候为了能够更加清楚的描述出调用的本类属性,所以调用属性时,可以采用“this.属性”的形式
下面通过一个简短的程序来观察一下this属性的意义
范例:观察有问题的代码
class Person{
private String name;
private int age;
public Person(String n;int a){
name = n;
age = a;
}
public String getlnfo(){
return "姓名:" +name+ "年龄:" +age;
}
}
public class thisKeyword{
public static void main(String args[]){
Person per = new Person("我",20);
System.out.println(per.getlnfo());
}
}
问题是n 和 a 为什么不能直接是name 和age
这个代码在构造方法上的参数很明确是要做什么,就是为了name和age属性赋值
如果直接是name和age 那么结果就是 名字是null 年龄是0
造成此类原因是在于程序也存在有“就近取用”的原则,以“{}”为界定范围
如果在此范围内存在有指定的变量名称就直接调用,如果没有则会去调用类中的相应的属性
那么当参数与属性名称相同的时候,就会出现混淆的概念,那么就需要用户自己手工的明确指出调用的是属性还是方法中的参数
如是属性则使用“this.属性”进行调用
class Person{
private String name;
private int age;
public Person(String name;int age){
this.name = name;
this.age = age;
}
public String getlnfo(){
return "姓名:" +this.name+ "年龄:" +this.age;
}
}
public class thisKeyword{
public static void main(String args[]){
Person per = new Person("我",20);
System.out.println(per.getlnfo());
}
}
在以后,类中调用本类属性的时候必须严格按照“this.属性”的形式调用
调用本类方法
利用this 调用方法
在一个类中方法实际上存在有两类:普通方法(this.方法名称(参数)),构造方法(this(参数)),而this调用本类方法的时候两类形式的方法都可以调用
但是语法是不同的
1.调用本类的其他方法:this.方法()
在一个类中可能会存在许多种方法,那么这些方法之间可以直接进行调用
class Person{
private String name;
private int age;
public Person(String name;int age){
this.name = name;
this.age = age;
}
public String getlnfo(){
this.print(); // 调用本类方法
// print();// 直接调用,但是不标准
return "姓名:" +this.name+ "年龄:" +this.age;
}
public void print(){
System.out.println("***********");
}
}
public class thisKeyword{
public static void main(String args[]){
Person per = new Person("我",20);
System.out.println(per.getlnfo());
}
}
2.调用本类其他构造:this()
一个类中是可以存在有构造方法的,而且构造方法可以进行重载,并且构造方法只在实例化对象的时候调用一次
如果说现在有这样一种要求:一个Person类中要求提供有三个构造方法
但是不管调用那种构造方法,都要求执行一行语句“新的Person类对象实例化了”(假设这行语句相当于500行语句)
范例:原始实现形式
class Person{
private String name;
private int age;
public Person (){
System,out,println("新的Person类对象实例化了(假设这行语句相当于500行语句)");
}
public Person(String name){
this.name = name;
System,out,println("新的Person类对象实例化了(假设这行语句相当于500行语句)");
}
public Person(String name;int age){
this.name = name;
this.age = age;
System,out,println("新的Person类对象实例化了(假设这行语句相当于500行语句)");
}
public class thisKeyword{
public static void main(String args[]){
Person per = new Person("我",20); }
}
首先程序设计的第一个原则:避免重复代码。按照这个原则来讲,以上的代码实际上并不符合开发要求
那么在这种情况下就可以依靠this()的形式完成调用、
class Person{
private String name;
private int age;
public Person (){
System,out,println("新的Person类对象实例化了(假设这行语句相当于500行语句)");
}
public Person(String name){
this();//调用本类无参构造
this.name = name; }
public Person(String name;int age){
this(name); //调用本类无参构造
this.age = age;
}
public class thisKeyword{
public static void main(String args[]){
Person per = new Person("我",20); }
}
通过执行可以发现,此时的确已经利用了“this()”实现了类中构造方法的调用执行
但是在整个程序里面实际上对于“this()”的语法是有限制的
该语句只能够放在构造方法的首行
但是在使用“this()”调用本类其他构造方法的时候,应该避免循环的形式出现,留个出口
范例:错误的代码
class Person{
private String name;
private int age;
public Person (){
this("",10); // 构造方法首行
System,out,println("新的Person类对象实例化了(假设这行语句相当于500行语句)");
}
public Person(String name){
this();//调用本类无参构造
this.name = name; }
public Person(String name;int age){
this(name); //调用本类无参构造
this.age = age;
}
public class thisKeyword{
public static void main(String args[]){
Person per = new Person("我",20); }
}
为了更方便的理解构造方法互调用的意义所在,下面通过一个具体的实例化来进行说明
开发要求:现在要求定义有一个雇员的信息类,在此类中提供有如下四个属性:姓名,职位,部门,工资
除了四个属性之外还要求提供有四个构造方法:
无参构造:要求姓名为无名氏,职位为待定,部门为后勤部,工资为0.0:
单参构造:(姓名),职位办事员,部门为技术部,工资为700.0;
双参构造:(姓名,职位),部门为工程师,工资为10000.0;
四参构造:
那么下面将针对于此程序给出两种代码的实现形式
第一种实现:传统实现
class Emp{
private String name; 姓名
private String job; 职位:
private String dept; 部门:
private double sal; 工资
public Emp(){
this.name = "无名氏";
this.job = "待定";
this.dept = "后勤部";
this.sal = 0.0;
}
public Emp(String name){
this.name = name
this.job = "办事员";
this.dept = "技术部";
this.sal = 1700.0;
}
public Emp(String name,String job){
this.name = name
this.job = "工程师";
this.dept = dept;
this.sal = 10000.0;
}
public Emp(String name,String job,String dept,double sal){
this.name = name
this.job = job;
this.dept = dept;
this.sal = sal
}
public String getlnfo(){
return"姓名:"+this.name+"职位:"+this.job+"部门:"+this.dept+"工资:"+this.sal:
}
}
public class thisKeyword{
public static void main(String args[]){
Emp new = new Emp();
System.out.println(emp.getlnfo);
}
}
第二种:利用this改进
class Emp{
private String name; 姓名
private String job; 职位:
private String dept; 部门:
private double sal; 工资
public Emp(){
this("无名氏","待定","后勤部",0.0);
}
public Emp(String name){
this(name,"办事员","技术部",1700.0);
}
public Emp(String name,String job){
this(name,"工程师",job,10000.0);
}
public Emp(String name,String job,String dept,double sal){
this.name = name
this.job = job;
this.dept = dept;
this.sal = sal
}
public String getlnfo(){
return"姓名:"+this.name+"职位:"+this.job+"部门:"+this.dept+"工资:"+this.sal:
}
}
public class thisKeyword{
public static void main(String args[]){
Emp new = new Emp();
System.out.println(emp.getlnfo);
}
}
此时已经明显的消除了出现的重复代码,所以这样的设计是比较合理的设计
this 表示当前对象
范例:观察当前对象的概念
class Message{
public void print(){
System.out.println("【Message】this = " + this); // 直接一个this
}
}
public class tthis{
public static void main(String aegs[]){
Message msgA = new Message();
System.out.println("【主类】" + msgA);
msgA,print();
System.out.println("************************************");
Message msgB = new Message();
System.out.println("【主类】" + msgB);
msgB,print();
}
}
那么之前所谓的"this.属性”严格意义上就是当前对象的属性,所以不同的对象调用一个setter方法设置内容的时候,由于this描述的对象不同,所以属性只会保存在各自的堆内存里面
菜鸡的Java笔记 第十五 this 关键字的更多相关文章
- 菜鸡的Java笔记 第二十五 wrapperClass 包装类
wrapperClass 包装类 1.包装类的特点 2.装箱与拆箱操作 3.数据转型处理 内容 Object 类可以接收 ...
- 菜鸡的Java笔记 第二十九 - java 单例设计模式
SingleCase 单例设计模式 1.单例设计模式的特点 2.多例设计模式的特点 内容 单例设计模式 现在如果说有这么一个程序类 class S ...
- 菜鸡的Java笔记 第二十八 - java 包的定义
包的主要作用以及定义 包的导入操作 系统常见的开发包 jar 程序命令 包的定义 在任何的操作系统之中都有一个统一的共识:同一个目录下不能够存在有相同的文 ...
- 菜鸡的Java笔记 第二十六 - java 内部类
/* innerClass 从实际的开发来看,真正写到内部类的时候是在很久以后了,短期内如果是自己编写代码,几乎是见不到内部类出现的 讲解它的目的第一个是为了解释概念 ...
- 菜鸡的Java笔记 第二十四 - java 接口的基本定义
1.接口的基本定义以及使用形式 2.与接口有关的设计模式的初步认识 3.接口与抽象类的区别 接口与抽象类相比,接口的使用几率是最高的,所有的 ...
- 菜鸡的Java笔记 第二十二 - java 对象多态性
本次只是围绕着多态性的概念来进行讲解,但是所讲解的代码与实际的开发几乎没有关系,而且多态一定是在继承性的基础上才可以操作的, 而本次将使用类继承的关系来描述多态的性质,实际的开发中不会出 ...
- 菜鸡的Java笔记 第十九 - java 继承
继承性的主要目的,继承的实现,继承的限制 继承是面向对象中的第二大主要特点,其核心的本质在于:可以将父类的功能一直沿用下去 为什么需要继承? ...
- 菜鸡的Java笔记 第十八 - java 代码块
代码块 code block content (内容) 在程序结构之中使用"{}"定义的内容就称为代码块,但是会根据其声明的位置以及关 ...
- 菜鸡的Java笔记 第十六 - java 引用传递
referenceDelivery 引用传递是整个java 的精髓,也是所有初学者最难学的地方 引用的本质:同一块堆内存可以被不同的栈内存所指向 下面通过三道程序来进行引用传 ...
随机推荐
- 题解 CF555E Case of Computer Network
题目传送门 题目大意 给出一个\(n\)个点\(m\)条边的无向图,有\(q\)次有向点对\((s,t)\),问是否存在一种方法定向每条边使得每个点对可以\(s\to t\). \(n,m,q\le ...
- CVPR2021提出的一些新数据集汇总
前言 在<论文创新的常见思路总结>(点击标题阅读)一文中,提到过一些新的数据集或者新方向比较容易出论文.因此纠结于选择课题方向的读者可以考虑以下几个新方向.文末附相关论文获取方式. ...
- websocket方案调研及实践
目录 webscoket方案调研及实践 一.使用场景 二.方案调研 1.Ajax短轮询 2.long-polling长轮询 3.iframe长连接 4.XHR-streaming 5.Websocke ...
- Jmeter之BeanShell 断言
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15436864.html 博客主页:https://www.cnblogs.com/testero ...
- 移动端 h5 uniapp 读,写,删本地文件或sd文件
移动端 h5 uniapp 读,写,删本地文件或sd文件 应用场景: 当我们需要做离线应用或者是加载本地文件时使用到此方法.(本篇文章给大家分享访问app私有文件目录,系统公共目录,sd外置存储的文件 ...
- [对对子队]Alpha阶段项目展示博客
Alpha阶段项目展示博客 1 团队成员的简介和个人博客地址 成员 头像 岗位 博客 个人介绍 黄贤昊 PM 17373253 喜欢玩游戏和做游戏,项目经验基本都和游戏相关,擅长摸鱼,偶尔敬业. 刘子 ...
- 主仆见证了 Hobo 的离别 题解
前言: 题面挺神仙.反正我考试的时候看了40分钟也没看懂. 后来改题感觉自己写的挺假,没想到加个\(k==1\)的特判竟然就A了?无语力. 解析: 看懂题以后就好说了.首先这显然是一个树形结构.我们考 ...
- LP-DDR 和其他 DDR
一篇技術文檔比較 LP-DDR 和其他 DDR. 就觀念來說,LP-DDR 就是 Low Power 的 DDR:但就架構來說,LP-DDR 和其他 DDR 是截然不同的東西. 他們分屬不同的 JDE ...
- n阶行列式计算
1.化为上下三角 该类型的矩阵.行列式在之前写过(https://www.cnblogs.com/wangzheming35/p/12906624.html),也建议记住这个行列式的结论. 当然不仅仅 ...
- 【做题记录】max-min+1=len 区间计数
(来源:XJ高质量原创题) 原题地址 弱化版:CF526F Pudding Monsters 弱化版 题意:\(n\times n\) 的棋盘上有 \(n\) 颗棋子,每行每列都有且仅有一颗棋子,求出 ...