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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© anTG 中级黑马   /  2016-11-8 23:00  /  1827 人查看  /  26 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

最近学习了static相关知识,
    特点:
        1.随着对象的加载而加载
        2.优先于对象存在
        3.被类的所有对象共享
        4.可以通过类名调用
            它本身也可以通过对象名调用
            推荐使用类调用
            静态修饰的内容一般我们称其为:
                与类相关的,类成员
    注意事项:
        1.在静态方法中是没有关键字的
            静态时随着类的加载而加载,this是随着对象的创建而存在
            静态比对象先存在
        2.静态方法只能访问静态的成员变量和静态的成员方法
            静态方法:
                成员变量:只能访问静态变量
                成员方法:只能访问静态成员方法
            非静态方法:
                成员变量:可以是静态的,也可以是非静态的
                成员方法:可以是静态的成员方法,也可以是非静态的成员方法
        静态只能访问静态

这输出为什么跟想的不一样呢??
        
    public class Test{
        publlic static void main(String[] args){
            Funection();
        }

        static Test st = new Test();

        static {
            System.out.println("1");        
        }

        {
            System.out.println("2");
        }

        public Test(){
            System.out.println("3");
            System.out.println("a=" + a + "b =" + b);
        }
        
        public static void Funection(){
            System.out.println("4");
        }

        int a = 110;
        static int b = 112;

    }
    打印结果结果为:
    2
    3
    a=110b =0
    1
    4
求解

26 个回复

倒序浏览
静态代码块只执行一次,对象创建一次构造代码块就执行一次,执行顺序静态代码块>构造代码块>局部代码块
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
hutujin 发表于 2016-11-8 23:10
静态代码块只执行一次,对象创建一次构造代码块就执行一次,执行顺序静态代码块>构造代码块>局部代码块
...

这个顺序是知道的,先静态的话,怎么也不可能先打印2的,但是这结果...
回复 使用道具 举报
好吧,看了你的打印结果我也蒙圈了,明天用debug走下看看过程
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
不知道啊   感觉好迷
回复 使用道具 举报
ylz1997 发表于 2016-11-8 23:26
不知道啊   感觉好迷

对啊,跟想象的不一样....
回复 使用道具 举报
anTG 中级黑马 2016-11-8 23:31:40
7#
hutujin 发表于 2016-11-8 23:19
好吧,看了你的打印结果我也蒙圈了,明天用debug走下看看过程

debug都不知道断点往那加--
回复 使用道具 举报
回复 使用道具 举报
anTG 发表于 2016-11-8 23:31
debug都不知道断点往那加--

哪里不会点哪里
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
回复 使用道具 举报
很明显,静态成员变量先初始化,但是第一个静态变量初始化的过程中你创建了一个新的对象,创建对象意味着什么?意味着你要执行它的构造方法,也就是说要先执行构造代码块,输出2,和初始化静态成员变量a等于110,输出3和字符串,再执行下一个静态代码块,输出1,主方法最后执行。
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
今天用debug走了下,有多个静态成员的时候要按照顺序执行,创建对象那个代码在静态代码块上面所以先执行创建对象,如果两个换下顺序,结果又不一样了
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
anTG 来自手机 中级黑马 2016-11-9 16:27:20
13#
执行静态代码块是第一步是不?执行完静态代码才创建对象的,你的意思是在执行静态代码块的同时再创建对象?
回复 使用道具 举报
anTG 中级黑马 2016-11-9 16:30:14
14#
IceLoveInFire丶 发表于 2016-11-9 00:55
很明显,静态成员变量先初始化,但是第一个静态变量初始化的过程中你创建了一个新的对象,创建对象意味着什 ...

执行静态代码块是第一步是不?执行完静态代码才创建对象的,你的意思是在执行静态代码块的同时再创建对象?
回复 使用道具 举报
anTG 中级黑马 2016-11-9 16:32:11
15#
hutujin 发表于 2016-11-9 10:35
今天用debug走了下,有多个静态成员的时候要按照顺序执行,创建对象那个代码在静态代码块上面所以先执行创 ...

不懂原因啊。。。
回复 使用道具 举报
anTG 中级黑马 2016-11-9 16:33:43
16#
hutujin 发表于 2016-11-9 10:35
今天用debug走了下,有多个静态成员的时候要按照顺序执行,创建对象那个代码在静态代码块上面所以先执行创 ...

不懂这个原因呀。。。。。
回复 使用道具 举报
anTG 中级黑马 2016-11-9 16:35:52
17#
hutujin 发表于 2016-11-9 10:35
今天用debug走了下,有多个静态成员的时候要按照顺序执行,创建对象那个代码在静态代码块上面所以先执行创 ...

不懂这个原因呀。。。。。你懂这是为什么不?
回复 使用道具 举报
你为什么执着于静态代码块第一个呢?你那个静态变量和静态代码块是同一等级的,而且哪个静态变量在静态代码块上面,所以要先给它分配内存并赋值的
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
anTG 中级黑马 2016-11-9 21:53:30
19#
IceLoveInFire丶 发表于 2016-11-9 21:17
你为什么执着于静态代码块第一个呢?你那个静态变量和静态代码块是同一等级的,而且哪个静态变量在静态代码 ...

那就先执行 static Test st = new Test();,就是因为它在静态代码块上边?
回复 使用道具 举报
题主说总结的很想上课时的笔记哦。
初始化对象执行顺序不是       加载成员 ---》初始化成员-----》构造对象?
静态随类的加载而加载。
非静态随对象的建立而新建。
oracal上有Tutorials上面会有讲一点加载执行顺序。全英文。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马