目录
1.什么是内部类?
将一个类A定义在另一个类B里面,里面的那个类A就称为’内部类(InnerClass)‘,类B称为’外部类(OuterClass)‘。
2.为什么需要内部类?
具体来说,当一个事物A的内部,还有一个部分需要一个完整的结构B进行描述,而这个内部的完整的结构B又只为外部事件A提供服务,不在其他地方单独使用,那么整个内部的完整结构B最好使用内部类。
3.内部类使用举例
Thread类内部声明了State类,表示线程的生命周期
HashMap类中声明了Node类,表示封装的key和value
4.内部类的分类
成员内部类:直接声明在外部类里面
·使用static修饰:静态成员内部类
·不使用static修饰:非静态成员内部类
局部内部类:声明在方法内、构造器内、代码块内的内部类
·匿名的局部内部类
·非匿名的局部内部类
class Person{
//静态成员内部类
static class Dog{
}
//非静态成员内部类
class Bird{
}
public void method(){
//局部内部类
class InnerClass1{
}
}
public Person(){
//局部内部类
class InnerClass2{
}
}
//代码块
{
//局部内部类
class InterClass{
}
}
}
5.成员内部类的理解
·从类的角度:
·内部可以声明属性、方法、构造器、代码块、内部类等
·此内部类可以声明父类,可以实现接口
·可以使用final修饰
·可以使用abstract修饰
·从外部类的成员的角度:
·在内部可以调用外部类的结构。如属性、方法等
·除了使用public、缺省权限修饰符之外,还可以使用private、protected修饰
·可以使用static修饰
6. 内部类知识点
6.1 如何创建成员内部类的实例
public class ClassTest {
public static void main(String[] args) {
//1.创建Person的静态的成员内部类的实例
Person.Dog dog = new Person.Dog();
dog.eat();
//2.创建Person的非静态的成员内部类的实例
//Person.Bird bird = new Person.Bird(); 报错
Person p1 = new Person();
Person.Bird bird = p1.new Bird();
bird.eat();
}
}
class Person{
//静态成员内部类
static class Dog{
public void eat(){
System.out.println("狗吃骨头");
}
}
//非静态成员内部类
class Bird{
public void eat(){
System.out.println("鸟吃虫子");
}
}
public void method(){
//局部内部类
class InnerClass1{
}
}
public Person(){
//局部内部类
class InnerClass2{
}
}
//代码块
{
//局部内部类
class InterClass{
}
}
}
6.2 如何在成员内部类调用外部类的结构
public class ClassTest {
public static void main(String[] args) {
//1.创建Person的静态的成员内部类的实例
Person.Dog dog = new Person.Dog();
dog.eat();
//2.创建Person的非静态的成员内部类的实例
//Person.Bird bird = new Person.Bird(); 报错
Person p1 = new Person();
Person.Bird bird = p1.new Bird();
bird.eat();
bird.show("黄鹂");
bird.show1();
}
}
class Person{
String name = "Tom";
int age = 10;
//静态成员内部类
static class Dog{
public void eat(){
System.out.println("狗吃骨头");
}
}
//非静态成员内部类
class Bird{
String name = "啄木鸟";
public void eat(){
System.out.println("鸟吃虫子");
}
public void show(String name){
System.out.println("age="+age);//省略了Person.this.
System.out.println("name="+name);
System.out.println("name="+this.name);
System.out.println("name="+Person.this.name);//调用外部类结构
}
public void show1(){
eat();
this.eat();
Person.this.eat();
}
}
public void eat(){
System.out.println("人吃饭");
}
public void method(){
//局部内部类
class InnerClass1{
}
}
public Person(){
//局部内部类
class InnerClass2{
}
}
//代码块
{
//局部内部类
class InterClass{
}
}
}
6.3 局部内部类的基本使用
public class ClassTest {
public static void main(String[] args) {
}
}
class OuterClass{
//说明:局部内部类的使用
public void method1(){
//局部内部类
class A{
//可以声明属性、方法等
}
}
//开发中的场景
public Comparable getInstance(){
//提送了实现Comparable接口类
//方式1.提供了接口实现类的对象
class MyComparable implements Comparable{
@Override
public int compareTo(Object o) {
return 0;
}
}
MyComparable m = new MyComparable();
return m;
//方式2.提供了接口实现类的匿名对象
/*class MyComparable implements Comparable{
@Override
public int compareTo(Object o) {
return 0;
}
}
return new MyComparable();*/
//方式3.提供了接口匿名实现类的对象
/*Comparable c = new Comparable() {
@Override
public int compareTo(Object o) {
return 0;
}
};
return c;*/
//方式4.提供了接口匿名实现类的匿名对象
/*return new Comparable(){
@Override
public int compareTo(Object o) {
return 0;
}
};*/
}
}