内部类:成员内部类、静态内部类、匿名内部类、局部内部类。
成员内部类
public class Students {
public class Student{
}
}
Student内部类对象需要依靠Students外部类对象(有爸爸才有儿子?哈哈哈)
public class Students {
public int age1=20;
//创建一个内部类对象作为Students的实例变量
Student student1=new Student();
//内部类
public class Student{
public String name;
public int age2=10;
//内部类无参构造方法
public Student() {
//内部类可以直接访问外部类属性
System.out.println("内部类访问外部类属性age1为:"+age1);
}
//内部类有参构造方法
public Student(String name) {
this.name = name;
}
}
//外部类无参构造方法
public Students() {
//在外部类的构造方法也可以创造内部类对象
Student student2=new Student();
//System.out.println("外部类访问内部类age2为:"+age2); 编译错误!! 需要借助内部类对象才可以访问内部类属性
System.out.println("外部类访问内部类age2为:"+student2.age2);
}
public static void main(String[] args) {
//Student student = new Student(); 编译错误!!
Students students=new Students();
Student student3 = students.new Student("阿头");//可以用外部类对象创建内部类对象
System.out.println("student3的名字为:"+student3.name);
}
}
结果如下:
上面代码为啥内部类可以直接访问外部类属性,但是外部类的构造方法不可以直接访问内部类属性呢?(答案是方法体的作用域范围不同)
静态内部类
public class Students {
public int age1=20;
//创建一个内部类对象作为Students的实例变量
Student student1=new Student();
//内部类
public static class Student{
public String name;
public int age2=10;
//内部类无参构造方法
public Student() {
//内部类可以直接访问外部类属性
System.out.println("内部类访问外部类属性age1为:"+age1);//编译错误!! static类不可以访问非静态对象或属性
}
//内部类有参构造方法
public Student(String name) {
this.name = name;
}
}
//外部类无参构造方法
public Students() {
//在外部类的构造方法也可以创造内部类对象
Student student2=new Student();
//System.out.println("外部类访问内部类age2为:"+age2); 编译错误!! 需要借助内部类对象才可以访问内部类属性
System.out.println("外部类访问内部类age2为:"+student2.age2);
}
public static void main(String[] args) {
//这里内部类对象的创建不需要依靠外部类对象的创建了
Student student = new Student();
Students students=new Students();
//Student student3 = students.new Student("阿头");编译错误!!
//System.out.println("student3的名字为:"+student3.name);
}
}
这段代码需要注意的是:
1、我把内部类添加了static,此时内部类的属性也默认是static的。
2、静态内部类是不需要依赖于外部类对象的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。
匿名内部类
匿名内部类由于没有名字,所以它的创建方式有点儿奇怪。创建格式如下:
new 父类构造器(参数列表)|实现接口(){
//匿名内部类的类体部分
}
在这里我们看到使用匿名内部类我们必须要继承一个父类或者实现一个接口,当然也仅能只继承一个父类或者实现一个接口。同时它也是没有class关键字,这是因为匿名内部类是直接使用new来生成一个对象的引用。当然这个引用是隐式的。
需要注意以下几点:
1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,同时也只能继承一个类或者实现一个接口。
2、匿名内部类中是不能定义构造函数的。
3、匿名内部类中不能存在任何的静态成员变量和静态方法。
4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
6、只能访问final型的局部变量。
局部内部类(很少用)
定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限
于方法内或者该作用域内。
class Person{
public Person() {
}
}
class Man{
public Man(){
}
public People getPerson(){
class Student extends People{ //局部内部类
int age =0;
}
return new Student();
}
}