定义在 类内部的类,叫做内部类
内部类共有:本地内部类(定义在方法里面的类)、实例内部类、静态内部类、匿名内部类
目录
—————— 分 ——— 割 ——— 线 —————
1. 实例内部类
/** 实例内部类: * 1、在实例内部类当中 不可以定义一个静态的成员变量 * 如果非要用,可以写成static final修饰的 -> 成为常量(在编译的时候就确定了) * 2、怎么来创建实例内部类的对象呢? * OuterClass outerClass = new OuterClass(); //先实例化外部类 * OuterClass.InnerClass innerClass = outerClass.new InnerClass(); * 3、在实例内部类当中,是包含外部类的this的。可以通过外部类类名.this来找到 * 4、实例内部类对象,一定需要实例化外部类 * 5、使用举例:单链表结点、二叉树结点… */
//实例内部类
//外部类
class OuterClass {
public int data1 = 111;
public static int data2 = 2;
private int data3 = 3;
/** 实例内部类:
* 1、在实例内部类当中 不可以定义一个静态的成员变量
* 如果非要用,可以写成static final修饰的 -> 成为常量(在编译的时候就确定了)
* 2、怎么来创建实例内部类的对象呢?
* OuterClass outerClass = new OuterClass();
* OuterClass.InnerClass innerClass = outerClass.new InnerClass();
* 3、在实例内部类当中,是包含外部类的this的。可以通过外部类类名.this来找到
* 4、实例内部类对象,一定需要实例化外部类
* 5、使用举例:单链表结点、二叉树结点…
*/
class InnerClass {
public int data1 = 1;
public int data4 = 4;
public static final int data5 = 5; //实例里面不能有静态的,因为静态是不依赖于对象的
private int data6 = 6;
public void func() {
System.out.println("这是一个实例内部类的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);
}
}
}
public class TsetDemo {
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
innerClass.func();
}
}
2. 静态内部类
/** 静态内部类: * 1、如何得到静态内部类的对象 * OuterClass2.InnerClass innerClass = new OuterClass2.InnerClass(); * 2、在静态内部类当中,不能使用外部类的普通成员变量!! * 非要使用怎么办? * 在静态内部类当中,实例化一个外部类对象。通过这个引用来访问 */
class OuterClass2 {
public int data1 = 1;
public static int data2 = 2;
private int data3 = 3;
/** 静态内部类:
* 1、如何得到静态内部类的对象
* OuterClass2.InnerClass innerClass = new OuterClass2.InnerClass();
* 2、在静态内部类当中,不能使用外部类的普通成员变量!!
* 非要使用怎么办?
* 在静态内部类当中,实例化一个外部类对象。通过这个引用来访问
*/
static class InnerClass {
public int data4 = 4;
public static final int data5 = 5; //实例里面不能有静态的,因为静态是不依赖于对象的
private int data6 = 6;
public static int data2 = 2222; //测试一下静态内部类重名的情况
//public OuterClass2 out2 = new OuterClass2();
public OuterClass2 out2;
public InnerClass(OuterClass2 o) { //构造方法
this.out2 = o;
}
public void func() {
System.out.println("这是一个静态内部类的func方法");
System.out.println(out2.data1);
System.out.println(data2);
System.out.println(OuterClass2.data2);
System.out.println(out2.data3);
System.out.println(data4);
System.out.println(data5);
System.out.println(data6);
}
}
}
public class TestDemo2 {
public static void main(String[] args) {
OuterClass2 outerClass2 = new OuterClass2();
OuterClass2.InnerClass innerClass = new OuterClass2.InnerClass(outerClass2);
innerClass.func();
}
}
3. 匿名内部类
直接用来new调用,并使用(重写)方法
class Demo {
public void func() {
System.out.println("demo::func()");
}
}
public class TestDemo {
public static void main(String[] args) {
new Demo() {
@Override
public void func() {
System.out.println("这是匿名内部类的func方法");
}
}.func();
}
}