一个类可以被创建出多个对象,this代表当前对象,火星上的程序猿都听说过了。
那么this是怎样代表当前对象的呢?
看个简单的代码。methodA中调用了this.methodB.去掉this一样
public void methodA() {
int result = this.methodB(1,2);
}
public int methodB(int a, int b) {
return a + b;
}
这里,先唠叨点jvm相关的东西。
jvm是基于栈数据结构设计的,上面一连串的指令自然是基于栈操作。
每个java线程启动时,都会创建自己私有的栈,用来存点局部变量啊,计算的中间结果啊什么的。
其大小可以用参数-Xss指定,相同物理内存下,调这个会影响可创建的总线程数。
线程中的每次方法调用都会创建个小栈,叫栈帧,存在当前线程的栈中,方法结束,栈帧消亡。
一个线程同一时刻只能执行一个方法,不然就就乱套了。
这个正在执行的方法就叫当前方法,这方法的栈帧叫当前栈帧,同理,线程叫当前线程,对象叫当前对象。
每个方法都有个叫做局部变量表的东西,顾名思义,存访问局部变量用的,还可以用来访问方法的参数。
局部变量和参数的个数,编译期数数就知道了。
所以,局部变量表可以通过索引来访问,用下标,总是从0开始,0,1,2,3........
当前方法执行的时候会整个操作数栈出来,初始是空的,各字节码指令从中提取和写入内容。
扯这些东西,跟this又有什么关系呢?
this,就搞在这个局部变量表中,在实例方法被调用时,它总是作为第一个参数传过去
请看字节码
public void methodA();
Code:
0: aload_0 //把局部变量表的第0个位置的引用类型加载到操作数栈中,就是this
1: iconst_1 //把int型常量1加载到操作数栈
2: iconst_2 //把int型常量2加载到操作数栈
3: invokevirtual #2; //Method methodB:(II)I 用上面三个参数,调用方法methodB
6: istore_1 //方法的返回结果赋值给result变量
7: return
public int methodB(int, int);
Code:
0: iload_1 //加载局部变量表中下标为1的参数到操作数栈,这里没有从0开始,就是因为0是this
1: iload_2
2: iadd
3: ireturn
实例方法经过编译后,字节码指令会传当前对像的引用给被调用方法,这样,this就起作用了。
分享到:
相关推荐
### 浅谈Java代理机制 #### 一、引言 在深入探讨Java代理机制之前,我们首先需要了解代理模式的基本概念及其应用场景。代理模式是一种结构型设计模式,它为其他对象提供了一种代理以控制对这个对象的访问。在Java...
this.count += value; } ``` 同步静态方法: ```java public static synchronized void add(int value) { count += value; } ``` 总之,Java多线程编程是复杂而强大的,理解和掌握好同步机制,能够帮助我们编写出...
### Java内部类的应用场景 #### 场景一:当某个类除了它的外部类,不再被其他的类使用时 内部类的使用场景之一是当某个类仅需被其外部类使用时。这种情况下,将此类定义为内部类可以提高代码的封装性和可维护性。 ...
"浅谈Java中的this作为返回值时返回的是什么" 在Java中,this关键字是一个特殊的引用,它指向当前对象本身。那么,当this作为返回值时,它返回的是什么呢?下面我们来详细地分析一下。 首先,我们需要了解this...
"JAVA小论文(浅谈String类)" Java的小论文浅谈String类,讨论了Java中字符串的存储和处理。Java提供了String类、StringBuffer类和StringTokenizer类来存储和处理字符串。在大多数情况下,可以使用String类来创建...
### Java分布式应用学习笔记06浅谈并发加锁机制分析 #### 1. 前言 在深入探讨Java中的并发加锁机制之前,我们有必要回顾一下多线程环境下的一些基本概念和技术。之前的多线程调度、并发调度以及线程加锁安全等内容...
浅谈Java编程中的synthetic关键字 synthetic关键字是Java编程中的一种特殊关键字,用于标记Java虚拟机(JVM)生成的类成员,而不是在源代码中显式定义的。这些类成员包括字段和方法,它们是JVM为了实现某些语言特性...
浅谈java面向对象(类,封装,this,构造方法) 面向对象编程是一种编程范式,强调使用对象和类来解决问题。 Java 是一种面向对象的编程语言,它提供了多种机制来支持面向对象编程,如类、对象、继承、多态、封装等。 ...
在Java中,`this`关键字代表当前对象的引用。当我们需要在方法内部引用对象的属性或方法时,可以使用`this`。例如,在上面的`setName()`方法中,`this.name = name;`表示将传入的`name`值赋给当前对象的`name`属性。...
"Java实现MongoDB多条件查询" MongoDB是一种非常流行的NoSQL数据库,Java是目前最流行的编程语言之一。因此,了解如何使用Java实现MongoDB的多条件查询非常重要。本文将详细介绍如何使用Java实现MongoDB的多条件...
今天,我们将深入浅谈该问题,并提供两种解决方法:通过使用外部资源文件的方式和通过使用内部资源文件的方式。 问题描述 当我们将 Java 项目打包成 Jar 文件后,发现图片无法加载。这是因为 Jar 文件中的路径问题...
"浅谈java继承中是否创建父类对象" 在 Java 中,继承是一个非常重要的概念,它允许子类继承父类的属性和方法。但是,一个常见的问题是, Java 中的继承是否创建父类对象?在这篇文章中,我们将深入探讨这个问题,并...
浅谈Java中unmodifiableList方法的应用场景 Java是一个强大的面向对象的编程语言,广泛应用于Android开发、Web开发、企业软件开发等领域。Java集合框架(Java Collections Framework)是Java语言中的一种基本工具,...
Java集合框架是Java编程语言中不可或缺的一部分,它提供了一种高效、灵活的数据组织方式。本文将深入探讨Java集合类的基本概念、分类以及示例。 首先,Java中的集合分为两大类:一种是以单个元素存储的集合,它们...
Java Fork/Join 并行框架 Java Fork/Join 并行框架是 Java 7 中引入的一个并行任务框架,可以将任务分割成足够小的小任务,然后让不同的线程来做这些分割出来的小事情,然后完成之后再进行 join,将小任务的结果...
static 方法中不能使用 this 和 super 关键字,不能调用非 static 方法,只能访问所属类的静态成员变量和成员方法。 单例设计模式 static 关键字的一个重要用途就是实现单例设计模式。单例模式的特点是该类只能有...
浅谈Java多线程实现及同步互斥通讯 多线程实现方式: Java中的多线程实现方式共有两种:通过继承Thread类和通过实现Runnable接口。下面我们来详细了解这两种方式: 1. 通过继承Thread类来实现多线程: 通过继承...
this.s = s; } @Override public boolean equals(Object o) { if (o instanceof CaseInsensitiveString) { return s.equalsIgnoreCase(((CaseInsensitiveString) o).s); } if (o instanceof String) { ...
Java 责任链模式详解 Java 责任链模式是一种行为型设计模式,它通过提供一个接收者对象的链来处理请求,从而避免了请求发送者和接收者之间的耦合。这使得多个对象都有可能接收请求,并且沿着链传递请求,直到有对象...
this.jedisPool = jedisPool; } @Override public void run() { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); Jedis jedis = jedisPool.getResource(); while (true) { ...