1. 内部类概念
在一个类的内部定义另一个类(接口、枚举或注解),这种类称为内部类或嵌套类。
内部类可以分成员内部类、局部内部类、匿名内部类和静态内部类。
public class OuterClass { //外部类
class InnerClass{ //内部类
}
}
2. 成员内部类
在一个类中除了可以定义成员变量、成员方法,还可以定义类,这样的类被称作成员内部类。成员内部类可以访问外部类的所有成员,无论外部类的成员是何种访问权限。如果想通过外部类访问内部类,则需要通过外部类创建内部类对象,创建内部类对象的具体语法格式如下:
外部类名 外部类对象 = new 外部类名();
外部类名.内部类名 内部类对象 = 外部类对象.new 内部类名();
-
Student类
public class Student {
public String name;
public int age;
public Student(){
}
public Student(String name,int age){
this.name = name;
this.age = age;
}
class HighSchool{ //成员内部类
public String schoolName;
public void show(){
System.out.println("我的名字是:" + name);
System.out.println("我的年龄是:" + age);
System.out.println("我的高中学校是:" + schoolName);
}
}
}
-
测试类
public class TestDemo {
public static void main(String[] args) {
Student student = new Student();
student.name = "zhangsan";
student.age = 20;
//创建内部类对象方式一
Student.HighSchool highSchool = student.new HighSchool();
highSchool.schoolName = "潍坊一中";
highSchool.show();
//创建内部对象类方式二
Student.HighSchool highSchool2 = new Student("李四",21).new HighSchool();
highSchool2.schoolName = "潍坊二中";
highSchool2.show();
}
}
3. 局部内部类
局部内部类,也称为方法内部类,是指定义在某个局部范围中的类,它和局部变量都是在方法中定义的,有效范围只限于方法内部(包括方法、构造方法、局部块、初始化块或静态初始化块)。
在局部内部类中,局部内部类可以访问外部类的所有成员变量和成员方法,而在外部类中无法直接访问局部内部类中的变量和方法。如果要在外部类中访问局部内部类的成员,只能在局部内部类的所属方法中创建局部内部类的对象,通过对象访问局部内部类的变量和方法。
-
Student类
public class Student {
public String name;
public int age;
public void myHighSchool(){
//局部内部类
class HighSchool{
public String schoolName;
public void show(){
System.out.println("我的名字是:" + name);
System.out.println("我的年龄是:" + age);
System.out.println("我的高中学校是:" + schoolName);
}
}
HighSchool highSchool = new HighSchool();
highSchool.schoolName = "潍坊一中";
highSchool.show();
}
}
-
测试类
public class TestDemo {
public static void main(String[] args) {
Student student = new Student();
student.name = "zhangsan";
student.age = 20;
student.myHighSchool();
}
}
4. 静态内部类
静态内部类,就是使用static关键字修饰的成员内部类。与成员内部类相比,在形式上,静态内部类只是在内部类前增加了static关键字,但在功能上,静态内部类只能访问外部类的静态成员,通过外部类访问静态内部类成员时,因为程序已经提前在静态常量区分配好了内存,所以即使静态内部类没有加载,依然可以通过外部类直接创建一个静态内部类对象。创建静态内部类对象的基本语法格式如下。
外部类名.静态内部类名 变量名 = new 外部类名.静态内部类名();
-
Student类
public class Student {
public String name;
public int age;
static class HighSchool{ //成员内部类
public String schoolName;
public void show(){
//不能直接访问name和age
System.out.println("我的高中学校是:" + schoolName);
}
}
}
-
测试类
public class Test {
public static void main(String[] args) {
Student.HighSchool highSchool= new Student.HighSchool();
highSchool.schoolName = "潍坊一中";
highSchool.show();
}
}
5. 匿名内部类
将类的定义和实例的创建在一起完成,或者说在定义类的同时就创建一个实例。以这种方式定义的没有名字的类称为匿名内部类。定义匿名内部类的基本语法格式如下所示。
new 继承的父类或实现的接口名(){
//匿名内部类的类体
}
-
Animal接口
public interface Animal {
public abstract void shout();
}
-
测试类
public class TestDemo {
@Test
public void test(){
Animal animal = new Animal() {
@Override
public void shout() {
System.out.println("小猫喵喵叫");
}
};
animal.shout();
}
}