内部类
指的就是把类定义在另一个类的内部,类名不一样,在我们说内部类的时候一般都要加上他的前缀
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。
局部内部类
局部内部类也称为本地内部类,是定义在方法当中的类,他是只能在当前方法中使用的
成员内部类
成员内部类也叫实例内部类,就是可以把它当做是一个普通的实例成员
//外部类
class OuterClass{
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;
//实例内部类
class InnerClass{
public int data1 = 999;
public int data4 = 4;
private int data5 = 5;
public static final int data6 = 6;
public InnerClass(){
System.out.println("不带参数的内部类构造方法!");
}
public void func(){
System.out.println(data1);
System.out.println(this.data1);
System.out.println(OuterClass.this.data1);
System.out.println(data2);
System.out.println(data3);
System.out.println(data4);
System.out.println(data5);
System.out.println(data6);
System.out.println("InnerClass::func()");
}
}
}
public class TestDemo {
public static void main(String[] args) {
OuterClass.InnerClass innerClass = new OuterClass().new InnerClass();
innerClass.func();
}
}
注意:在实例内部类中不能定义一个静态的成员变量,如果非要定义,就只能定义一个静态常量,加上final即可
如何实例化成员内部类的对象:
外部类名.内部类名 变量 = 外部类对象的引用.new 内部类();
如果实例内部类当中,包含了和外部类同名的成员变量,那么如何在实例内部类当中访问:
补充:
继承内部类:
内部类的字节码文件:
静态内部类
被 static 修饰的内部成员类就称为静态内部类
class OuterClass2{
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;
//静态内部类
static class InnerClass{
public int data4 = 4;
private int data5 = 5;
public static int data6 = 6;
public static OuterClass2 out = new OuterClass2();
public InnerClass(){
System.out.println("静态内部类构造方法");
}
public InnerClass(OuterClass2 out){
this.out = out;
}
public void func(){
System.out.println(out.data1);
System.out.println(out.data2);
System.out.println(data3);
System.out.println(data4);
System.out.println(data5);
System.out.println(data6);
System.out.println("InnerClass::func()");
}
}
}
public class TestDemo2 {
public static void main(String[] args) {
OuterClass2 outerClass2 = new OuterClass2();
OuterClass2.InnerClass innerClass = new OuterClass2.InnerClass(outerClass2);
innerClass.func();
}
}
注意:
1:在静态内部类中只能访问外部类中的静态成员,不可直接访问外部类中的非静态成员
2:创建静态内部类对象时,不需要先创建外部类对象
如何实例化:
外部类名.内部类名 变量 = new 外部类名.内部类名();
匿名内部类
就是为了让代码更加简洁,你可以定义一个类的同时对其进行实例化,它与局部类很相似,不同的是它没有类名,如果某个局部类你只需要使用一次,就可以使用匿名类代替局部类。
import java.util.Comparator;
import java.util.PriorityQueue;
class Test {
public void test() {
System.out.println("test()haha!");
}
}
public class TestDemo2 {
public static void main(String[] args) {
new Test(){
@Override
public void test() {
System.out.println("我是重写的test方法");
}
}.test();
PriorityQueue<Integer> prio = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return 0;
}
});
}
}
再次强调:在说内部类的时候,得加上他的前缀进行说明…