java内部类有四种形态
- 静态内部类【了解】
- 成员内部类【了解】
- 局部内部类【了解】
- 匿名内部类【重点】
静态内部类
package com.wmx.test;
public class Outer {
private String key;
public static final String session = "100";
public static class Inner {
private String name;
private int age;
public Inner() {
}
public Inner(String name, int age) {
this.name = name;
this.age = age;
}
public static int a = 0;
public static void b() {
System.out.println("b");
}
public void show() {
//静态内部类可以访问外部类中的静态变量
System.out.println(session);
//静态内部类不能直接访问外部类的成员变量
// System.out.println(key);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
}
静态内部类实例化方式
Outer.Inner inner = new Outer.Inner();
inner.show();
成员内部类
package com.wmx.test;
public class Outer {
private String key;
public static final String session = "100";
public class Inner {
private String name;
private int age;
//JDK16开始支持静态成员和静态方法
// public static int a = 0;
// public static void b() {
// System.out.println("b");
// }
public Inner() {
}
public Inner(String name, int age) {
this.name = name;
this.age = age;
}
public void show() {
//成员内部类可以访问外部类中的静态变量
System.out.println(session);
//成员内部类不能直接访问外部类的成员变量
System.out.println(key);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
}
成员内部类实例化方式
Outer.Inner inner = new Outer().new Inner();
inner.show();
成员内部类访问实例变量
package com.wmx.test;
public class People {
public static void main(String[] args) {
Heart heart = new People().new Heart();
heart.show();
}
private int heartbeat = 150;
private class Heart {
private int heartbeat = 110;
public void show() {
int heartbeat = 78;
System.out.println(heartbeat);//78
System.out.println(this.heartbeat);//110
System.out.println(People.this.heartbeat);//150
}
}
}
局部内部类(一般不用)
package com.wmx.test;
public class Test {
public static void main(String[] args) {
class Cat {
private String name;
public void show() {
System.out.println("show.....");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Cat cat = new Cat();
cat.show();
}
}
局部内部类可以产生class文件Test$1Cat.class
匿名内部类
package com.wmx.test;
public class Test {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("测试");
}
}).start();
}
}