首页
学习
活动
专区
工具
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
您找到你想要的搜索结果了吗?
是的
没有找到

AndroidActivity类的7个方法

第一行代码安卓第二版P65页: onCreate()这个方法你已经看到过很多次了,每个活动我们都重写了这个方法,它会在活动第一次被创建的时候调用,你应该在这个方法完成活动的初始化操作,比如加载布局...onPause() 这个方法系统准备去启动或者恢复另一个活动的时候调用,我们通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用...以上7个方法除了 onRestart()方法,其他都是两两相对的,从而又可以将活动分为三种生存期。 完整生存期。...活动onCreate()方法和onDestory()方法之间所经历的,就是完整生存期,一般情况下,一个活动会在onCreate()方法完成各种初始化操作,而在onDestory()方法完成释放内存的操作...我们可以通过这两个方法,合理地管理那些对用户可见的资源,比如在onStart()方法对资源重载,onStop()方法对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。 前台生存期。

1.2K20

C# 匿名方法循环体中使用的注意事项

如果我们直接在匿名方法中使用循环体的增值变量i,得到的永远是固定的值,在上面的代码也即是ss.Length的值。...然而很多时候我们需要的是当时的循环变量值,虽然方法执行的时候这个循环体早已执行完成,但我们可以通过循环体内方法外单独存储一个循环增量i的值,也即是上面的si,这样在后面的方法时便可以按照当时的增量...至于这个现象产生的原因,查阅后发现是因为C#后台为我们方法执行之前就提前存储了该回方法使用的外部变量。...(感觉跟协程的挂起有点像) 也得益于这样的机制,一些方法内部书写回方法可以使一些复杂的逻辑极快的实现完成,避免了重复的传递参数和记录全局变量。...最重要的是这些只需要在一个方法完成,这确实是令人兴奋的事。

1.1K30

为什么 build 方法放在 State 而不是 StatefulWidget

老孟导读:此篇文章是生命周期相关文章的番外篇,查看源码的过程中发现了这一有趣的问题,欢迎大家一起探讨。...为什么 build 方法放在 State 而不是 StatefulWidget 呢?其中前2点是源代码的注释给出的原因,最后一点是我的一点个人理解。...试想一下,如果 build 方法放在 StatefulWidget ,则 AnimatedWidget 的 build 方法需要带一个 State 参数,如下: abstract class AnimatedWidget...闭包 this 指向异常 假设 build 方法 StatefulWidget ,StatefulWidget 的子类写法如下: class MyWidget extends StatefulWidget...如果 build 方法 State ,代码如下: class MyWidget extends StatefulWidget { final Color color; const MyWidget

86920

vue源码分析之defineReactive方法为什么有两种dep收集依赖?

在这个方法,给obj的每个key对应的都new了一个dep,这个dep保存在defineReactive闭包。...每个key对应的dep收集依赖(下面称为闭包dep),还有一个 childOb.dep.depend()收集依赖。...令人一头雾水的是,reactiveSetter方法,只有闭包的dep通知watcher, childOb.dep并没有通知watcher,而且这个dep也没必要通知watcher。...接着new Observer,会通过walk方法,循环♻️遍历拿到dataObj的每个key,进行defineReactive export function observe(value: any,...def(value, "__ob__", this); 复制代码 众所周知,Vue不能检测到对象属性的添加,为了解决这个问题,Vue添加了一个Vue.set方法

1.6K00

一日一技:Python双下划线私有方法不能被调用的原理

不过你可能会强行解释为:子类的 __init__里面,有一行 super().__init__(),这个地方可能子类还没有完全覆盖父类,所以先运行了父类的方法。...这是因为,Python里面,类方法或者属性如果以双下划线开头,那么他们就是类的私有方法,在被继承的时候,即使子类有相同名字的以双下划线开头的属性或者方法也不会覆盖父类。...而且这些以双下划线开头的私有方法或者属性,类内部可以自由被其他方法调用,但是实例对象里面是不能直接调用的,如下图所示: 那么Python是如何实现这一点的呢?...__calc_age就是子类的 __calc_age。...所以,虽然 规范上,这种双下划线的私有方法和私有属性是不应该在外部访问的,但是如果你想强行访问,可以个使用这种改名以后的名字: kingname = PeopleInfo() kingname.

1.6K30

为什么Java类的成员变量不能被重写?成员变量Java能够被重写么?不会重写成员变量,而是隐藏成员变量访问隐藏域的方法

这篇文章讨论了Java面向对象概念中一个基本的概念--Field Hiding(成员变量隐藏) 成员变量Java能够被重写么?...这是为什么呢?...意思就是: 一个类,子类的成员变量如果和父类的成员变量同名,那么即使他们类型不一样,只要名字一样。父类的成员变量都会被隐藏。子类,父类的成员变量不能被简单的用引用来访问。...其实,简单来说,就是子类不会去重写覆盖父类的成员变量,所以成员变量的访问不能方法一样使用多态去访问。...访问隐藏域的方法 就是使用父类的引用类型,那么就可以访问到隐藏域,就像我们例子的代码 就是使用类型转换System.out.println(((Super)c1).s); 翻译自http://www.programcreek.com

3.5K40

为什么要重写hashcode和equals方法?初级程序员面试很少能说清楚。

2 为什么要重写equals和hashCode方法 当我们用HashMap存入自定义的类时,如果不重写这个自定义类的equals和hashCode方法,得到的结果会和我们预期的不一样。...这是符合逻辑的,但从当前结果看,26行的返回结果不是我们想象的那个字符串,而是null。 原因有两个—没有重写。第一是没有重写hashCode方法,第二是没有重写equals方法。...由于我们Key对象里没有定义equals方法,系统就不得不调用Object类的equals方法。...由于Object的固有方法是根据两个对象的内存地址来判断,所以k1和k2一定不会相等,这就是为什么依然26行通过hm.get(k2)依然得到null的原因。...3 对面试问题的说明 由于项目里经常会用到HashMap,所以我面试的时候一定会问这个问题∶你有没有重写过hashCode方法

34560

为什么Iterator的remove方法可保证从源集合安全地删除对象,而在迭代期间不能直接删除集合内元素

https://blog.csdn.net/yanshuanche3765/article/details/78917507 在对集合进行操作时,我们会发现,如果我们用迭代器迭代,但是迭代器过程如果使用集合对象去删除...Iterator 支持从源集合安全地删除对象,只需 Iterator 上调用remove()即可。...有些集合不允许迭代时删除或添加元素,但是调用 Iterator 的remove() 方法是个安全的做法。 那么为什么用Iterator删除时是安全的的呢?...Iterator 是工作一个独立的线程,并且拥有一个 mutex 锁。...但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。

5.6K31

我所理解的C++反射机制

(1)为需要反射的类定义一个创建该类对象的一个函数; (2)设计一个工厂类,类中有一个std::map,用于保存类名和创建实例的函数。...将定义的类注册到工厂类。也就是说将类名称字符串和创建类实例的函数保存到工厂类的map。...这里我们又需要完成两个工作,第一个是定义一个创建类实例的函数,第二个就是将类名称字符串和我们定义的函数保存到工厂类的map。假设我们定义了一个TestClassA。...下面我们要思考一下如何将这个函数和对应的类名称字符串保存到工厂类的map。...可以程序的任何一个源文件创建注册动作类的对象,但是在这里,我们放在函数后面创建。后面你就知道为什么这么做了。

4.6K41

C语言图书信息管理系统

* find_data, int(*compare)(void*, void*)) 为什么我要先把功能函数的原型给列举出来,因为你仔细看参数,双链表功能实现多次用到函数 什么是函数呢?...函数就是一个通过函数指针调用的函数。❞ 怎么说呢,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是函数。 函数能够干什么?...你学过C++知道多肽吧,就是一个方法实现多个功能,函数就是C里面实现多肽的方式 举个栗子: 功能函数里面有个遍历所有节点的功能函数 /*遍历节点*/ void deroy_list_cuid(deroy_list_t...) == 0) return 0; return counter; } 这里的的函数要求判断两个数据,返回真假 /*函数 比较db_data_pt数据段的id是否相同*...find_data->password) == 0) { return find_data->rank; } } return -1; } 之而立直接调用链表提供的方法deroy_list_find

1.1K20

Android的WebView与H5前端JS代码交互的实例代码

另一种就是通过谷歌提供的JS与Java绑定的接口,约定好要交互的对象名,类似于下面的“App” //通过WebView提供的addJavascriptInterface这行代码,我们浏览器的JS环境创建了一个...为什么别人IOS都可以拿到我的对象,你拿的就是undefined?为什么别人IOS能给我对象,你就不给我对象,偏要给我字符串?...凭什么别人IOS能拿到我的匿名函数来调用,你偏偏让我写一个函数给你?...//需要注入的js代码,加//"是因为简书会忽略\"这个引号,不加的话后面的代码都是字符串的颜色了 //原理是通过这个SDKNativeEvents来保存传入的匿名函数callback,等原生做完该做的操作之后...,匿名需要的参数依然是个对象,我们通过注入的SDK保存了这个函数,并自己做了对象和字符串转换,实际上Java代码最终拿到和传出去还都是字符串,我们通过这个sdk统一的进行了转换,前端js代码那边不用判断手机是

1.7K31

chat集群聊天室项目 代码+讲解(二):业务模块

文章目录 项目简单架构图 1.0版本:单服务器 2.0版本,横向扩充,负载均衡 3.0版本,优 代码 讲解 为什么要设置单例 MsgHandler 的设计 业务为什么不直接对接数据库?...nlohmann::json; using namespace std; using namespace muduo; using namespace muduo::net; //处理消息的事件方法类型...{ ··· //通过msgid获取业务,进行网络模块和任务模块之间的解耦合 auto msgHandler = ChatService::instance()->getHandle(js["msgid...(js["msgid"].get()); //消息绑定好的事件处理器,执行相应的业务处理 msgHandler(conn,js,time); ----------------...---- 业务为什么不直接对接数据库? 放出来的登录业务,也可以看到业务层并没有直接对接数据库的权利。 走一层数据库映射不麻烦吗? 业务层还没有知道数据库设计的权力。

77530
领券