我们需要先知道什么是内部类,内部类就是指定义在类内部的类,根据定义的类位置和修饰符的不同分为了成员内部类、静态内部类、局部内部类和匿名内部类。
成员内部类
成员内部类使用非常简单,我们只需要在类内部定义一个类,然后定义属性和方法,而且内部类也可以访问外部类的属性和方法,如果想访问内部类,就是要实例化对象,代码:
package com.example.main.test;
public class OuterClass {
String name;
public void method(){
System.out.println("外部类成员方法");
}
public static void staticMethod(){
System.out.println("外部类的静态方法");
}
//成员内部类
class InnerOuterClass{
private final String name = "张三";
private void method(){
System.out.println(name);
//由于方法名一样,需要调用this关键字。
OuterClass.this.method();
staticMethod();
}
}
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
//创建内部类的实例化对象就需要用 外部类.new 来创建。
InnerOuterClass innerOuterClass = outerClass.new InnerOuterClass();
innerOuterClass.method();
}
}
静态内部类
静态内部类就更简单了,因为是静态的,它里面的属性和方法必须是静态的,因此他也只能访问外部静态属性和静态方法。
package com.example.main.test;
public class OuterClass {
String name;
public void method(){
System.out.println("外部类成员方法");
}
public static void staticMethod(){
System.out.println("外部类的静态方法");
}
//静态内部类
static class InnerOuterClass{
private static final String name = "张三";
private static void method(){
System.out.println(name);
staticMethod();
}
}
public static void main(String[] args) {
//如果该main方法是在其它类中,则可以通过OuterClass.InnerOuterClass.method()来调用即可。
InnerOuterClass.method();
}
}
局部类
局部类顾名思义就是在方法内部定义的类,即只有在定义它的方法内部才可以访问它。
package com.example.main.test;
public class OuterClass {
String name;
public void method(){
System.out.println("外部类成员方法");
//局部类
class InnerClass{
//在JDK8.0之前需要给变量添加final属性。
public void InnerMethod(){
System.out.println("我是局部类");
}
}
//只有在定义它的方法里面才可以使用,外部无法访问。
new InnerClass().InnerMethod();
}
public static void staticMethod(){
System.out.println("外部类的静态方法");
}
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
outerClass.method();
}
}
匿名内部类
匿名内部类就是指没有类名的内部类,当你想要继承或者实现某一个类的时候,并且这个这个内部类只会使用一次,你就可以使用匿名内部类了。
举个例子就明白了,我们学过多线程的知识可以知道,多线程对象类型是Thread,执行方法是start(),我们想要执行的话就可以放入一个Runnable参数的形式放入Thread类的构造方法中,即new Thread(Runnable对象).start。按照以前的逻辑就是先用一个类实现了Runnable接口并重写了里面run()抽象方法,然后实例化这个对象放入到Thread的构造方法中,再用实例化的Thread的对象调用静态方法start()。相当麻烦,但是我们使用匿名内部类就真的很好办了。
package com.example.main.test;
public class OuterClass{
public static void main(String[] args) {
//匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
//里面就是线程的执行逻辑
}
});
}
}
多线程的知识可以看我之前的文章,看不懂也没事,这里主要能理解匿名内部类就可以了。