Java知识:恒生电子的坑爹笔试题扩展的知识

Java知识:恒⽣电⼦的坑爹笔试题扩展的知识
摘⾃论坛JAVASE板块精华帖
Java代码如下:
public class TestCodeSeg
{
static
{
System.out.println("1");
}
{
System.out.println("2");
}
public TestCodeSeg()
{
}
public static void main(String[] args)
{
new TestCodeSeg();
}
}
求输出结果
正确答案以及分析:
1和2顺序是不变的,因为它们是静态(类装载时被执⾏),3是在构造函数⾥。所以,程序执⾏顺序是静态部分然后是构造函数。
但是输出结果还要受到System.out和的影响。System.out是⾏缓冲⽽是不缓冲,所以println("3")
是⽴即输出。但System.out.println("1")和System.out.println("2")则因为缓冲的原因可能稍晚(但1和2的顺序不变)。具体输出结果1
先2后是绝对的,但3在哪⾥出现跟程序执⾏时情况有关。如果println("3")执⾏时,1和2还没输出,再是则是3先:
3
2
1
如果1已经输出但换⾏符还没输出则是:
13
2
以此类推还有:
1
3
2
等等情况
总结:
1、仔细看题,虽然这个总结很low但是还是很中肯的。
2、System.out是⾏缓冲⽽是不缓冲,看来输出顺序和是否缓冲是有很⼤关系的,这点容易忽略。
扩展:
1、静态代码块、构造代码块和普通代码块如何区分?
静态代码块:在java中使⽤static关键字声明的代码块。
构造块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。
普通代码块:在⽅法或语句中出现的{}就称为普通代码块。把普通代码块称作局部代码块可能更容易理解吧
2、构造代码块与构造⽅法哪个先执⾏,为什么?
构造代码块先执⾏。
因为构造代码块中的代码也是在构造⽅法中执⾏的。在编译时的编译器看来会默认将构造代码块中的代码移动到构造⽅法中,并且移动到构造⽅法内容的前⾯。你看到的构造⽅法的开头隐藏了⼀些东西,其中就包含了对构造代码块的调⽤。了解这⼀点其实也是挺重要的,毕竟⼀个知识学明⽩了就会记忆深刻。
另外⼀道有关执⾏顺序的题(此题是JAVASE推荐板块的):
就算你懂java有时候也会懵逼
正确答案以及分析:
2
3
a=110 b=0
1
4
别⼈的分析:
⼀开始我也猜错了,但是后来想通了,之前总以为调⽤构造函数之前必须完成类的初始化,其实不⼀定。
可以从类的⽣命周期和对象的初始化来分析:
1.类的⽣命周期是:加载->验证->准备->解析->初始化->使⽤->卸载,只有在准备阶段和初始化阶段才会涉及类变量的初始化和赋值,因此只针对这两个阶段进⾏分析;
2.类的准备阶段需要做是为类变量分配内存并设置默认值,因此类变量st为null、b为0;(需要注意的
是如果类变量是final在加载阶段就已经完成了初始化,可以把b设置为final试
3.类的初始化阶段需要做是执⾏类构造器(类构造器是编译器收集所有静态语句块和类变量的赋值语句按语句在源码中的顺序合并⽣成类构造器,对象的构造⽅法是init,类的构造我的分析:
我认为关键在于 Static StaticTest st=new StaticTest();这句话。
先说⼀下执⾏顺序:
先final初始化(没有final就算了,不过可以把int a改成final int a试试有奇效),然后static初始化顺序由上到下,他在初始化Static StaticTest st=new StaticTest();
这句话的时候发⽣了实例化!我当时就懵了!此时有两种想法:1、先实例化(此时实例化⽤到的数据是尚未初始化完全的数据,是JVM分配的默认值)再初始化;2、先初始化再根据输出来看是第⼀种,确切的说是JAVA类可以没初始化完全的时候就进⾏实例化。
简单说:JAVA类可以没初始化完全的时候就进⾏实例化。
01. public class StaticTest {
01.
01. public static int k = 0;// 1
01. public static StaticTest s1 = new StaticTest("s1");// 2
01. public static StaticTest s2 = new StaticTest("s2");// 3
01. public static int i = print("i");// 4
电磁炉热水器
01. public static int n = 99;// 5
01. public int j = print("j");// 6
01.
01.    {
01.        print("构造块");
01.    }// 7
伸缩杆
01.
01. static {
01.        print("静态块");
01.    }// 8
01.
01. public static int print(String s) {
01.        System.out.println(++k + ":" + s + "\ti=" + i + "\tn=" + n + "\tprint");
01.        ++n;
01. return ++i;
01.    }
01.
01. public StaticTest(String s) {
另克01.        System.out.println(++k + ":" + s + "\ti=" + i + "\tn=" + n
01.                + "\tStaticTest");时钟显示器
01.        ++i;
01.        ++n;
01.    }// 9
01.
01. public static void main(String[] args) {
01. new StaticTest("init");
01.    }
01. }
执⾏结果
01. /**
01.      *
01.      * 输出结果:
01.      *
01.      * syso1 ===="1:j      i=0    n=0    print"
01.      *
01.      * syso2 ===="2:构造块    i=1    n=1    print"
01.      *
01.      * syso3 ===="3:s1      i=2    n=2    StaticTest"
01.      *
01.      * syso4 ===="4:j      i=3    n=3    print"
01.      *
01.      * syso5 ===="5:构造块    i=4    n=4    print"
01.      *
01.      * syso6 ===="6:s2      i=5    n=5    StaticTest"
01.      *
01.      * syso7 ===="7:i      i=6    n=6    print"
01.      *
01.      * syso8 ===="8:静态块    i=7    n=99    print"
01.      *低重心脚轮
01.      * syso9 ===="9:j      i=8    n=100  print"
01.      *
01.      * syso10===="10:构造块    i=9        n=101  print"
01.      *
01.      * syso11===="11:init i=10  n=102  StaticTest"
01.      */
⽹上分析很多,⼀下能到很多,但是关键点我罗列⼀下:
1、JAVA类可以没初始化完全的时候就进⾏实例化。⽐如下⾯两⾏代码:
01. public static StaticTest s1 = new StaticTest("s1");// 2
瓦特连杆01. public static StaticTest s2 = new StaticTest("s2");// 3
就是因为他们其余的static没有来得及初始化就实例化s1,s2了。其实本质上还是static的顺序问题,s1和s2都是static⾥⾯的,他们和其余的static是要看先后顺序的,s1和s2还没有实例化完是轮不到下⾯的static代码执⾏的。
2、明⽩初始化与实例化各⾃执⾏哪些代码,更早的准备阶段(属于类加载⾥⾯的内容)所执⾏内容
也增加上。
准备阶段:为变量等分配空间以及赋JVM初值、final代码
初始化:static代码(static变量、static代码块)
实例化:⾮static代码(⾮static、⾮final变量、普通代码块、构造⽅法(最后执⾏))
各位看官是否知道这个博客怎么排版⽐较好吗,⽤MarkDown编辑器?

本文发布于:2024-09-20 19:53:57,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/279418.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:代码   构造   顺序   变量   阶段   实例
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议