成员内部类
定义在类里面的类
- 成员内部类可以访问外部类的所有成员,包括private成员和静态成员
- 当内部类和外部类成员重名的情况下,默认访问的是内部类的成员;访问外部成员方法为:外部类.this.外部成员
- 创建内部类必须先存在外部类:new Out().new Inner()
- 字节码文件名:外部类名$内部类名.class
package com.zrun;
import com.zrun.Outer1.Inner1;
public class App1 {
public static void main(String[] args) {
// 创建成员内部类的方法1
Outer1 out = new Outer1("ych", 29);
Inner1 inn = out.new Inner1("hll");
inn.testField();
// 创建成员内部类的方法2
Inner1 inn2 = out.getInnerInst();
inn2.testField();
}
}
class Outer1 {
private String name;
private int age;
public Outer1(String name, int age) {
this.name = name;
this.age = age;
}
private Inner1 inner;
/**
* 获取内部类实例
*
* @return
*/
public Inner1 getInnerInst() {
if (inner == null)
inner = new Inner1("hll");
return inner;
}
class Inner1 {
private String name;
public Inner1(String name) {
this.name = name;
}
/**
* 内部类引用外部类成员
*/
public void testField() {
System.out.println("内部类使用外部类的变量age:" + age);
System.out.println("内部类和外部类变量重名,默认使用内部类name:" + name);
System.out.println("内部类和外部类变量重名,使用内部类name:" + this.name);
System.out.println("内部类和外部类变量重名,使用外部类name:" + Outer1.this.name);
}
}
}
局部内部类
定义在方法或作用域里面的类,访问权限只在该方法或作用域中(实际开发中很少使用,因为作用域太小)
- 局部内部类类似于方法局部变量,不能有public、protect、private、static修饰符
- 字节码文件名:外部类名$1内部类名.class
package com.zrun;
public class App2 {
public static void main(String[] args) {
// new Inner2().printName();
String name = "ych";
class Inner2 {
public void printName() {
System.out.println(name);
}
}
new Inner2().printName();
}
}
匿名内部类
- 常用于写事件监听
- 字节码文件名:App3$1.class
package com.zrun;
public class App3 {
public static void main(String[] args) {
Button btn = new Button();
btn.click(new ButtonClickListener() {
@Override
public void click() {
System.out.println("按钮被点击了");
}
@Override
public void doubleClick() {
System.out.println("按钮被双击了");
}
});
}
}
interface ButtonClickListener {
public void click();
public void doubleClick();
}
class Button {
public void click(ButtonClickListener clickListener) {
clickListener.click();
clickListener.doubleClick();
}
}
静态内部类
定义在类中的类,前面有static关键字修饰
- 创建静态内部类不需要依赖外部类
- 静态内部类相当于外部类的静态成员,不可以使用外部类的非静态成员
- 字节码文件名:外部类名$内部类名.class
package com.zrun;
public class App4 {
public static void main(String[] args) {
Outer4.Inner4 inner4 = new Outer4.Inner4();
inner4.print();
}
}
class Outer4 {
private String name;
static Integer age = 29;
static class Inner4 {
public void print() {
// System.out.println(name);
System.out.println(age);
}
}
}