1.0 校招笔试题(一道)
我们先来看一道校招笔试题
class A{
//构造方法
public A(){
System.out.println("1.A(父类)的构造方法");
}
//非静态代码块
{
System.out.println("2.A(父类)的非静态代码块");
}
//静态代码块
static {
System.out.println("3.A(父类)的静态代码块");
}
}
public class B extends A{
//构造方法
public B(){
System.out.println("4.B的构造方法");
}
//非静态代码块
{
System.out.println("5.B的非静态代码块");
}
//静态代码块
static {
System.out.println("6.B的静态代码块");
}
public static void main(String[] args){
System.out.println("7.----start----");
new B();
new B();
System.out.println("8.----end----");
}
}
运行结果及分析如下图:
1.1 前语
定义: 使用"{}"定义的一段代码
根据代码块的定义的位置以及关键字,又分为一下四种:
- 普通代码块
- 构造块
- 静态代码块
- 同步代码块(先了解)
1.2 普通代码块
定义在方法中的代码块。
举例:观察普通代码块
public class Test{
public static void main(String[] args){
{
//直接使用{}定义,普通代码块
int x = 10;
System.out.println("x = " + x);
}
int x = 100;
System.out.println("x = " + x);
}
}
运行结果如下:
一般如果方法中代码块过长,为避免变量重名,使用普通代码块。(使用较少,了解概念即可)
1.3 构造块(重点)
定义在类中的代码块(不加任何修饰符)
举例:观察构造块
class Person{
{
//定义在类中,不加任何修饰符,构造块
System.out.println("1.Person类的构造块");
}
public Person()
{
System.out.println("2.Person类的构造方法");
}
}
public class Test{
public static void main(String[] args){
new Person();
new Person();
}
}
运行结果如下所示:
总结:
1.在对象产生时,优先于构造方法产生,有几个对象产生,就调用几次构造块。
2.用于在构造方法执行之前,完成一些属性的初始化操作。
1.4 静态代码块(重点)
使用static定义的代码块
根据静态代码块所在的类不同又分为以下两种类型:
- 在非主类中
- 在主类中
1.4.1 在非主类中的静态代码块
举例:观察非主类中的静态代码块
class Person{
{
//定义在类中,不加任何修饰符,构造块
System.out.println("1.Person类的构造块");
}
public Person()
{
System.out.println("2.Person类的构造方法");
}
static { //定义在非静态方法中的静态块
System.out.println("3.Person类的静态代码块");
}
}
public class Test{
public static void main(String[] args){
System.out.println("---start---");
new Person();
new Person();
System.out.println("---end---");
}
}
运行结果如下所示:
通过以上代码块我们发现:
1.在类加载时执行(啥时候用到,啥时候加载),优先于构造块执行
2.无论产生多少实例对象,静态块都只会调用一次
静态代码块的作用是:为static属性进行初始化
1.4.2 在主类中的代码块
举例:定义在主类中的代码块
public class Test{
{
System.out.println("1.Test的构造块");
}
public Test(){
System.out.println("2.Test的构造方法");
}
static {
System.out.println("3.Test的静态代码块");
}
public static void main(String[] args){
System.out.println("---start---");
new Person();
new Person();
System.out.println("---end---");
}
}
运行结果如下所示:
在主类中定义的静态代码块,优先于主方法(main)执行