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

Java中静态方法不能调用非静态方法的原因

如图,是Java中静态代码和实例对象互相调用的规则,我们接下来就讲讲为什么在Java中静态方法不可以调用非静态代码。...静态方法不依赖于对象的调用,它是通过‘类名.静态方法名’这样的方式来调用的。而对于非静态方法,在对象创建的时候程序才会为其分配内存,然后通过类的对象去访问非静态方法。...因此在对象未存在时非静态方法也不存在,静态方法自然不能调用一个不存在的方法。...(1)首先,我们可以试一下去掉static,这里不会编译错误,但是运行时会抛出空指针异常,原因是什么,原因就是类似于上面说的静态方法不能调用非静态方法的原因了。...(3)不能用一个值为null的引用类型变量来调用非静态方法,这样会抛出空指针异常,但是静态方法可以一个值为null的引用类型变量调用而不会抛出空指针异常。

5.5K50
您找到你想要的搜索结果了吗?
是的
没有找到

为什么start方法不能重复调用?而run方法却可以?

区别3 因为 run 方法是普通方法,而普通方法是可以多次调用的,所以 run 方法可以调用多次;而 start 方法是创建新线程来执行任务,因为线程只能创建一次,所以它们的第三个区别是:run...方法可以调用多次,而 start 方法只能调用一次。...为什么start不能重复调用?...0,也就是是否为新建状态 NEW,如果不等于新建状态,那么就会抛出“IllegalThreadStateException”非法线程状态异常,这就是线程的 start 方法不能重复调用的原因。...start 方法之所以不能重复调用的原因是,线程的状态是不可逆的,Thread 在 start 的实现源码中做了判断,如果线程不是新建状态 NEW,则会抛出非法线程状态异常 IllegalThreadStateException

63210

Python中通过对象不能调用方法和静态方法的解析

当我们在使用Python编写程序时,可能会遇到通过对象调用方法和静态方法失败的问题,那么这是为什么?接下来,我们将从多个方面对这个问题进行详细解析。...一、类方法和静态方法的定义在了解Python中通过对象不能调用方法和静态方法之前,首先需要明确类方法和静态方法的定义。...二、对象调用方法的原理在Python中,对象调用方法的原理可以简单概括为:Python通过找到方法所在的类,并将该对象作为第一个参数(通常用self)传入方法中。...三、不能通过对象调用方法和静态方法的原因既然Python中对象调用方法的原理是将该对象作为第一个参数传入方法中,那么为什么不能通过对象调用方法和静态方法?...但是,必须注意,不能通过对象调用方法和静态方法,因为对象无法传入第一个参数cls或self,这就导致了类型错误或访问错误。

70830

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

__init__() def calc_age(self): print(123456) 如果你使用 PeopleInfo初始化一个对象,然后调用这个类的 calc_age方法,我们来看看运行效果,...这是因为,在Python里面,类方法或者属性如果以双下划线开头,那么他们就是类的私有方法,在被继承的时候,即使子类有相同名字的以双下划线开头的属性或者方法也不会覆盖父类。...而且这些以双下划线开头的私有方法或者属性,在类内部可以自由其他方法调用,但是在实例对象里面是不能直接调用的,如下图所示: 那么Python是如何实现这一点的?...Python仅仅是改了一个名字,在这种双下划线的私有方法或者私有属性的前面加上了 _类名,这样就确保了子类和父类的方法名不一致。..._PeopleInfo__calc_age() # 强行调用子类的私有方法 kingname._Info__calc_age() # 强行调用父类的私有方法 运行效果如下图所示: ?

1.6K30

标记为事务的方法互相调用的坑(上)

下面我就分享下 标记为事务的方法互相调用的坑。 如果想学习Java工程化、高性能及分布式、深入浅出。...insertCodeMonkey方法,但是insertCodeMonkey不是很重要,就算失败,也不能影响到insertCodeBear方法的执行,但是insertCodeMonkey该回滚的还是要回滚...,调用了add方法,add方法里面又调用了delete的方法。...通过两个例子,可以得到一个结论:只有调用代理对象的方法才能拦截,所以 在方法A中直接调用方法B,方法B是不会被拦截的。...这也就是为什么insertCodeMonkey的事务没有开启的原因了,因为insertCodeMonkey方法是insertCodeBear直接调用的。 那么,这个问题该如何解决

67810

标记为事务的方法互相调用的坑(下)

上一节,主要分析了 标记为事务的方法互相调用,事务失效的原因,思考比较多,这一节主要说说解决方案,思考会少一些。...解决方案的核心: 通过代理对象去调用方法 1.把方法放到不同的类: 如果想学习Java工程化、高性能及分布式、深入浅出。...翻译下:不能找到当前的代理,需要设置exposeProxy属性为 true使其可以。 expose字面意思就是 暴露。也就是说 我们需要允许暴露代理。...此方法不适用于prototype 在这里,我用了一个@PostConstruct注解,在初始化的时候,会调用@PostConstruct标记的方法(注意,仅仅是初始化的时候,才会被调用。...以后都不会被调用了,大家可以打个断点试一下),这里这么做的目的就是为了提升一下效率,不用每次都getBean。所以如果这个类是prototype的,就不适用这个方法了。

56520

【程序源代码】intellij idea查看方法在哪里调用

关键字:intellij idea查看方法在哪里调用的两种技巧     最近一直在使用idea进行开发和调试代码。发现idea确实对开发者非常友好。...也就是说经常需要知道这个方法在哪些类、哪些对象需要使用到它,这样在调用方法的时候,将断点放到入口调用的地方就能直接 跟踪执行程序了。     今天又折腾了一半天修改方法方法调用相关的操作。...intellij idea想要知道查看方法在哪里调用?该怎么去实现?我们今天来分享两种方法,都比较简单,详细请看下文介绍,需要的朋友可以参考下。...这种方法是找到该方法调用 ,是找到那使用的地方。...ctrl+alt+h的搜索结果的结构是目标方法->调用目标方法方法a->调用a的方法b……这样的结构 为了方便阅读和理解,文章分享的技术已经通过录制视频,已经上传到同名的视频号。

4.1K50

main方法可以重载吗?可以其他方法调用吗?可以继承吗?

我们一开始学习 Java 程序的时候,最先跑的一段代码肯定是 main 方法,那么 main 方法有什么特殊的地方?...方法是启动的时候由 JVM 进行加载的,public 的可访问权限是最高的,所以需要声明为 public; 「static」 :方法调用要么是通过对象,要么是通过类,而 main 方法的话因为是由虚拟机调用的...,其他的 main 方法都是比较普通的方法。...所以,main方法可以重载 main方法可以其他方法调用吗?...:3 main方法执行:2 main方法执行:1 main方法执行:0 所以说即使是作为应用程序入口的 main 方法,也是可以其他方法调用的,但要注意程序的关闭方式,别陷入死循环了。

1.6K10

java高级用法之:无所不能的java,本地方法调用实况

那么如何交互?会不会很复杂? 今天本文带大家一一揭晓。 JDK的本地方法 所谓本地方法就是调用操作系统或者其他底层库的方法。这些方法属于系统的外部接口,用于程序和操作系统之间进行交互。...大家想一下,JDK中有哪些本地的方法? 第一个想到的应该就是文件操作,因为文件操作肯定需要依赖与系统底层提供的IO接口。...delete0方法,而这个方法是一个native方法,表示该方法需要调用系统本地的方法。...那么这么实现这个native方法? 不管熟悉还是不熟悉C++的朋友应该都听过头文件的概念,一般来说我们在头文件中定义好要实现的方法,然后在具体的内容文件中对头文件中定义的方法进行实现。...总结 以上就是一个简单的使用JAVA调用native方法的例子。大家可以看到,步骤还是挺复杂的,那么有没有其他更加简单的方法,让JAVA来调用native方法

60620

字节一面:事务还没提交的时候,redolog 能不能持久化到磁盘

redolog 写到文件系统的 page cache 中 说了这么多,各位小伙伴们对 binlog 和 redolog 的持久化机制想必都有所了解了,我们来看文题:事务还没提交的时候,redolog 能不能持久化到磁盘...write 操作存在文件系统的 page cache 中,但是没有执行 fsync 操作持久化到磁盘 事务提交,执行 fsync 操作持久化到磁盘 至于为什么说事务还没提交的时候,redolog 也有可能持久化到磁盘...:事务还没提交的时候,redo log 能不能持久化到磁盘?...相关问题:MySQL 是如何保证数据不丢失的? 小牛肉:事务还没有提交的时候,redo log 是有可能持久化到磁盘的。...write 操作存在文件系统的 page cache 中,但是没有执行 fsync 操作持久化到磁盘 事务提交,执行 fsync 操作持久化到磁盘 额为什么说事务还没提交的时候,redolog 也有可能持久化到磁盘

2K41

【面试题精讲】Java静态方法为什么不能调用非静态成员?

什么是静态方法和非静态成员? 在 Java 中,静态方法(static method)是属于类的方法,而不是属于对象的方法。它可以通过类名直接调用,无需创建对象实例。...为什么静态方法不能调用非静态成员? 静态方法不能调用非静态成员的原因是:静态方法在没有对象实例的情况下就可以调用,而非静态成员必须依赖于对象实例才能访问。...由于静态方法不依赖于任何对象实例,所以它无法引用或访问非静态成员。 另外,静态方法在编译时就已经确定了调用方法,而非静态成员只有在运行时才能确定具体的值。...如果允许静态方法调用非静态成员,那么在静态方法中无法确定要访问哪个对象的成员,这将导致逻辑上的混乱和错误。 3. 如何解决静态方法无法调用非静态成员的问题?...总结 静态方法不能调用非静态成员的原因是静态方法在没有对象实例的情况下就可以调用,而非静态成员必须依赖于对象实例才能访问。

41830

java动态代理中的invoke方法是如何自动调用的「建议收藏」

因为我在动态代理犯晕的根源就在于将上面的subject.request()理解错了,至少是表面所迷惑,没有发现这个subject和Proxy之间的联系,一度纠结于最后调用的这个request()是怎么和...从以上代码和结果可以看出,我们并没有显示的调用invoke()方法,但是这个方法确实执行了。...当执行subject.request()方法时,就调用了$Proxy0类中的request()方法,进而调用父类Proxy中的h的invoke()方法.即InvocationHandler.invoke...PS:1、需要说明的一点是,Proxy类中getProxyClass方法返回的是Proxy的Class类。之所以说明,是因为我一开始犯了个低级错误,以为返回的是“代理类的Class类”- -!...Q:到现在为止,还有一个疑问,invoke方法中的第一个参数是Proxy的实例(准确说,最终用到的是$Proxy0的实例),但是有什么用?或者说,程序内是怎样显示出作用的?

2.4K21
领券