文章目录
内部类
概述
把类定义在其他类的内部
访问特点
内部类可以直接访问外部类的所有成员
外部类需要创建内部类对象才可以访问内部类的成员
内部类位置
外部类成员位置
成员内部类(没有static修饰)
静态内部类(有static修饰)
外部类局部成员位置
局部内部类(有类名)
匿名内部类(没有类名)
成员内部类
修饰符
private 为了保证数据的安全性
static 为了方便访问数据
注意事项
成员方法可以是静态和非静态的
成员内部类调用方式
外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num);
}
}
}
class InnerClassTest {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
静态内部类
修饰符
static 为了方便访问数据
注意事项
静态内部类访问的外部类数据必须使用静态修饰符
成员方法可以是静态和非静态的
静态内部类调用方式
外部类名.内部类名 对象名 = new 外部类名.内部类名();
class Outer {
public static int num = 10;
static class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(num);
System.out.println(Inner.this.num);
System.out.println(Outer.num);
}
}
}
class InnerClassTest {
public static void main(String[] args) {
Outer.Inner oi = new Outer.Inner();
oi.show();
}
}
局部内部类
修饰符
final修饰 让数据还可以使用 final修饰符局部变量都可以使用
不能添加其他访问修饰符 因为它就是一个局部变量 局部变量不能使用修饰符
注意事项
局部内部类可以直接访问外部类数据
使用方法
创建内部类对象 对象调用内部类方法
class Outer {
private int age = 10;
public void show(){
class Inner{
public void word(){
System.out.println(Outer.this.age);
}
}
Inner inner = new Inner();
inner.word();
}
}
class InnerClassTest {
public static void main(String[] args) {
Outer outer = new Outer();
outer.show();
}
}
匿名内部类
概述
局部内部类的简化
格式
new 类名或者接口名(){
重写方法;
} ;
本质
继承了一个类或者实现了一个接口的子类匿名对象
例题1 调用匿名内部类
class Test{
public static void main(String[] args) {
B b = new B();
b.bb();
}
}
interface IA{
void show();
}
class B{
public void bb(){
IA ia = new IA() {
@Override
public void show() {
System.out.println("hahah");
}
};
ia.show();
}
}
例题2 匿名内部类当做实参传值
abstract class Person {
public abstract void show();
}
class PersonDemo {
public void method(Person p) {
p.show();
}
}
class PersonTest {
public static void main(String[] args) {
PersonDemo personDemo = new PersonDemo();
personDemo.method(new Person() {
@Override
public void show() {
System.out.println("Person");
}
});
}
}
例题3 匿名内部类值传递
interface Inter {
public static final int a = 23 ;
}
public class Test {
public static void main(String[] args) {
new Inter() {
int a = 20;
public void show() {
System.out.println(a);
System.out.println(Inter.a);
}
}.show();
}
}