嵌套类

定义在另一个类中的类,就叫嵌套类。

在嵌套类外层的累,称为:外部类

最外层的外部类,称为:顶级类

嵌套类又分为:内部类和静态嵌套类。

内部类

没有被static修饰的嵌套类,非静态嵌套类。

//外部类又是顶级类
public class Person {
private int age;
//内部类
public class Hand {
private int weight;
}
}

跟实例变量、实例方法一样,内部类与外部类的实例相关联。

必须先创建外部类实例,然后再用外部类实例创建内部类实例。

//必须先创建person实例,才能创建hand对象。
Person person = new Person()
Hand hand = person.new Hand();
内部类不能定义除编译时常量(static final)以外的任何static成员。
内部类可以直接访问外部类中的所有成员(即使被申明为private)
外部类可以直接访问内部类实例的成员变量、方法(即使被申明为private)
public class Company {
private String name;
public Company (String name) {
this.name = name;
}
public void fire(Employee e) {
System.out.println(this.name + "fire" + e.no);
}
public class Employee {
private int no;
public Employee(int no) {
this.no = no;
}
public void show() {
System.out.println(Company.this.name + ":" + this.no);
}
}
}
Company company = new Company("阿里巴巴");Employee employee = company.new Employee(100);company.fire(employee);employee.show();

打印结果:

阿里巴巴fire100

阿里巴巴:100

静态嵌套类

被static修饰的嵌套类

静态嵌套类在行为上就是一个顶级类,只是定义的代码写在了另一个类中。

可以直接访问外部类中的静态成员和方法(即使被声明为private)

public class Person {
private int age;
private static String name;
private static void run() {
System.out.println("Person - run");
}
public static class Car{
public void print() {
System.out.println(name);
run();
}
}
}

什么情况下使用嵌套类?

如果类A只用在类C内部,可以考虑将类A嵌套到类C中

封装性更好

程序包更加简化

增强可读性、维护性

如果类A需要经常访问类C的非公共成员,可以考虑将类A嵌套到类C中

另外也可以根据需要将类A影藏起来,不对外暴露

如果需要经常访问非公共的实例成员,则设计成内部类(费静态嵌套类),否则设计成静态嵌套类

如果必须先有C实例,才能创建A实例,那么可以将A设计为C的内部类

局部类

可以定义在代码块中的类(可以定义在方法中、for循环中、if语句中等)

局部类不能定义除编译时常量以外的任何static成员

局部类只能访问final或者有效final的局部变量

从Java 8开始,如果局部变量没有被第二次赋值,就认定为是有效final

局部类可以直接访问外部类中的所有成员(即使被声明为private)

局部类只有定义在实例相关的代码块中,才能直接访问外部类中的实例成员(实例变量、实例方法)

public class TestLocalClass {
private int a = 1;
private static int b = 2;
private static void test1() {}
private void test2() {}
public void test3() {
int c = 2;
class LocalClass {
static final int d = 4;
void test4() {
System.out.println(a + b + c + d);
test1();
test2();
}
}
new LocalClass().test4();
}
}