内部类
一、什么是内部类
内部类,是定义在另一个类中的类。通常,在一个类只被它的外部类所使用的时候,才将它定义为内部类
二、使用内部类的原因
①内部类方法可以访问该类定义所在作用域中的数据,包括私有的数据
②内部类可以对同一包中的其他类隐藏起来
③常常使用一个方法,使其返回值为某个类或接口的对象,而这个类或接口在方法的内部创建
三、内部类的种类
1.成员内部类
顾名思义,成员内部类是外部类的一个成员,形如:
class ClassName{
//数据域
class InnerClassName{ //成员内部类
}
}
特点:①可以有修饰符(public,protected等4个)②可调用外部类的属性和方法
2.局部内部类
定义在某个方法中的类,形如:
class ClassName{
public returnType methodName(){
class InnerClassName{ //局部内部类
}
}
}
注:局部内部类不能用public 或 private 访问说明符进行声明,它的作用域被限定在声明这个局部内部类的块中
3.匿名内部类
假如只创建这个类的一个对象,就不必命名了,这种类被称为匿名内部类。形如:
class ClassName{
Class/Interface object = new Class/Interface(){ //匿名内部类
};
}
4.静态内部类
有时候使用内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外围类的对象。为此,可以将内部类声明为static,以便取消产生的引用。
注:一个static的内部类不能访问外部类中的非静态成员
下面,根据一个程序来理解以上内部类的使用:
(程序节选自尚硅谷宋红康老师的视频,在此致谢宋老师)
package Interface;
public class TestInnerClass {
public static void main(String[] args) {
// 静态创建一个对象
Person.Dog d = new Person.Dog();
// 非静态创建一个对象,先创建外围类的对象,再通过外围类调用内部类构造器
Person p = new Person();
Person.Bird b = p.new Bird();
b.info();
b.setName("黄鹂");
p.getComparable();
}
}
class Person {
String name = "韩梅梅";
int age;
// 成员内部类(非static)
class Bird {
String name = "杜鹃";
int id;
public Bird() {
}
public void setName(String name) {
System.out.println(name);//杜鹃
System.out.println(this.name);// Bird类调用setName 所以是黄鹂
System.out.println(Person.this.name);//韩梅梅
}
public void info() {
show();
}
}
public void show() {
System.out.println("I'm show() method");
}
// 静态成员内部类
static class Dog {
}
public void method1() {
//局部内部类
class InnerClass {
}
}
//内部类用途:常常使用一个方法,使其返回值为某个类或接口的对象,而这个类或接口在方法的内部创建
//局部内部类用法一
public Comparable getComparable() {
// 1.创建一个实现Comparable接口的类:局部内部类
class MyComparable implements Comparable {
@Override
public int compareTo(Object o) {
return 0;
}
}
// 2.返回一个实现类的对象
return new MyComparable();
}
// 局部内部类用法二
public Comparable getComparable1() {
//返回一个实现Comparable接口的匿名内部类的对象
return new Comparable() {
@Override
public int compareTo(Object o) {
return 0;
}
};
}
}
运行结果如下: