java中的几种代码块
2017-03-12 00:15
67 查看
今天找工作笔试碰见一道有意思的题目,问题很简单:
一下没想起来,事后复习了下,
这道题目涉及到java的几种代码块:普通代码块、构造代码块、静态代码块和父子继承的关系
一、我们先来看看这三种代码块:
//执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。
其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。
下面我们来分别运行实验
1 普通代码块
2 构造代码块
3 静态代码块
当父类与子类都有静态代码块和构造函数的时候,执行顺序如下:
父类静态代码块 > 子类静态代码块 Java虚拟机加载类时,就会执行该块代码。
父类构造函数 > 子类构造函数 (先有父亲,后有孩子)
如果是多级继承关系的话,高层的父类首先执行,然后依次递减
总结:静态优先执行,父类优先于子类执行
静态代码块是在JVM加载类的时候执行的,而且静态代码块执行且仅执行一次
public class A { public A() { System.out.println("调用了A的构造函数"); } {System.out.println("A的代码块");} static{System.out.println("A的静态代码块");} } public class B extends A { public B() { System.out.println("调用了B的构造函数"); } {System.out.println("B的代码块");} static{System.out.println("B的静态代码块");} public static void main(String[] args) { B b = new B(); } }
请问执行main的结果~
执行的结果应该为:
A的静态代码块 B的静态代码块 A的内置代码块 调用了A的构造函数 B的内置代码块 调用了B的构造函数
一下没想起来,事后复习了下,
这道题目涉及到java的几种代码块:普通代码块、构造代码块、静态代码块和父子继承的关系
一、我们先来看看这三种代码块:
//执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。
其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。
下面我们来分别运行实验
1 普通代码块
//普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行” public class BasicCodeblock{ public static void main(String[] args){ { int x=3; System.out.println("1,普通代码块内的变量x="+x); } int x=1; System.out.println("主方法内的变量x="+x); { int y=7; System.out.println("2,普通代码块内的变量y="+y); } } } /* 运行结果: 1,普通代码块内的变量x=3 主方法内的变量x=1 2,普通代码块内的变量y=7 */
2 构造代码块
//构造块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。 public class ConstructCodeBlock { { System.out.println("第一代码块"); } public ConstructCodeBlock() { System.out.println("构造方法"); } { System.out.println("第二构造块"); } public static void main(String[] args) { new ConstructCodeBlock(); System.out.println("============="); new ConstructCodeBlock(); System.out.println("============="); new ConstructCodeBlock(); } } /* 运行结果: 第一代码块 第二构造块 构造方法 ============= 第一代码块 第二构造块 构造方法 ============= 第一代码块 第二构造块 构造方法 */
3 静态代码块
//静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。 //如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。 //注意:1 静态代码块不能存在于任何方法体内。2 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。 public class StaticCodeBlock { { System.out.println("Code的构造块"); } static { System.out.println("Code的静态代码块"); } public StaticCodeBlock() { System.out.println("Code的构造方法"); } } class StaticCodeBlock2 { { System.out.println("Code2的构造块"); } static { System.out.println("Code2的静态代码块"); } public StaticCodeBlock2() { System.out.println("Code2的构造方法"); } public static void main(String[] args) { System.out.println("Code2的主方法"); System.out.println("============="); new StaticCodeBlock(); System.out.println("============="); new StaticCodeBlock(); System.out.println("============="); new StaticCodeBlock2(); System.out.println("============="); new StaticCodeBlock2(); System.out.println("============="); } } /* 运行结果: Code2的静态代码块 Code2的主方法 ============= Code的静态代码块 Code的构造块 Code的构造方法 ============= Code的构造块 Code的构造方法 ============= Code2的构造块 Code2的构造方法 ============= Code2的构造块 Code2的构造方法 ============= */二、再来讨论父子继承的关系
当父类与子类都有静态代码块和构造函数的时候,执行顺序如下:
父类静态代码块 > 子类静态代码块 Java虚拟机加载类时,就会执行该块代码。
父类构造函数 > 子类构造函数 (先有父亲,后有孩子)
如果是多级继承关系的话,高层的父类首先执行,然后依次递减
总结:静态优先执行,父类优先于子类执行
静态代码块是在JVM加载类的时候执行的,而且静态代码块执行且仅执行一次
相关文章推荐
- 几种排序算法JAVA代码
- 几种常见排序算法的Java代码实现
- 几种简单的负载均衡算法及其 Java 代码实现
- 几种简单的负载均衡算法及其Java代码实现
- 负载均衡的几种算法Java实现代码
- java Web 启动时自动执行代码的几种方式
- java Web 启动时自动执行代码的几种方式
- 几种简单的负载均衡算法及其Java代码实现
- JAVA遍历map的几种实现方法代码
- Java代码重构的几种模式
- java Web 启动时自动执行代码的几种方式
- 几种简单的负载均衡算法及其Java代码实现
- 几种简单的负载均衡算法及其Java代码实现
- 分享下Java的几种注释语言吧!(代码生手顶下!)
- java 向txt中写入字符串的几种方式效率测试代码
- 几种java网络编程客户端的代码
- java连接几种数据库的代码
- 几种简单的负载均衡算法及其Java代码实现
- 几种简单的负载均衡算法及其Java代码实现
- java在代码中获取Spring的bean的几种方式