1.什么是内部类
将类写在其他类的内部,可以写在其他的成员位置和其他类的局部位置,这时写在其他类内部的类就称为内部类,简单来说,内部类就是编写在一个类的内部的类,而外部这个类叫外部类
2.什么时候使用内部类
在描述事物时,若一个事物内部还包含其他可能包含的事物,比如在描述汽车时,汽车中还包含发动机这个事物,这是发动机就可以使用内部类来描述,即内部事物必须寄宿在外部事物内部
简单来说,在我们实现功能的过程中,如何希望封装实现的细节,那么我们就可以使用内部类,最常见的就是坐 Android 开发时
3.内部类的使用
class Outer { //外部类
public void fun() {
System.out.println("Other fun()");
}
class Inner { /内部类
public void show() {
System.out.println("Inner show()");
}
}
}
public class InnerClassDemo {
public static void main(String[] args) {
//实例化外部类
Outer outer = new Outer();
outer.fun();
//通过外部对象来实例化内部类
Outer.Inner inner = outer.new Inner();
inner.show();
//如果希望直接实例化内部对象,那么可以通过下面的方式来创建
Outer.Inner inner1 = new Outer().new Inner();
inner1.show();
}
}
非静态内部类的实例化方式为:外部类名 . 内部类名 引用名称 = 外部对象 . 内部对象
除了可以通过外部对象 . 内部对象的方式来使用内部类,还可以在外部类中定义方法,在这个方法中去实例化内部类,如:
class Outer1 {
public void print() {
Inner1 inner1 = new Inner1();
inner1.show();
}
private class Inner1 {
public void show() {
System.out.println("Inner1 show()");
}
}
}
public class InnerClassDemo2 {
public static void main(String[] args) {
/*Outer1.Inner1 inner1 = new Outer1().new Inner1();
inner1.show(); */
Outer1 outer1 = new Outer1();
outer1.print();
}
}
这种方式一般用于私有的内部类
4.静态内部类
上述方法是非静态成员的内部类,也叫实力内部类
下面我们编写静态内部类
class Outer2 {
//静态成员内问类
static class Inner2 {
public void say() {
System.out.println("Inner2 say()");
}
}
}
public class StaticInnerClass {
public static void main(String[] args) {
//静态成员内部类的实例化方式为:new 外部类名.内部类名()
Outer2.Inner2 inner2 = new Outer2.Inner2();
inner2.say();
}
}
静态内部类的实例化方式:外部类名 . 内部类名 引用名称 = new 外部类名 . 内部类名()
5.局部内部类
将内部定义在外部类中的某个方法中,那么这种内部类就是局部内部类
class Outer3 {
public void create() {
//局部内部类
class Inner3 {
public void show() {
System.out.println("Inner3 show()");
}
}
Inner3 inner3 = new Inner3();
inner3.show();
}
}
public class LocalInnerClass {
public static void main(String[] args) {
Outer3 outer3 = new Outer3();
outer3.create();
}
}
局部内部类的创建只能在局部内部类所在方法中来实例化
6.内部类面试题
说出下面程序的输出结果
class Outer5 {
private int num = 5;
class Inner5 {
private int num = 10;
public void fun() {
int num = 15;
System.out.println(num); // 15
System.out.println(this.num); // 10
System.out.println(Outer5.this.num); // 5
}
}
}
public class InterviewQuestions {
public static void main(String[] args) {
Outer5.Inner5 inner5 = new Outer5().new Inner5();
inner5.fun();
}
}