类的成员之五:内部类1. 什么是内部类?
将一个类A定义在另一个类B里面,里面的那个类A就称为`内部类(InnerClass)`,类B则称为`外部类(OuterClass)`。
内部只供外部类使用
2. 为什么需要内部类?
具体来说,当一个事物A的内部,还有一个部分需要一个完整的结构B进行描述,而这个内部的完整的结构B又只为外部事物A
提供服务,不在其他地方单独使用,那么整个内部的完整结构B最好使用内部类。总的来说,遵循`高内聚、低耦合`的面向对象开发原则。3. 内部类使用举例:
Thread类内部声明了State类,表示线程的生命周期
HashMap类中声明了Node类,表示封装的key和value4. 内部类的分类:(参考变量的分类)> 成员内部类:直接声明在外部类的里面。> 使用static修饰的:静态的成员内部类> 不使用static修饰的:非静态的成员内部类> 局部内部类:声明在方法内、构造器内、代码块内的内部类> 匿名的局部内部类> 非匿名的局部内部类5. 内部类这节要讲的知识:> 成员内部类的理解> 如何创建成员内部类的实例> 如何在成员内部类中调用外部类的结构> 局部内部类的基本使用6. 关于成员内部类的理解:> 从类的角度看:- 内部可以声明属性、方法、构造器、代码块、内部类等结构- 此内部类可以声明父类,可以实现接口- 可以使用final修饰- 可以使用abstract修饰> 从外部类的成员的角度看:- 在内部可以调用外部类的结构。比如:属性、方法等- 除了使用public、缺省权限修饰之外,还可以使用private、protected修饰- 可以使用static修饰7. 关于局部内部类的说明:代码
package chapter08_oop3_teacher.src.com.atguigu09.inner;/*** ClassName: OuterClassTest* Description:** @Author 尚硅谷-宋红康* @Create 10:31* @Version 1.0*/
public class OuterClassTest {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 = 1;//静态的成员内部类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.thisSystem.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 InnerClass1{}}{//局部内部类class InnerClass1{}}}
package chapter08_oop3_teacher.src.com.atguigu09.inner;/*** ClassName: OuterClassTest1* Description:** @Author 尚硅谷-宋红康* @Create 10:55* @Version 1.0*/
public class OuterClassTest1 {//说明:局部内部类的使用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(){@Overridepublic int compareTo(Object o) {return 0;}};}}