菜鸡的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 的精髓,也是所有初学者最难学的地方 引用的本质:同一块堆内存可以被不同的栈内存所指向 下面通过三道程序来进行引用传 ...
随机推荐
- react之四种组件中DOM样式设置方式
1.行内样式 想给虚拟dom添加行内样式,需要使用表达式传入样式对象的方式来实现 行内样式需要写入一个样式对象,而这个样式对象的位置可以放在很多地方 例如:render函数里.组件原型上.外链js文件 ...
- 1-Java继承中多态情况特性下变量,方法,静态方法的访问
在Java继承下,多态特性下类成员访问情况 /* 在继承中,变量时静态的绑定的,非静态方法是动态的绑定的,静态方法是静态绑定的 */ class Parent{ int number = 11; pu ...
- sarama的消费者组分析、使用
以前老的sarama版本不支持消费者组的消费方式,所以大多数人都用sarama-cluster. 后来sarama支持了消费者组的消费方式,sarama-cluster也停止维护了,但网上关于sara ...
- 题解 [NOI2019]弹跳
题目传送门 题目大意 给出 \(n\) 做城市,每座城市都有横纵坐标 \(x,y\).现在给出 \(m\) 个限制 \(p,t,l,r,d,u\),表示从 \(p\) 城市出发,可以花费 \(t\) ...
- 题解 Christmas Game
题目传送门 题目大意 给出 \(t\) 个 \(n\) 个点 \(m\) 条边的无向图,每次可以从任意一棵树选择一条边删掉,然后该树不与根(为 \(1\) )联通的部分被删掉.不能操作的人输.问谁有必 ...
- NX Open,怎样取到面的环LOOP
在封装的ufun .NET库里面,对UF_MODL_ask_face_loops这个函数并没有封装,导致我们很多不便,那我们在.NET下怎样才能使用这个函数呢??当然是手动处理一下 Public Fu ...
- 【UE4 C++】UObject 创建、销毁、内存管理
UObject 的创建 NewObject 模板类 本例使用 UE 4.26,只剩下 NewObject 用来创建 UObject,提供两个带不同可选参数构造函数的模板类 Outer 表示这个对象的外 ...
- LiveVideoStackCon2021 北京站专访:从上云到创新,视频云的新技术、新场景
伴随着视频技术的进步和标准的迭代,视频产业从模拟进入到数字时代,完成了从电影电视到互联网的媒介转换,并且衍生出了超高清.3D.AR/VR 等多种创新形态.特别是在后疫情的当下,我们可以看到音视频技术领 ...
- 欧姆龙plc通讯协议格式
欧姆龙CPM1A型plc与上位计算机通信的顺序是上位机先发出命令信息给PLC,PLC返回响应信息给上位 机.每次通信发送/接受的一组数据称为一"帧".帧由少于131个字符的数据构成 ...
- Sharding-JDBC自定义复合分片算法
Sharding-JDBC自定义复合分片算法 一.背景 二.需求 1.对于客户端操作而言 2.对于运营端操作而言 三.分片算法 1.客户id和订单id的生成规则 2. 确定数据落在那个表中 3.举例说 ...