开始这个系列是因为想总结一下面试中比较常见的考点。。不喜勿喷~~~~~~
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()方法~
相关推荐
js代码-面试题10: js执行顺序
Java常见笔试、面试题目深度剖析,方法重写详解、静态代码块与构造方法执行顺序问题
算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生...
主要介绍了关于java中的一道面试题,这套题就是在try中含return语句时代码的执行顺序,这个问题看似简单,却暗藏杀机啊!文中通过一个个例子详细介绍了其中玄机,需要的朋友可以参考学习,下面来一起看看吧。
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 解题...
代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO流 多线程 深入理解内部类 javac和javap Java8新特性终极...
一个程序实现多个代码同时交替运行就需要产生多个线程 CPU随机的抽出时间,让我们的程序一会做这件事情,一会做另外一件事情 同其他大多数编程语言不同,Java内置支持多线程编程(multithreaded programming)...
类初始化时构造函数调用顺序: (1)初始化对象的存储空间为零或null值; (2)调用父类构造函数; (3)按顺序分别调用类成员变量和实例成员变量的初始化表达式; (4)调用本身构造函数。" Q0053 "Public ...
代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO流 多线程 深入理解内部类 javac和javap Java8新特性终极...
答:线程通常被定义为一个进程中代码的不同执行路线。从实现方式上划分,线程有两 种类型:“用户级线程”和“内核级线程”。 用户线程指不需要内核支持而在用户程序 中实现的线程,其不依赖于操作系统核心,应用...
有序性,即程序的执行顺序按照代码的先后顺序来执行。 2、实现可见性的方法有哪些? synchronized 或者 Lock:保证同一个时刻只有一个线程获取锁执行代码,锁释放之前把最新的值刷新到主内存,实现可见性。 3、多...
select执行顺序? 答:from where group by having select order by Collection和Collections的区别? 答:Collection是集合类的父类,继承它的主要由set和list Collections是针对集合类的帮助类,它提供了一...
11. 继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么? 11 12. 内部类的实现方式? 12 13. 用JAVA实现一种排序,JAVA类实现序列化的方法(二种)? 13 14. 如在COLLECTION框架中,实现比较要实现什么样的...
在这个应用程序的每一页中添加一个Page指示符去处理ASP.NET 代码错误。 F. 在这个应用程序的每一页中添加一个Page指示符去处理ASP.NET HTTP错误。 24.您的公司有一个DB Server,名为AllWin,其上装了MS SQL...
题目描述: 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 解题思路参考:https://blog.csdn.net/flower_48237/article/details/104034942
算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生...
这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的...
这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的...
c.c++找工作面试重点结构图-mindmanager 13字符串 13.1字符串字面量 13.2字符串变量 13.3字符串的读写 13.4访问字符串中的字符 13.5C语言的字符库 13.6字符串惯用法 13.7字符串数组 ......... 17指针的高级...
finally块中的代码什么时候被执行 Java中的异常处理机制的简单原理和应用。 java socket java序列化 JVM加载class文件的原理 双亲委派模型 为什么要自定义类加载器 如何自定义类加载器 什么是GC 内存泄漏和内存溢出...