A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 封号了... 中级黑马   /  2013-8-8 15:30  /  1447 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一般来说在类加载的时候是先加载静态的再加载非静态的,所以静态不能访问非静态的
但是是不是跟单例模式有矛盾呢:
        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());
        }
}
求解释!

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

2 个回复

倒序浏览
第一个问题;静态变量是在类加载时初始化,实例变量是在实例化(new)一个对象时才会初始化所以静态成员不能访问非静态成员,因为非静态成员有可能没有实例化。
这里private static NumberMachine instance = new NumberMachine();实例化一个对象,不是访问非静态成员。
第二个问题:static成员和 块 的初始化顺序遵循其在类中的定义顺序。
你的第二部分展示的代码是先初始化mx=0,然后在初始化Date的时候又修改了他的值。
如果按照你所说的调换两行代码的顺序,就成了先初始化DAte,mx先为7,后又改为了0。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马