成员内部类
成员内部类
/*
* 1.可以使用四种访问权限修饰符修饰的
* 2. 内部类创建方式 要通过 外部类对象创建内部类对象
* 3. 使用内部类的时候必须要导包
* 3.内部类是可以使用外部类的属性和方法的, 包括私有的
* 4. 内部类属性和外部类属性同名的时候, 优先使用的 内部类的 即使用this也是使用的内部类的, 除非创建外部类对象调用
* 5. 局部变量是不能用static修饰的
* 6. 内部类字节码文件命名方式 外部类$内部类.class
public class Out{
//成员变量
//成员方法
//成员内部类
访问权限 class In{
//成员变量
//成员方法
}
}
创建对象
//创建外部类对象
Out o = new Out();
//通过外部类找到内部类,通过外部类对象创建内部类对象
Out.In i = o.new In();
一步完成:
Out.In i2=new Out().new In();
# 局部内部类
局部内部类
局部内部类 类似一个局部变量
1.局部内部类定义在方法内部的类
2. 不能使用访问权限修饰符以及 static进行修饰
3. 局部内部类中可以使用 外部类的属性也可以使用方法中的局部变量
4. 如果局部内部类中的属性和外部类成员属性同名, 则可以使用外部类.this.属性 调用外部类的属性
5. 局部内部类只能在声明此内部类的方法中创建对象
6. 局部内部内部类只能方法被调用的时候,才能执行
public class Test {
int a = 3;
public static void main(String[] args) {
Test test = new Test();
test.test();
}
public void test(){
int age = 3;
class Inner{
public String name= "mingzi";
private int a = 5;
public void show(){
System.out.println(name);
System.out.println(age);
System.out.println(Test.this.a);
}
}
// 5.局部内部类只能在声明此内部类的方法中创建对象
Inner inner = new Inner();
inner.show();
// 6. 局部内部内部类只能方法被调用的时候,才能执行
}
}
静态内部类
静态内部类
- 静态内部类中可以使用静态的属性和方法
2. 静态内部类可以直接创建对象 不需要外部类对象
3. 静态内部类中 不能直接使用外部类的非静态的属性和方法
4. 内部类中的属性和外部类属性同名的时候, 可以通过外部类.静态属性 调用外部类属性
5. 字节码文件的名字 外部类$内部类.class
static class Inner{
int a;
static int b;
static String name;
public void a(){
System.out.println("a");
System.out.println(Outer.name);
//System.out.println(age);
}
public static void b(){
System.out.println("static 的b");
}
}
匿名内部类
匿名内部类:
1. 没有自己本类的名字, 只能拿接口或者抽象类的名字代表
2. 创建的是实现类或者子类的对象
左边是接口的名字 = 右边是实现类的对象 向上转型
4. 不会再匿名内部类中新增 特有方法, 因为没有办法通过接口名字调用
5. 即使一个内部类或者接口 ,new了多次, 是多个实现类
6. 当有实现类或者子类只需要创建一次对象,则可以使用匿名内部类. 可以使程序结构更加简洁
7. 匿名内部类的名字 外部类$数字.class
Run run = new Run() {
@Override
public void run() {
System.out.println("外星人跑步");
eat();
}
// 匿名内部类中可以额外定义自己的方法, 但是一般不这样做
public void eat(){
}
};