Java中this关键字

关于Java语言中的this关键字

  • this 是一个关键字,翻译为:这个
  • this 是一个引用,一个变量,this变量中保存的内存地址指向自身
  • 每一个对象都有自己的this,创建多少Java对象,就有多少个不同的this
  • this存储在JVM堆内存中的Java对象中
  • this可以出现在实例方法中,this指代当前执行对应实例方法的对象引用
  • this不能使用在有 static 的方法中

测试1:

public class Customer {

    // 姓名
String name; // 构造方法
public Customer(){ } // 顾客购物的行为
// 不带 static 关键字
// 没有 static 的变量和方法分别称为实例变量和实例方法
// 实例变量和实例方法的调用需要使用引用
// 因为没有一个顾客购买不同,所以该方法应使用实例方法
// 注意:当一个行为?动作在执行过程中涉及对象的参与,应该使用实例方法【不带static关键字】
public void shopping(){ System.out.println(this.name + "在购物");
// this 代表当前执行该实例方法的对象引用 } public static void doSome(){ // System.out.println(name); 报错
// 这个执行过程中没有“当前对象”,因为带有static的方法是 类.方法
// name 实例变量,上述代码表示:访问当前对象的实例变量name // System.out.println(this); 报错
// 使用static方法调用不需要对象,直接使用类名,所以执行过程中没有当前对象 }
}
public class ThisTest01{

    public static void main(String[] args) {

        // 创建Customer对象
Customer c1 = new Customer();
c1.name = "jock"; // 创建Customer对象
Customer c2 = new Customer();
c2.name = "rose"; // 顾客购物
c1.shopping();
c2.shopping(); // 带static的方法
Customer.doSome();
}
}

测试2:

public class ThisTest02 {

    // 实例变量(引用)
int num = 10; public static void main(String[] args){ // System.out.println(num); 报错
// this 或 实例变量 不能使用在有 static 的方法中 // System.out.println(this.num); 报错
// 与上面一样
}
}

测试3:

public class ThisTest03 {

    public static void main(String[] args) {

        // 调用doSome方法
ThisTest.doSome(); // 或者
doSome(); // 调用doOther方法
// ThisTest.doOther() 报错
// 实例方法需要引用和对象,但目前在类自身中
// this.doOther(); 报错
// 因为 main 方法是静态方法带有static } // 带有static 静态方法
public static void doSome() {
System.out.println("do some!");
} // 不带static 实例方法
public void doOther() {
System.out.println("do other!");
} // 实例方法
public void run() { // 想要运行run实例方法,需要有对象 System.out.println("run !");
doOther(); // 成功调用
// 运行run说明已经有对象,所以doOther能调用
this.doOther(); // 同理
}
}

结论:

  • 在带有static的方法当中不能“直接”访问实例变量和实例方法
  • 因为实例变量和实例方法都需要对象的存在
  • 而static的方法当中是没有this的,也就是说明当前对象不存在
  • 自然也是无法访问当前对象的实例变量和实例方法

this什么时候不能省略

  • 用来区分局部变量和实例变量的时候,this 不能省略
public class User {

    private int id;
private String name; /*
public void setId(int a) {
id = a;
}
*/
// 传入参数与id不同可以区分,id是实例变量,a是传入参数 /*
public void setId(int id) {
id = id;
}
*/
// 传入参数与id相同,由于就近原则传入参数为前一个id,后一个是实例变量 // 上述两种含义不同,前者是:实例变量 = 传入参数;后者是:传入参数 = 实例变量 // 传入参数与id相同应该用
public void setId(int id) {
this.id = id;
}
}

this可以使用在哪里?

  • 可以使用在实例方法当中,代表当前对象

    语法格式:this.

  • 可以使用在构造器【构造方法】当中,通过当前的构造方法调用其他的构造方法

    语法格式:this(实参列表);

重点:this()只能出现在构造函数第一行


Java面向对象



学习笔记--Java中this关键字的更多相关文章

  1. Java复习笔记--java中this 关键字

    Java中this关键字,this可以调用类的成员变量和成员方法,this还可以调用类中的构造方法.使用这种方式值得注意的是, 只可以在无参构造方法中的第一句使用this关键字调用有参构造方法. pu ...

  2. Android学习笔记----Java中的字符串比较

    用习惯了C#.C++,在做字符串比较时想当然地使用如下语句: string str1 = "abcd", str2 = "abcd"; if(str1==str ...

  3. 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)

    一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ...

  4. 设计模式学习笔记——java中常用的设计模式

    单例设计模式(Singleton Pattern) 观察者模式(Observer Pattern) 工厂模式(Factory Pattern) 策略模式(Strategy Pattern) 适配器模式 ...

  5. swift学习笔记 - swift中常用关键字

    swift中常用关键字 **用作声明的关键字: ** class.deinit.enum.extension.func.import.init.let.protocol.static.struct.s ...

  6. 学习笔记--Java中的变量

    Java中的变量 /** * 关于 Java 语言当中的变量: * * 1. 什么是变量? * - 变量的本质上来说是内存空间,这块空间有(数据类型.名字.字面值) * - 变量包括三部分:数据类型. ...

  7. java学习笔记-继承中super关键字

    背景: 在java继承的概念中我们得知,被声明为私有的类成员对所属的类来说仍然是私有的.类之外的任何代码都不能访问,包括子类. super关键字的两种用法: 1.用于调用超类的构造函数: 2.用于访问 ...

  8. Java学习笔记-Java中的常用类

    Java中有很多类是很常用的,此处列举System,Runtime,Date,Calendar,Math System System:类中的方法和属性都是静态的 字段摘要 static PrintSt ...

  9. java学习笔记--java中的基本数组[5]

    java基础很重要, 今天呆家看java视频,顺便总结前几周看的java书籍,做一下简单的总结:1:数组的声明,2:数组的赋值: 3:数组的方法: 声明一个数组主要有两种方式: //类型 []数组名字 ...

  10. java学习笔记——java中对象的创建,初始化,引用的解析

    如果有一个A类. 1.例如以下表达式: A  a1 = new A(); 那么A是类,a1是引用.new A()是对象.仅仅是a1这个引用指向了new A()这个对象. 2.又如: A  a2; A代 ...

随机推荐

  1. Android OpenMAX(八)如何学习OMXNodeInstance

    前面一篇文章中我们看到media.codec service创建OMX组件后会把组件传递给一个OMXNodeInstance对象,并且把OMXNodeInstance对象返回到Framework层,F ...

  2. .net c# 文件分片/断点续传之下载--客户端

    断点续传客户端实现主要参考了以下文章: https://blog.csdn.net/binyao02123202/article/details/76599949 客户端实现续传的主要是一下几点 1. ...

  3. vue 实现商品列表的添加、删除,搜索

    大江东去,浪淘尽,千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石穿空,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰.遥想公瑾当年,小乔初嫁了,雄姿英发.羽扇纶巾,谈笑间,樯橹灰飞烟灭.故国神游,多 ...

  4. shell脚本入门学习

    1 参考 [尚硅谷]Shell脚本从入门到实战_哔哩哔哩_bilibili 本文为上面链接的课程学习记录. 2 基础 shell脚本需要shell解释器进行执行,shell解释器就是一个应用程序,有多 ...

  5. Nodejs 创建web服务 静态资源服务器 get数据获取 post数据获取

    NodeJs是通过官方提供的http模块来创建 web服务器的模块.通过几行简单的代码,就能轻松的手写一个web服务,从而对外提供 web 服务. ² 创建web服务基本步骤 ①.导入http模块 c ...

  6. linux系统下,安装maven教程

    1.下载 官网:https://maven.apache.org/download.cgi 2.上传包 将下载好的maven安装包apache-maven-3.8.6-bin.tar.gz放在磁盘的 ...

  7. ssh进阶

    1.ssh客户端工具 查看参数和帮助方法 ==ssh --help== ==man ssh== 常见参数 windows linux macos 提供的ssh命令,会有些区别,查看帮助后使用即可. l ...

  8. Java原子操作保证方案

    引言 原子操作是指不会被线程调度机制打断的操作:这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程).通常所说的原子操作包括对非long和double ...

  9. 关于java时间类型和格式化到微秒问题

    常规的问题此处略,因为网络上到处都是,这里主要讨论三个问题: 1.数据库的时间戳类型(含微秒)对应java的什么类型 java的常见时间类型比较多: java.util.Date java.sql.D ...

  10. 保护您的Web应用:使用雷池(SafeLine)WAF的入门指南

    雷池(SafeLine)是长亭科技耗时近 10 年倾情打造的 WAF,核心检测能力由智能语义分析算法驱动.旨在提供卓越的安全保护.本文将带您一步步了解如何安装.配置和测试SafeLine,以及如何利用 ...