首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在静态方法中不能使用this

在JVM的运行时数据区中有个虚拟机栈(或Java栈),在它的里面是由栈帧'叠加'而成.栈帧由局部变量表,操作数栈,动态连接,方法返回地址等组成. 那么我们就从局部变量表角度解答下这个问题....下面是测试代码,一个静态方法query,一个普通方法shadow,这两个方法的参数和函数体完全一样. // 静态方法 public static void query(String year) {...int month = 12; String address = "Jiangsu"; System.out.println(address); } // 普通方法 public void...query方法的局部变量表,如下 shadow方法的局部变量表,如下 我们发现,非静态方法shadow的局部变量表中有this,而在静态方法query的局部变量表中没有this....在普通方法中,在它的局部变量表中的第一个槽存放了this, 而静态方法的局部变量表中没有存放this.

1.9K30

关于使用MethodHandle在子类中调用祖父类重写方法的探究

关于使用MethodHandle在子类中调用祖父类重写方法的探究 注:这个例子原本出现在周志明先生的《深入理解Java虚拟机》--虚拟机字节码执行引擎章节,介于有读者朋友有疑问,这里基于Java代码层面解释一下...在普通的方法调用中,这个this参数是虚拟机自动处理的,表示的是当前实例对象,我们在方法中可以直接使用。...但是在我们这个MethodHandle的例子中,相当于是模拟了invoke*指令的处理,手动调用invoke方法就需要指定这个"this"参数。...我觉得使用bindTo绑定方法接收者要比在invoke方法中传递更加友好,也更加符合程序员的大众理解,invoke可以只专注方法显式的入参。 然后再来说bindTo(this)中的this。...基于这个事实,我们这时可以直接在GrandFather的thinking方法中调用Son类独有的方法,使用反射或者直接类型强制转换为Son就行了。

9.5K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    面试题5:在jdk1.8中,HashMap的put方法,如何实现的?Map什么情况会扩容?什么情况会转成红黑树?

    其次:如果数组下标位置没有元素,则将key和value封装为Entry对象(JDK 1.7中是Entry对象,JDK 1.8中是Node对象),并放入该位置。...如果是红黑树Node,则将key和value封装为一个红黑树节点并添加到红黑树中去,在这个过程中会判断红黑树中是否存在当前key,如果存在则更新value值。...这个插入尾部的过程中,需要遍历链表,如果发现存在相同的key,则更新value,否则执行插入操作,当链表节点个数超过了8个,且数组大于等于64,则会将该链表转化为红黑树。...将key和value封装为Node插入到链表或红黑树中后,再判断是否需要进行扩容——如果需要就扩容,不需要就结束put操作。 jdk1.8HashMap扩容源码解析

    26320

    Django学习笔记之Django QuerySet的方法

    用defer,延后读取,你可以在defer中指定一个或多个字段,也可用链式方法使用defer,它返回对依然是个完整对queryset但其中defer指定但字段并没有真但从数据库读出来,只有当你访问这些延后字段时...你还阔以defer model中的外键,但是你需要提使用 select_related() 载入关联 model,具体用法: Blog.objects.select_related().defer("entry...('time', 'black') 当你使用链式方法调用only时只有最后一个only内的参数会立即返回,其他参数都会被defer,注意这里only的覆盖性~ 5、create(**kwargs) 创建并保存对象...一般我们要新建一个model对象时直接使用他的构造函数或者使用.语法赋值,最后调用.save()方法保存。...那么在我们已经知道新建这个对象所有必须数据的情况下,其实用create会更快捷,代码看着更干净,起使用方法与构造方法类似,只是不需要调用.save()啦, 例子如下: p = Entry.objects.create

    59150

    Angularjs的回调

    defer.resolve('xx'); } 使用的方法,基本上是: 通过 $q 服务得到一个 deferred 实例 通过 deferred 实例的 promise 属性得到一个 promise...对象 promise 对象负责定义回调函数 deferred 实例负责触发回调 $q有四个方法: $q.all() 合并多个 promise ,得到一个新的 promise $q.defer() 返回一个...,又要把这个异常在回调链中传下去时使用: 要理解这东西,先看看 promise 的链式回调是如何运作的,看下面两段代码的区别: var defer = $q.defer(); var p = defer.promise...'} ); p2.then( function(data){console.log(data)} ); defer.resolve('123'); 从模型上看,前者是“并发”,后者才是“链式”。...('xx'); defer.resolve('xx'); promise promise 对象只有 then() 一个方法,注册成功回调函数和失败回调函数,再返回一个promise 对象,以用于链式调用

    1.7K20

    从零开始写一个符合PromisesA+规范的promise

    开始 本文promise里用到的异步操作的示例都是使用的node里面的fs.readFile方法,在浏览器端可以使用setTimeout方法进行模拟异步操作。 一....支持三种状态 我们知道在使用promise时,promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。...只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,如果改变已经发生了,你再对promise对象添加回调函数,也会立即得到这个结果。 目标 实现promise的三种状态。...,只需要在最后一行加一个return this即可,这其实和jQuery链式操作的原理一致,每次调用完方法都返回自身实例,后面的方法也是实例的方法,所以可以继续执行。...另外执行回调函数时,因为回调函数既可能会返回一个异步的promise也可能会返回一个同步结果,所以我们把直接把回调函数的结果托管给bridgePromise,使用resolvePromise方法来解析回调函数的结果

    1K10

    从零开始写一个符合PromisesA+规范的promise

    开始 本文promise里用到的异步操作的示例都是使用的node里面的fs.readFile方法,在浏览器端可以使用setTimeout方法进行模拟异步操作。 一....支持三种状态 我们知道在使用promise时,promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。...只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,如果改变已经发生了,你再对promise对象添加回调函数,也会立即得到这个结果。 目标 实现promise的三种状态。...,只需要在最后一行加一个return this即可,这其实和jQuery链式操作的原理一致,每次调用完方法都返回自身实例,后面的方法也是实例的方法,所以可以继续执行。...另外执行回调函数时,因为回调函数既可能会返回一个异步的promise也可能会返回一个同步结果,所以我们把直接把回调函数的结果托管给bridgePromise,使用resolvePromise方法来解析回调函数的结果

    1.5K20

    Go小技巧&易错点100例(十五)

    本期看点:正文开始:Go程序跟踪函数的执行时间在Go程序中我们经常会对接口执行的耗时做一个记录,特别是针对核心或复杂业务的时候,我们需要关注该业务的执行耗时,可以具体到某个方法,有一个简单有效的技巧,你可以使用...defer关键字,只需一行代码即可使用。...链式编程通常具有以下特点:方法返回值:每个方法调用后都返回当前对象(通常是this),从而允许连续调用其他方法。可读性:链式编程通常可以提高代码的可读性,因为它允许开发者以直观、流式的方式组织代码。...构建器模式:链式编程常用于构建器模式(Builder Pattern)中,用于创建具有多个可选参数的对象。减少代码量:通过链式编程,开发者可以在单行代码中执行多个操作,从而减少代码量。...在实现接口时,可以使用值接收者或指针接收者。它们的主要区别在于如何处理结构体的拷贝和指针。值接收者方法接收一个结构体值的副本作为接收者,而指针接收者方法接收一个结构体指针作为接收者。

    12720

    Promise原理解析与实现

    分辨dom promise和harmony promise的方法就是在dev中输入Promise(function(){}) 如果报错了说明是dom的promise, 不报错则为harmony的promise...) 虽然外观略不同, 但不管是connect还是promise, 其内部都有一个stack或者queue的东西保存着全部的流, 在js中显然也就是一个数组 比如express中可以这么链式的写 app.use...{ resolver(resolve, reject) var queue = [] // 保存链式调用的数组 this.then = function(resolve, reject)...queue.shift() arr[i](val) } })} 这样resolve的出栈动作就肯定比进栈晚了, 不过这样写虽然很简洁, 但肯定有隐患(只不过我还没发现) 那如何让Promise支持链式调用呢...resolve, reject) { result.resolve = resolve result.reject = reject }) return result} deferred的使用方法非常顺手

    83490

    Go语言核心36讲(Go语言进阶技术十六)--学习笔记

    如果一个 panic 是我们在无意间引发的,那么其中的值只能由 Go 语言运行时系统给定。但是,当我们使用panic函数有意地引发一个 panic 的时候,却可以自行指定其包含的值。...不过,它们在功能上,肯定远不如我们自己定义的Error方法或者String方法。因此,为不同的数据类型分别编写这两种方法总是首选。 可是,这与传给panic函数的参数值又有什么关系呢?...也只有这样,defer函数中的recover函数调用才会拦截,并恢复defer语句所属的函数,及其调用的代码中发生的所有 panic。...那么问题来了,这条for语句中产生的多个defer函数调用,会以怎样的顺序执行呢? 为了彻底搞清楚,我们需要弄明白defer语句执行时发生的事情。...在需要执行某个函数中的defer函数调用的时候,Go 语言会先拿到对应的链表,然后从该链表中一个一个地取出defer函数及其参数值,并逐个执行调用。

    42901

    1 什么是 JavaScript

    在HTML中我们推荐使用双引号,JS中我们推荐使用单引号 6 JavaScript 引入方式 6.1 嵌入式 嵌入式就是使用 标签包裹 JavaScript 代码,直接编写到HTML文件中...6.2 外链式 外链式是指将 JavaScript 代码保存到一个单独的文件中,通常使用“js”作为文件的扩展名,然后使用 标签的src属性引入文件中。 会增加 HTML 文件的体积,影响网页本身的加载速度,而外链式可以利用浏览器缓存提高速度。 外链式有利于分布式部署。...因此在实际开发中不推荐使用行内式。 7 JavaScript 异步加载 在引入 JavaScript 代码时,页面的下载和渲染都会暂停,等待脚本执行完成后才会继续(内嵌式或外链式)。...在 JavaScript 中,使用单引号或双引号包裹的数据是字符串。

    14500

    Go 中 defer 关键字原理

    defer 是什么? defer 修饰的函数是一个延迟函数,在包含它的函数返回时运行。...(go关键字是使用newproc函数,它两的实现有着不少相似之处) deferreturn。在return指令前调用,从链表中取出defer函数并执行。 deferprocStack。...call 函数 cmd/compile/internal/gc.state.call 会负责为所有函数和方法调用生成中间代码: 获取需要执行的函数名,代码制作和函数调用的接收方 需要获取栈地址并将函数或者方法的参数写入栈中...使用 cmd/compile/internal/gc.state.newValue1A 函数生成函数调用的中间代码 如果当前调用的函数是 defer, 那么会单独生成相关的结束代码块。...runtime.deferreturn 会多次判断当前 Goroutine 的 _defer 链表中是否有未执行的结构体,该函数只有在所有延迟函数都执行后才会返回 最后调用的 runtime.return0

    67120

    Go 中 Defer 原理分析

    defer 是什么? defer 修饰的函数是一个延迟函数,在包含它的函数返回时运行。...(go关键字是使用newproc函数,它两的实现有着不少相似之处) deferreturn。在return指令前调用,从链表中取出defer函数并执行。 deferprocStack。...call 函数 cmd/compile/internal/gc.state.call 会负责为所有函数和方法调用生成中间代码: 获取需要执行的函数名,代码制作和函数调用的接收方 需要获取栈地址并将函数或者方法的参数写入栈中...使用 cmd/compile/internal/gc.state.newValue1A 函数生成函数调用的中间代码 如果当前调用的函数是 defer, 那么会单独生成相关的结束代码块。...runtime.deferreturn 会多次判断当前 Goroutine 的 _defer 链表中是否有未执行的结构体,该函数只有在所有延迟函数都执行后才会返回 最后调用的 runtime.return0

    34631

    Gorm-链式调用(二)

    GORM 链式调用的关联查询除了基本的查询操作,GORM 还支持关联查询。关联查询是指查询多个表中的数据,并将它们组合在一起。下面是一些常用的关联查询方法:Joins:指定要连接的表和连接条件。...GORM 链式调用的事务处理GORM 链式调用还支持事务处理,它允许你在多个操作之间创建事务,并确保这些操作都能成功或都能失败。...下面是一个示例,演示如何使用 GORM 链式调用来进行事务处理:tx := db.Begin() // 开始事务defer func() { if r := recover(); r !...= nil { panic(err)}上面的代码中,我们首先使用 Begin 方法开始事务,并在最后使用 Commit 方法提交事务。...在事务中,我们执行了两个操作,分别是创建一个用户和创建一篇文章。如果其中任何一个操作失败,我们会使用 Rollback 方法回滚整个事务。

    72300
    领券