就算你懂java有时候也会懵逼

yuanhang926 2016-02-29 10:29:24
加精
猜一下输出顺序和a,b的值

...全文
20335 147 打赏 收藏 转发到动态 举报
写回复
用AI写文章
147 条回复
切换为时间正序
请发表友善的回复…
发表回复
iam3600146 2019-01-09
  • 打赏
  • 举报
回复
引用 151 楼 头部文件 的回复:
[quote=引用 6 楼 Stluny 的回复:]
结果是输出了 1和4 其他没输出?
弱弱的问下 下面两句的区别

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


为啥2没输出啊? 加不加static区别在哪?

类中
静态初始化都比动态早
静态属性 快于静态代码块
普通代码块顺序执行
但是这是在main方法外
程序已经结束了 自然不会执行[/quote]

我认为静态块编译时就完成了,动态块要运行时才执行
头部文件 2019-01-06
  • 打赏
  • 举报
回复
引用 6 楼 Stluny 的回复:
结果是输出了 1和4 其他没输出?
弱弱的问下 下面两句的区别

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


为啥2没输出啊? 加不加static区别在哪?

类中
静态初始化都比动态早
静态属性 快于静态代码块
普通代码块顺序执行
但是这是在main方法外
程序已经结束了 自然不会执行
weixin_44365733 2019-01-02
  • 打赏
  • 举报
回复
一开始以为时2,4,好吧,还是理解不到位
qq_39704122 2018-12-19
  • 打赏
  • 举报
回复
RUA好多鱼~ 2018-12-06
  • 打赏
  • 举报
回复
学习了
Turning_back 2018-10-25
  • 打赏
  • 举报
回复
还没学到位,完全懵逼
lidapeng_ 2018-10-17
  • 打赏
  • 举报
回复
一脸懵逼呃呃呃
2dot5 2018-10-17
  • 打赏
  • 举报
回复
来这里看看 2dot5
qq_39936465 2018-10-17
  • 打赏
  • 举报
回复
这个程序是在搞 静态和构造,当程序开始时 优先 执行 静态 部分,静态部分的第一句是 static StaticTest st = new StaticTest(); 静态构造, 因为静态在程序中只 执行一次,所以在执行静态构造初始化本身时反而不会再被执行,只有非静态部分执行,执行完构造后再按顺序执行其他静态部分,最后是main。 这里搞得是静态部分在程序中只执行一次的概念,而非静态部分可以被反复执行。
aptx1048576 2018-08-05
  • 打赏
  • 举报
回复
1.静态初始化,到static StaticTest st = new StaticTest();此时开始创建StaticTest对象。
2.st的动态初始化:首先输出在最上面的2
3.st的动态初始化:初始化a = 100
4.st对象创建(调用构造方法):执行构造方法,输出3,b没初始化,输出a=100b=0
5.静态初始化,输出静态代码块中的1(你可以理解为234是另外一个栈【用于创建对象的栈】,好的现在方法返回了,要继续执行了)
6.静态初始化:b = 112(没有体现在答案中)
7.执行main方法:输出4


综上所述:答案是
2
3
a=100b=0
1
4
qq_42848936 2018-08-01
  • 打赏
  • 举报
回复
请问应该怎么看懂基础的代码... 我看不懂
黄什么 2018-07-31
  • 打赏
  • 举报
回复
2
3
a = 110, b = 0
1
4

----------------------------

难点:
1.静态变量的赋值是在逐行执行的,如果在赋值语句前使用静态变量的话,只会取到该类型的初始值
2.初始化对象的时候,执行非静态代码块->初始化(赋值)非静态变量->构造函数


「已注销」 2018-07-31
  • 打赏
  • 举报
回复
package com.zty.day_9.exercise;

public class Test {
public static void main(String[] args) {
staticFunction();
}
static {
System.out.println("1");
}
int a =110;
static int b = 112;
static Test ts = new Test();
{
System.out.println("2");
}
Test(){
System.out.println("3");
System.out.println("a="+a+",b="+b);
}
private static void staticFunction() {
System.out.println("4");
}
}

由于staticTest比较辣眼睛我改成了Test
代码调一下顺序,输出结果就变成是
1
2
3
a=110,b=112
4
应该是类加载静态块和静态属性,但是加载时按照顺序结构加载的,源代码时先加载new的静态类,所以先调用了构造块和构造器
此时静态属性b还未赋值,只是初始化0;所以构造器调用后b=0;
按照我改的顺序之后,先初始化静态块和静态属性,在给静态属性赋值即b=112,然后static Test ts = new Test();之后b=112
幽饮烛 2018-07-20
  • 打赏
  • 举报
回复
不猜,这样写代码会被打死的。
qq_41470495 2018-07-20
  • 打赏
  • 举报
回复
引用 4 楼 qq_26946497 的回复:

我先猜一猜
首先,加载static块预读寻找static方法
所以有1
然后顺序初始化static属性值,所以有3,a=0b=0
初始化完成后进入main方法,输出4

=====
有个疑问
staticTest(){
System.out.println();
}
这直接写在类里面的代码片段是怎么回事?不是说应该用代码块圈起来吗
{
//代码块
}
你说的那块是个方法啊。
七脉 2018-07-19
  • 打赏
  • 举报
回复
静态预加载/代码块优先加载。答案1234
七脉 2018-07-19
  • 打赏
  • 举报
回复
看到代码写成这样,我想打人。
weixin_42737505 2018-07-19
  • 打赏
  • 举报
回复
2314
a =110, b=0
SwTesting 2018-07-12
  • 打赏
  • 举报
回复
看来关键就在:
static StaticTest st = new StaticTest(); 和 static int b = 201;
这两句上啊。
SwTesting 2018-07-12
  • 打赏
  • 举报
回复
引用 62 楼 baidu_35807870 的回复:
2
3
a=110 b= 112
1
4

你们都是b=0 吗?为什么我的输出B=112?

public static void main(String[] args) {
staticFuntion();
}

static UtilDate st = new UtilDate();

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

UtilDate(){
System.out.println("3");
System.out.println("a=" + a + " b= " + b);
}

public static void staticFuntion(){
System.out.println("4");
}

int a = 110;
public int b = 112;


因为你最后一行写错了,不是public,是static啊
加载更多回复(127)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧