目录
代码块
普通代码块
构造代码块
静态代码块
内部类
成员内部类
普通内部类
静态内部类
局部内部类
代码块
使用“{}”定义的一段代码成为代码块,代码块分为普通代码块、构造代码块、匿名代码块、同步代码块。
普通代码块
定义在方法中的代码,普通代码块中定义的变量仅能在代码块中使用
public class TestDemo3 {
public static void main(String[] args) {
{
int x = 10;
System.out.println("x1 = " + x);
}
int x = 100;
System.out.println("x2 = " + x);
}
}
如下图所示,普通代码块中定义的变量仅在代码块中生效
构造代码块
定义在类中的额代码块称为构造代码块(实例代码块),构造代码块一般用于初始化实例成员变量。
public class TestDemo4 {
//实例成员变量
private String name;
private int age;
private String sex;
public TestDemo4() {
System.out.println("构造方法初始化");
}
//实例代码块
{
this.name = "啊~";
this.age = 10;
this.sex = "男";
System.out.println("实例代码块初始化");
}
public void show() {
System.out.println("name=" + this.name +
",age=" + this.age +
",sex=" + this.sex);
}
public static void main(String[] args) {
TestDemo4 t1 = new TestDemo4();
t1.show();
}
}
实例代码块优先于构造方法执行,因为编译完成后,编译器会将实例代码块的代码拷贝到每个构造方法第一条语句前。
静态代码块
使用static定义的代码块成为静态代码块,一般用于初始化静态成员变量
public class TestDemo4 {
//实例成员变量
private String name;
private int age;
private String sex;
private static String className;
public TestDemo4() {
System.out.println("构造方法初始化");
}
//实例代码块
{
this.name = "啊~";
this.age = 10;
this.sex = "男";
System.out.println("实例代码块初始化");
}
//静态代码块
static {
className = "计201";
System.out.println("静态代码块执行");
}
public static void main(String[] args) {
System.out.println("=======t1=======");
TestDemo4 t1 = new TestDemo4();
System.out.println("=======t2=======");
TestDemo4 t2 = new TestDemo4();
}
}
· 静态代码块无论new多少个对象,都只会执行一次
· 静态成员变量是类的属性,在JVM加载类开辟空间时就会初始化静态成员变量
· 如果一个类中包含多个静态代码块,编译器会按照编译的先后次序来合并放在生成的<init>方法中,该方法在类加载时调用,且只执行一次
· 实例代码块只有在创建对象时才会执行
内部类
例如下述代码所示,OutClass是InnerClass的外部类,InnerClass是OutClass的外部类。内部类和外部类共用一个java源文件,但编译过后,内部类会形成单独的字节码文件
public class OutClass {
class InnerClass {
}
}
成员内部类
在外部类中,内部类定义的位置与外部类成员所处的位置相同,称该内部类为成员内部类
普通内部类
未被static修饰的成员内部类称为普通内部类
public class OutClass {
private int a;
static int b;
int c;
public void methodA() {
a = 10;
System.out.println("a=" + a);
}
public void methodB() {
System.out.println("b=" + b);
}
//成员内部类,未被static修饰
class InnerClass {
int c;
//在内部类中可以直接访问外部类中修饰任意访问限定符修饰的成员变量
public void innerMethod() {
a = 100;
b = 200;
methodA();
methodB();
//如果外部类与内部类成员变量名相同,优先访问内部类的
c = 300;
System.out.println("c=" + c);
//如果要访问外部类同名成员变量时,要使用外部类名称.this.同名成员名字
System.out.println(OutClass.this.c);
}
}
public static void main(String[] args) {
//外部类,对象的创建以及成员的访问
OutClass outClass = new OutClass();
System.out.println(outClass.a);
System.out.println(outClass.b);
System.out.println(outClass.c);
outClass.methodA();
outClass.methodB();
System.out.println("==========内部类的访问=========");
//要访问内部类中的成员,就要先创建内部类对象
//普通内部类定义与外部类成员定义位置相同,因此创建普通内部类对象时必须借用外部类对象
OutClass.InnerClass innerClass1 = new OutClass().new InnerClass();
//也可以先将外部类对象创建出来,再创键内部类对象
OutClass.InnerClass innerClass2 = outClass.new InnerClass();
innerClass2.innerMethod();
}
}
对于普通内部类的总结
1、外部类中的任何成员都可以在普通内部类中被使用
2、普通内部类与外部类成员变量所处位置相同,因此也受public、private等修饰限定符的限制
3、在内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类的成员需要使用外部类名称.this.成员变量名
4、要创建普通内部类对象,必须先创建外部类对象
5、外部类不能直接访问内部类的成员变量,如果要访问,必须先创建内部类对象
静态内部类
被static修饰的内部成员类称为静态内部类
public class TestOutClass {
private int a;
static int b;
public void methodA() {
a = 100;
System.out.println("a = " + a);
}
public static void methodB() {
b = 200;
System.out.println("b = " + b);
}
//静态内部类,被static修饰的成员内部类
static class TestInnerClass {
public void innerMethod() {
//在静态内部类中只能访问外部类的静态成员变量
//System.out.println(a); //报错,无法访问非静态成员变量
System.out.println(b);
//methodA(); //报错,无法访问非静态成员方法
methodB();
}
}
public static void main(String[] args) {
//静态内部类对象的创建与其成员的访问
TestOutClass.TestInnerClass innerClass = new TestOutClass.TestInnerClass();
innerClass.innerMethod();
}
}
对于静态内部类的总结
1、在静态内部类中只能访问外部类的静态成员变量或方法
2、创建静态内部类对象时不需要先创建外部类对象
局部内部类
定义在外部类的方法体或{}中,该种内部类只能在其定义的位置使用
public class OutClass1 {
int a = 10;
public void method() {
int b = 10;
//局部内部类,定义在方法体内部
//不能被public private等限定符修饰
class InnerClass1 {
public void innerClassMethod() {
System.out.println(a);
System.out.println(b);
}
}
InnerClass1 innerClass1 = new InnerClass1();
innerClass1.innerClassMethod();
}
}
局部内部类只能在方法体内部使用,不能被修饰限定符所修饰