博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么不能从静态的方法里面调用非静态方法,或变量?
阅读量:2496 次
发布时间:2019-05-11

本文共 1239 字,大约阅读时间需要 4 分钟。

程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问。

类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。

在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错:

而类又是在什么时候加载的呢?

    由引导类加载器负责加载的核心类比如 String 类在 JVM 启动时(main 方法开始执行前)就会被加载,其它类在使用前(new 它对象或调用其静态方法访问静态域等等前)会被动态加载,要注意的是子类被加载前它的所有超类要根据由父到子的顺序被逐一加载。

class A1

{
    public static int a=5;
}
class B1 extends A1
{
    
public static int a=8;
    
void print(){
        System.out.println(
super.a);
        System.out.println(a);
    }
}
public class TestStatic
{
    
public static void main(String args[])
    {
        System.out.println(
"b.a="+B1.a);
        System.out.println(
"b.a="+A1.a);
        
new B1().print();
    }
}
就这段代码说一下.

就你上面的代码说一下: 

当你在doc环境下输入: 
TestStatic时, 
虚拟机会先加载TestStatic类,此时虚拟机会先看看TestStatic类有没有静态的字段, 
没有,直接执行main方法。 
main方法中第一句代码是打印B1.a, 
虚拟机便会去找类B1,找到类B1时,虚拟机发现B1的父亲是A1, 
于是父亲优先,先加载A1, 
同样,在加载A1时,会看看A1中有什么静态的东西,有, 
static int a = 5; 
a是静态的,先加载,当把静态的字段加载完后,一个类就算加载完了, 
所以A1已经加载完毕,以后不用在加载了。 
父亲加载完了,轮到B1了,同样先看看里面有什么静态的字段,有, 
static int a = 8; 
此时B1也加载完毕了。 
第一条打印语句到此时也执行完毕了, 
轮到第二条打印语句了。 
当执行new B1().print();这句时, 
会发生动态绑定, 
此时会有一个代表B1对象的this对象传递给print()方法, 
所以print()方法中的 
System.out.println(a); 
其实是, 
System.out.println(this.a); 
会打印出一个8出来。 
至于super.a就简单了, 
打印父类中的a, 
结果是5. 
到此,main()方法执行完,整个程序退出。

转载地址:http://vxqrb.baihongyu.com/

你可能感兴趣的文章
设计模式03_工厂
查看>>
设计模式04_抽象工厂
查看>>
设计模式05_单例
查看>>
设计模式06_原型
查看>>
设计模式07_建造者
查看>>
设计模式08_适配器
查看>>
设计模式09_代理模式
查看>>
设计模式10_桥接
查看>>
设计模式11_装饰器
查看>>
设计模式12_外观模式
查看>>
设计模式13_享元模式
查看>>
设计模式14_组合结构
查看>>
设计模式15_模板
查看>>
海龟交易法则01_玩风险的交易者
查看>>
CTA策略02_boll
查看>>
vnpy通过jqdatasdk初始化实时数据及历史数据下载
查看>>
设计模式19_状态
查看>>
设计模式20_观察者
查看>>
vnpy学习10_常见坑02
查看>>
用时三个月,终于把所有的Python库全部整理了!拿去别客气!
查看>>