内部类
应用场景
- 封装性 只能通过外部类访问到内部类,外部类在实例化内部类时可以做一些判断
- 通过内部类可以间接实现多继承,可以通过内部类区分出具体调用的是哪个类继承过来的方法,即使父类之前出现同名方法也不担心
普通内部类
定义在类中. 内部类和外部类可以互相访问其属性
class Person {
private String idCard;
static String name;
//外部类方法 可以直接访问内部类实例的私有属性
void work(){
System.out.println(new PetDog().age);
}
//普通内部类 宠物
class PetDog{
String name;
private int age;
//内部类可以访问外部类的私有属性: 外部类名.this.属性
void say(){
System.out.println(Person.this.name+" "+ this.name + Person.this.idCard);
}
}
内部类只能通过外部类访问到. (两种实例化方式)
Person.PetDog petDog = person.new PetDog();
Person.PetDog petDog1 = new Person().new PetDog();
局部内部类
定义在方法中,作用于方法内部
//外部类方法 可以直接访问内部类实例的私有属性
void work(){
System.out.println(new PetDog().age);
int a;
//局部内部类. 只作用于方法的内部.
class Test{
}
}
匿名内部类
只使用1次
Person person = new Person(){
@Override
void work() {
System.out.println("work方法调用 我是匿名内部类");
}
};
person.work();//sout: work方法调用 我是匿名内部类
静态内部类
//静态内部类. 作为一个静态内部类对象,不能访问外部类的实例方法
static class Personal{
String val;
}
完整代码
package com.demo02;
/**
* 内部类学习
*/
public class Main {
public static void main(String[] args) {
/**
* 实例化内部类 必须先实例化外部类
*/
Person person = new Person();
Person.PetDog petDog = person.new PetDog();
Person.PetDog petDog1 = new Person().new PetDog();
person.work2();
}
}
/**
* 使用多个内部类继承不同父类,可以使外部类间接的实现多继承.
*/
class Person {
private String idCard;
static String name;
//外部类方法 可以直接访问内部类实例的私有属性
void work(){
System.out.println(new PetDog().age);
int a;
//局部内部类. 只作用于方法的内部.
class Test{
}
}
//普通内部类 宠物
class PetDog{
String name;
private int age;
//内部类可以访问外部类的私有属性 外部类名.this.属性
void say(){
System.out.println(Person.this.name+" "+ this.name + Person.this.idCard);
}
}
//静态内部类. 作为一个静态内部类对象,不能访问外部类的实例方法
static class Personal{
String val;
}
//匿名内部类。 只使用1次,没有构造方法
void work2(){
Person person = new Person(){
@Override
void work() {
System.out.println("work方法调用 我是匿名内部类");
}
};
person.work();//sout: work方法调用 我是匿名内部类
}
}