`
Everyday都不同
  • 浏览: 714054 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

面试系列(一):代码的执行顺序

阅读更多

开始这个系列是因为想总结一下面试中比较常见的考点。。不喜勿喷~~~~~~

 

1、静态代码块、构造代码块、普通代码块和构造函数的执行顺序

静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。

构造代码块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。

普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”

构造函数:也称构造器,和类同名,没有返回类型。(void也没有)

 

那么他们的执行顺序如何呢?用一个小例子可以了解~

 

class A {
	{
		System.out.println("我是构造代码块=======");
	}
	
	static {
		System.out.println("我是静态代码块=======");
	}
	
	A() {
		System.out.println("我是构造函数=========");
	}
	
	public void test() {
		System.out.println("我是普通代码块=========");
	}

        public static void main(String[] args) {
		System.out.println("我是main普通代码块=========");
	}
}

我们先运行A本身:

我是静态代码块=======

我是main普通代码块=========

 

我们再用另一个类调用下:

 

 

		A a = new A();
		a.test();
		System.out.println();
		A a1 = new A();
		a1.test();

 打印结果:

 

我是静态代码块=======

我是构造代码块=======

我是构造函数=========

我是普通代码块=========

 

我是构造代码块=======

我是构造函数=========

我是普通代码块=========

 

由此可见:每个类的静态代码块只会执行一次,无论你初始化多少次;而构造代码块、构造函数是每初始化一次就执行一次的。

执行顺序:静态代码块>构造代码块>构造方法>main方法(构造代码块和构造方法只有在被初始化的时候才会调用)

 

2、构造函数与继承

每个类都有一个默认的构造函数(不带参数),可以不用定义;但是当你重载了一个带参的构造函数,则默认的构造函数将会被覆盖,如果你想同时拥有默认的构造器和重载的带参的构造器,则默认构造器必须定义出来。

而构造函数的继承也是常见考点~也是比较蛋疼的地方。。

 

class Aoo {
	public Aoo() {
		System.out.println("Aoo 默认构造器");
	}
	
	public Aoo(int i) {
		System.out.println("Aoo 带参构造器:" + i);
	}
	
	public void test() {
		System.out.println("Aoo 的test方法");
	}
	
	public void test(int i) {
		System.out.println("Aoo 的test带参方法:" + i);
	}
}

class Boo extends Aoo{
	public Boo() {
		System.out.println("Boo 默认构造器");
	}
	
	public Boo(int i) {
		System.out.println("Boo 带参构造器:" + i);
	}
	
	public void test() {
		System.out.println("Boo 的test方法");
	}
	
	public void test(int i) {
		System.out.println("Boo 的test带参方法:" + i);
	}
}

 我们再调用:

 

Boo boo = new Boo();//或Aoo boo = new Boo(); 结果都一样
boo = new Boo(1);
boo.test();
boo.test(1);

 打印结果:

Aoo 默认构造器

Boo 默认构造器

Aoo 默认构造器

Boo 带参构造器:1

Boo 的test方法

Boo 的test带参方法:1

 

说明:

1)子类永远会默认继承父类的默认(不带参)的构造函数,子类每初始化一次,必然会调用一次父类的不带参的默认构造器。

2)当子类和父类都有相同方法声明的函数时,具体调用子类还是父类的方法是看初始化的谁,例如本例中是new B,而与变量类型无关;

 

3、重载和重写

重载:在一个类里,方法名相同,方法声明不同(参数声明不同,返回值类型也可能不同);

重写:涉及继承,子类和父类拥有相同的方法名和方法声明,返回值类型必须是父类对应方法返回类型的子类。

重载是一个类里的多态性,重写是子类和父类的多态性体现~

 

我们先定义2个父子类:

 

class Super {
	public void t() {
		System.out.println("Super t()");
	}
} 

class Sub extends Super {
	public void t() {
		System.out.println("Sub t()");
	}
}

 这里Sub子类重写了父类的t()方法,

我们再定义一个类,里面有重载的2个方法:

 

class Goo {
	public void test(Super obj) {
		System.out.println("test Super");
		obj.t();
	}
	
	public void test(Sub obj) {
		System.out.println("test Sub");
		obj.t();
	}
}

 再调用:

 

		Goo goo = new Goo();
		Super obj = new Sub();
		goo.test(obj);

 

打印结果:

test Super

 

Sub t()

这说明:

1)Goo类里有重载的test方法,goo.test(obj);里的参数obj的类型是Super,所以调用的是Goo的第一个test方法;所以打印出:test Super

2)虽然Super obj = new Sub();但调用涉及重写的方法时,看的是真正实例化的类,这里虽然用父类Super定义,但实例化的是子类Sub,所以调用的子类的t()方法~

 

 

 

0
0
分享到:
评论

相关推荐

    js代码-面试题10: js执行顺序

    js代码-面试题10: js执行顺序

    Java常见笔试、面试题目深度剖析,方法重写详解、静态代码块与构造方法执行顺序问题

    Java常见笔试、面试题目深度剖析,方法重写详解、静态代码块与构造方法执行顺序问题

    程序员代码面试指南:IT名企算法与数据结构题目最优解(第2版)书上源码.zip

    算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生...

    java面试题之try中含return语句时代码的执行顺序详解

    主要介绍了关于java中的一道面试题,这套题就是在try中含return语句时代码的执行顺序,这个问题看似简单,却暗藏杀机啊!文中通过一个个例子详细介绍了其中玄机,需要的朋友可以参考学习,下面来一起看看吧。

    【剑指offer】面试题4-二维数组中的查找-完整的可执行代码(Java)

    在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 解题...

    Java工程师面试复习指南

    代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO流 多线程 深入理解内部类 javac和javap Java8新特性终极...

    多线程面试相关知识点

    一个程序实现多个代码同时交替运行就需要产生多个线程 CPU随机的抽出时间,让我们的程序一会做这件事情,一会做另外一件事情 同其他大多数编程语言不同,Java内置支持多线程编程(multithreaded programming)...

    java面试800题

    类初始化时构造函数调用顺序: (1)初始化对象的存储空间为零或null值; (2)调用父类构造函数; (3)按顺序分别调用类成员变量和实例成员变量的初始化表达式; (4)调用本身构造函数。" Q0053 "Public ...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO流 多线程 深入理解内部类 javac和javap Java8新特性终极...

    C/C++笔试题(附答案,华为面试题系列)

    答:线程通常被定义为一个进程中代码的不同执行路线。从实现方式上划分,线程有两 种类型:“用户级线程”和“内核级线程”。 用户线程指不需要内核支持而在用户程序 中实现的线程,其不依赖于操作系统核心,应用...

    Java并发面试题整理(答案)

    有序性,即程序的执行顺序按照代码的先后顺序来执行。 2、实现可见性的方法有哪些? synchronized 或者 Lock:保证同一个时刻只有一个线程获取锁执行代码,锁释放之前把最新的值刷新到主内存,实现可见性。 3、多...

    java面试题

    select执行顺序? 答:from where group by having select order by Collection和Collections的区别? 答:Collection是集合类的父类,继承它的主要由set和list Collections是针对集合类的帮助类,它提供了一...

    java面试题(面试 宝典)

    11. 继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么? 11 12. 内部类的实现方式? 12 13. 用JAVA实现一种排序,JAVA类实现序列化的方法(二种)? 13 14. 如在COLLECTION框架中,实现比较要实现什么样的...

    【。net 专业】 面试题

    在这个应用程序的每一页中添加一个Page指示符去处理ASP.NET 代码错误。  F. 在这个应用程序的每一页中添加一个Page指示符去处理ASP.NET HTTP错误。 24.您的公司有一个DB Server,名为AllWin,其上装了MS SQL...

    【剑指offer】面试题6-从头到尾打印链表-完整的可执行代码(Java)

    题目描述: 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 解题思路参考:https://blog.csdn.net/flower_48237/article/details/104034942

    程序员代码面试指南——IT名企算法和数据结构题目最优解.zip

    算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生...

    Java面试宝典-经典

    这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的...

    Java面试宝典2010版

    这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的...

    c.c++找工作面试重点结构图-mindmanager

    c.c++找工作面试重点结构图-mindmanager 13字符串 13.1字符串字面量 13.2字符串变量 13.3字符串的读写 13.4访问字符串中的字符 13.5C语言的字符库 13.6字符串惯用法 13.7字符串数组 ......... 17指针的高级...

    涵盖了90%以上的面试题

    finally块中的代码什么时候被执行 Java中的异常处理机制的简单原理和应用。 java socket java序列化 JVM加载class文件的原理 双亲委派模型 为什么要自定义类加载器 如何自定义类加载器 什么是GC 内存泄漏和内存溢出...

Global site tag (gtag.js) - Google Analytics