黑马程序员技术交流社区

标题: 关于静态不能访问动态的问题 [打印本页]

作者: 封号了...    时间: 2013-8-8 15:30
标题: 关于静态不能访问动态的问题
一般来说在类加载的时候是先加载静态的再加载非静态的,所以静态不能访问非静态的
但是是不是跟单例模式有矛盾呢:
        private NumberMachine() {
        }

        private static NumberMachine instance = new NumberMachine();

        public static NumberMachine getInstance() {
                return instance;
        }
再看看下面这个问题:
class Date {
       
        // 下面两行代码换位置结果就会出现不同
        private static int mx = 0;
        private static final Date mInstance = new Date();

        private Date() {
                System.out.println("mx=" + mx);
                mx = getVersion();
        }

        public static Date getInstance() {
                return mInstance;
        }

        public int getVersion() {
                int v = 0;
                if (v == 0) {
                        v = 7;
                }
                return v;
        }

        public int getmx() {
                return mx;
        }
}

public class TestStatic {

        public static void main(String args[]) {
                System.out.println(Date.getInstance().getmx());
        }
}
求解释!
作者: 王清华0    时间: 2013-8-8 16:54
第一个问题;静态变量是在类加载时初始化,实例变量是在实例化(new)一个对象时才会初始化所以静态成员不能访问非静态成员,因为非静态成员有可能没有实例化。
这里private static NumberMachine instance = new NumberMachine();实例化一个对象,不是访问非静态成员。
第二个问题:static成员和 块 的初始化顺序遵循其在类中的定义顺序。
你的第二部分展示的代码是先初始化mx=0,然后在初始化Date的时候又修改了他的值。
如果按照你所说的调换两行代码的顺序,就成了先初始化DAte,mx先为7,后又改为了0。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2