黑马程序员技术交流社区

标题: 求解 [打印本页]

作者: anTG    时间: 2016-11-8 23:00
标题: 求解
最近学习了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
求解

作者: hutujin    时间: 2016-11-8 23:10
静态代码块只执行一次,对象创建一次构造代码块就执行一次,执行顺序静态代码块>构造代码块>局部代码块

作者: anTG    时间: 2016-11-8 23:14
hutujin 发表于 2016-11-8 23:10
静态代码块只执行一次,对象创建一次构造代码块就执行一次,执行顺序静态代码块>构造代码块>局部代码块
...

这个顺序是知道的,先静态的话,怎么也不可能先打印2的,但是这结果...
作者: hutujin    时间: 2016-11-8 23:19
好吧,看了你的打印结果我也蒙圈了,明天用debug走下看看过程

作者: ylz1997    时间: 2016-11-8 23:26
不知道啊   感觉好迷
作者: anTG    时间: 2016-11-8 23:27
ylz1997 发表于 2016-11-8 23:26
不知道啊   感觉好迷

对啊,跟想象的不一样....
作者: anTG    时间: 2016-11-8 23:31
hutujin 发表于 2016-11-8 23:19
好吧,看了你的打印结果我也蒙圈了,明天用debug走下看看过程

debug都不知道断点往那加--
作者: 袁志娜    时间: 2016-11-8 23:50

作者: hutujin    时间: 2016-11-9 00:05
anTG 发表于 2016-11-8 23:31
debug都不知道断点往那加--

哪里不会点哪里

作者: 江江loves    时间: 2016-11-9 00:23
明天研究研究

作者: IceLoveInFire丶    时间: 2016-11-9 00:55
很明显,静态成员变量先初始化,但是第一个静态变量初始化的过程中你创建了一个新的对象,创建对象意味着什么?意味着你要执行它的构造方法,也就是说要先执行构造代码块,输出2,和初始化静态成员变量a等于110,输出3和字符串,再执行下一个静态代码块,输出1,主方法最后执行。

作者: hutujin    时间: 2016-11-9 10:35
今天用debug走了下,有多个静态成员的时候要按照顺序执行,创建对象那个代码在静态代码块上面所以先执行创建对象,如果两个换下顺序,结果又不一样了

作者: anTG    时间: 2016-11-9 16:27
执行静态代码块是第一步是不?执行完静态代码才创建对象的,你的意思是在执行静态代码块的同时再创建对象?
作者: anTG    时间: 2016-11-9 16:30
IceLoveInFire丶 发表于 2016-11-9 00:55
很明显,静态成员变量先初始化,但是第一个静态变量初始化的过程中你创建了一个新的对象,创建对象意味着什 ...

执行静态代码块是第一步是不?执行完静态代码才创建对象的,你的意思是在执行静态代码块的同时再创建对象?

作者: anTG    时间: 2016-11-9 16:32
hutujin 发表于 2016-11-9 10:35
今天用debug走了下,有多个静态成员的时候要按照顺序执行,创建对象那个代码在静态代码块上面所以先执行创 ...

不懂原因啊。。。
作者: anTG    时间: 2016-11-9 16:33
hutujin 发表于 2016-11-9 10:35
今天用debug走了下,有多个静态成员的时候要按照顺序执行,创建对象那个代码在静态代码块上面所以先执行创 ...

不懂这个原因呀。。。。。
作者: anTG    时间: 2016-11-9 16:35
hutujin 发表于 2016-11-9 10:35
今天用debug走了下,有多个静态成员的时候要按照顺序执行,创建对象那个代码在静态代码块上面所以先执行创 ...

不懂这个原因呀。。。。。你懂这是为什么不?
作者: IceLoveInFire丶    时间: 2016-11-9 21:17
你为什么执着于静态代码块第一个呢?你那个静态变量和静态代码块是同一等级的,而且哪个静态变量在静态代码块上面,所以要先给它分配内存并赋值的

作者: anTG    时间: 2016-11-9 21:53
IceLoveInFire丶 发表于 2016-11-9 21:17
你为什么执着于静态代码块第一个呢?你那个静态变量和静态代码块是同一等级的,而且哪个静态变量在静态代码 ...

那就先执行 static Test st = new Test();,就是因为它在静态代码块上边?
作者: cobblerime    时间: 2016-11-9 23:38
题主说总结的很想上课时的笔记哦。
初始化对象执行顺序不是       加载成员 ---》初始化成员-----》构造对象?
静态随类的加载而加载。
非静态随对象的建立而新建。
oracal上有Tutorials上面会有讲一点加载执行顺序。全英文。
作者: IceLoveInFire丶    时间: 2016-11-9 23:54
anTG 发表于 2016-11-9 21:53
那就先执行 static Test st = new Test();,就是因为它在静态代码块上边?

对的,不然两个静态元素 你怎么判断执行顺序?

作者: 929215141    时间: 2016-11-9 23:59
赞一个,说得很好,收藏!!!
作者: 小牛想成为大牛    时间: 2016-11-10 00:53
静态成员变量和静态代码块的加载顺序跟它在类中的先后顺序有关系的,你可以试试。同成员变量和构造代码块
作者: anTG    时间: 2016-11-10 01:00
cobblerime 发表于 2016-11-9 23:38
题主说总结的很想上课时的笔记哦。
初始化对象执行顺序不是       加载成员 ---》初始化成员-----》构造对 ...

这确实算是笔记,英文看着就头大..改天试着看看.
作者: anTG    时间: 2016-11-10 01:02
IceLoveInFire丶 发表于 2016-11-9 23:54
对的,不然两个静态元素 你怎么判断执行顺序?

受教了,真想给你一个么么哒,233333333333
作者: anTG    时间: 2016-11-10 01:06
小牛想成为大牛 发表于 2016-11-10 00:53
静态成员变量和静态代码块的加载顺序跟它在类中的先后顺序有关系的,你可以试试。同成员变量和构造代码块 ...

刚试了,确实如此,主要是这个静态成员变量是一个对象,结果就蒙蔽了
作者: IceLoveInFire丶    时间: 2016-11-10 08:04
anTG 发表于 2016-11-10 01:02
受教了,真想给你一个么么哒,233333333333

别……我不喜欢男人





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