`
huiz
  • 浏览: 1317 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

浅谈java的this

    博客分类:
  • java
 
阅读更多

一个类可以被创建出多个对象,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就起作用了。

 

 

 

 

2
1
分享到:
评论

相关推荐

    浅谈java代理机制 .txt

    ### 浅谈Java代理机制 #### 一、引言 在深入探讨Java代理机制之前,我们首先需要了解代理模式的基本概念及其应用场景。代理模式是一种结构型设计模式,它为其他对象提供了一种代理以控制对这个对象的访问。在Java...

    浅谈java多线程编程

    this.count += value; } ``` 同步静态方法: ```java public static synchronized void add(int value) { count += value; } ``` 总之,Java多线程编程是复杂而强大的,理解和掌握好同步机制,能够帮助我们编写出...

    浅谈Java内部类的四个应用场景

    ### Java内部类的应用场景 #### 场景一:当某个类除了它的外部类,不再被其他的类使用时 内部类的使用场景之一是当某个类仅需被其外部类使用时。这种情况下,将此类定义为内部类可以提高代码的封装性和可维护性。 ...

    浅谈Java中的this作为返回值时返回的是什么

    "浅谈Java中的this作为返回值时返回的是什么" 在Java中,this关键字是一个特殊的引用,它指向当前对象本身。那么,当this作为返回值时,它返回的是什么呢?下面我们来详细地分析一下。 首先,我们需要了解this...

    JAVA小论文(浅谈String类)

    "JAVA小论文(浅谈String类)" Java的小论文浅谈String类,讨论了Java中字符串的存储和处理。Java提供了String类、StringBuffer类和StringTokenizer类来存储和处理字符串。在大多数情况下,可以使用String类来创建...

    Java分布式应用学习笔记06浅谈并发加锁机制分析

    ### Java分布式应用学习笔记06浅谈并发加锁机制分析 #### 1. 前言 在深入探讨Java中的并发加锁机制之前,我们有必要回顾一下多线程环境下的一些基本概念和技术。之前的多线程调度、并发调度以及线程加锁安全等内容...

    浅谈Java编程中的synthetic关键字

    浅谈Java编程中的synthetic关键字 synthetic关键字是Java编程中的一种特殊关键字,用于标记Java虚拟机(JVM)生成的类成员,而不是在源代码中显式定义的。这些类成员包括字段和方法,它们是JVM为了实现某些语言特性...

    浅谈java面向对象(类,封装,this,构造方法)

    浅谈java面向对象(类,封装,this,构造方法) 面向对象编程是一种编程范式,强调使用对象和类来解决问题。 Java 是一种面向对象的编程语言,它提供了多种机制来支持面向对象编程,如类、对象、继承、多态、封装等。 ...

    浅谈java封装

    在Java中,`this`关键字代表当前对象的引用。当我们需要在方法内部引用对象的属性或方法时,可以使用`this`。例如,在上面的`setName()`方法中,`this.name = name;`表示将传入的`name`值赋给当前对象的`name`属性。...

    浅谈java实现mongoDB的多条件查询

    "Java实现MongoDB多条件查询" MongoDB是一种非常流行的NoSQL数据库,Java是目前最流行的编程语言之一。因此,了解如何使用Java实现MongoDB的多条件查询非常重要。本文将详细介绍如何使用Java实现MongoDB的多条件...

    浅谈Java 将图片打包到jar中的路径问题

    今天,我们将深入浅谈该问题,并提供两种解决方法:通过使用外部资源文件的方式和通过使用内部资源文件的方式。 问题描述 当我们将 Java 项目打包成 Jar 文件后,发现图片无法加载。这是因为 Jar 文件中的路径问题...

    浅谈java继承中是否创建父类对象

    "浅谈java继承中是否创建父类对象" 在 Java 中,继承是一个非常重要的概念,它允许子类继承父类的属性和方法。但是,一个常见的问题是, Java 中的继承是否创建父类对象?在这篇文章中,我们将深入探讨这个问题,并...

    浅谈java中unmodifiableList方法的应用场景

    浅谈Java中unmodifiableList方法的应用场景 Java是一个强大的面向对象的编程语言,广泛应用于Android开发、Web开发、企业软件开发等领域。Java集合框架(Java Collections Framework)是Java语言中的一种基本工具,...

    浅谈java集合类以及示例

    Java集合框架是Java编程语言中不可或缺的一部分,它提供了一种高效、灵活的数据组织方式。本文将深入探讨Java集合类的基本概念、分类以及示例。 首先,Java中的集合分为两大类:一种是以单个元素存储的集合,它们...

    浅谈Java Fork/Join并行框架

    Java Fork/Join 并行框架 Java Fork/Join 并行框架是 Java 7 中引入的一个并行任务框架,可以将任务分割成足够小的小任务,然后让不同的线程来做这些分割出来的小事情,然后完成之后再进行 join,将小任务的结果...

    浅谈Java中static关键字的作用

    static 方法中不能使用 this 和 super 关键字,不能调用非 static 方法,只能访问所属类的静态成员变量和成员方法。 单例设计模式 static 关键字的一个重要用途就是实现单例设计模式。单例模式的特点是该类只能有...

    浅谈Java多线程实现及同步互斥通讯

    浅谈Java多线程实现及同步互斥通讯 多线程实现方式: Java中的多线程实现方式共有两种:通过继承Thread类和通过实现Runnable接口。下面我们来详细了解这两种方式: 1. 通过继承Thread类来实现多线程: 通过继承...

    浅谈java 重写equals方法的种种坑

    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 责任链模式详解 Java 责任链模式是一种行为型设计模式,它通过提供一个接收者对象的链来处理请求,从而避免了请求发送者和接收者之间的耦合。这使得多个对象都有可能接收请求,并且沿着链传递请求,直到有对象...

    浅谈java实现redis的发布订阅(简单易懂)

    this.jedisPool = jedisPool; } @Override public void run() { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); Jedis jedis = jedisPool.getResource(); while (true) { ...

Global site tag (gtag.js) - Google Analytics