美文网首页
思考:java - 静态方法为什么不能调用非静态的成员

思考:java - 静态方法为什么不能调用非静态的成员

作者: sevndream | 来源:发表于2018-01-23 01:30 被阅读0次
从 Java 语言的层面讲,静态方法和实例方法的本质区别在于是否是对象所共享的。而从 JVM 的角度来看,方法(无论静态方法还是实例方法)其实都是对象共享的,实例变量才是对象私有的。对 JVM 而言,静态方法和实例方法的本质区别在于是否需要和具体对象关联:静态方法可以通过类名来调用,它不需要和具体对象关联;而实例方法必须通过对象来进行调用,它需要和具体对象关联。那么,实例方法和具体对象是如何产生关联的呢?其实很简单,编译器在编译时会将方法接收者作为一个隐含参数传入该实例方法,这个参数在方法中有一个很熟悉的名字,叫做 “this”。之所以实例方法可以访问该类的实例变量和其它实例方法,正是因为它有 “this” 这个隐含参数。举个例子,类 A 中的某个方法 b 需要访问实例变量 x,由于实例变量是对象私有的,如果 b 是静态方法,由于它没有具体对象的引用,它并不知道该访问哪个对象的实例变量 x;如果 b 是实例方法,通过隐含参数 this 就能确定要访问的实例变量是 this.x。那么,为什么静态方法也不能调用该类的实例方法呢?本质原因也是没有 this 引用。因为调用实例方法的前提是要传入一个隐含参数,实例方法本来就有这个引用,所以能够把它作为隐含参数传入另一个实例方法;静态方法没有 this 引用,无法给实例方法提供指向方法接收者的隐含参数,因此不能调用实例方法。

相关文章

  • static静态变量

    1、静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员,如果希望在静态方法中调用非静态变量,可以通过...

  • static关键字

    在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用...

  • 思考:java - 静态方法为什么不能调用非静态的成员

    从 Java 语言的层面讲,静态方法和实例方法的本质区别在于是否是对象所共享的。而从 JVM 的角度来看,方法(无...

  • C#学习笔记<五> static

    1 静态成员 static成员中不能调用非static成员非static成员中可以调用static成员静态成员类似...

  • java中Static修饰符静态方法为什么不能调用非静态方法或变

    结论:静态方法只能调用静态方法(或者变量),非静态方法可以调用静态方法(或者变量)原因:类的静态成员(变量或方法)...

  • 为什么从静态的方法里调用非静态的方法或变量是非法的?

    结论: 非静态的方法可以调用静态的方法,但是静态的方法不可以调用非静态的方法。 类的静态成员(变量和方法)属于类本...

  • 内部类

    静态内部类 静态内部类只能调用静态成员变量,不能调用非静态成员变量; 成员内部类 成员内部类和成员变量类似; 局部...

  • Java 基础知识

    Q:静态方法为什么不能调用非静态成员? A: 静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名直接访问...

  • static 静态方法

    1.静态方法可以直接调用同类中的静态成员,不可以直接调用同类的费静态成员。 2.普通方法可以直接调用静态成员和非静...

  • 类中方法中调用本类的方法

    在静态方法中不能调用非静态方法 在非静态方法中可以直接调用类中的方法

网友评论

      本文标题:思考:java - 静态方法为什么不能调用非静态的成员

      本文链接:https://www.haomeiwen.com/subject/zokdaxtx.html