代码块
代码块的概念以及分类
- 普通代码块
- 构造块
- 静态块
- 同步代码块
构造代码块也叫实例代码块
public class MyDate {
public int year;
public int month;
public int day;
public void setDay(int year,int month,int day) {
this.year = year;
this.month = month;
this.day = day;
}
{
System.out.println("实例代码块——定义在类的内部,和构造方法同级");
}
public void printDay(){
System.out.println(year+"-"+month+"-"+day);
}
实例代码块优先于构造方法执行,因为编译完成之后,编译器会将实例代码块中的代码拷贝到每个构造方法第一条语句前。(先静态,再实例,再不带参数的构造方法)
静态代码块
使用static定义的代码块成为静态代码块。一般用于初始化静态成员变量。
- 静态代码不管生成多少个对象,其只会执行一次。
- 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的,Java代码在经过编译器编译之后,如果要运行必须要先经过类加载子系统加载到JM中才能运行。
- 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次合并,最终放在生成的<>方法中,该方法在类加载时调用,并且只调用一次。
总结:static可以修饰成员变量,也可以修饰成员方法,也可以修饰代码块。分别变成静态的成员变量,静态成员方法,静态代码块。
内部类
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。在Java中,可以将一个类定义在另一个类或另一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的一种体现。
public class OutClass {
class InnerClass{
}
}
//OutClass是外部类
//InnerClass是内部类
定义在class类名{}外的,即使是在一个文件里,都不能称为内部类。
内部类和外部类共用一个Java源文件,但是经过编译之后,内部类会形成单独的字节码文件。
内部类可以在一个类的哪些位置进行定义?
public class OutClass {
//成员位置定义:未被static修饰——》普通内部类:
class InnerClass{
}
//被static修饰——》静态内部类
static class InnerClass2{
}
public void method(){
//方法中也可以定义内部类——局部内部类(几乎不用):
class InnerClass5{
}
}
}
根据内部类定义的位置不同,一般可以分为以下几种形式:
1.成员内部类(普通内部类和静态内部类)
2.局部内部类(不谈修饰符)匿名内部类
成员内部类
在外部类中,内部类定义位置与外部类成员所处的位置相同,因此称为成员内部类。
普通内部类:未被static修饰的成员内部类。