java的内部类


定义:在类中或类的成员方法中创建的类叫做内部类

   - 内部类也是一个类,可以有成员变量,成员方法
   - 内部类可以是普通类、抽象类子类、接口的实现类

//外部类
public class OuterDemo1 implements Inf1 {
    @Override
    public void start() {
        //启动
        System.out.println("启动");
    }
    //内部类实现接口
    class Inner implements Inf2{
        @Override
        public void start() {
            //开始
            System.out.println("开始");
        }
    }
}
//接口1
interface Inf1{
    //启动
    public abstract void start();
    // public abstract默认省略
}
//接口2
interface Inf2{
    //开始
    void start();
}

内部类分为四种:

  • 成员内部类
  • 静态内部类
  • 局部内部类
  • 匿名内部类

成员内部类

  • 成员内部类创建在类中,方法外,可以使用4个访问修饰符
  • 成员内部类不可以有静态成员
  • 外部类可以使用成员内部类
  • 成员内部类的实例方法中拥有外部类对象,使用“外部类名.this”获取,所以可以使用“外部类名.This”访问外部类成员(内部类的实例方法中this表示内部类对象,外部.类名。This表示外部类对象);

示例一:


//外部类
public class OuterDemo2 {
    int a=10;
    static int b=20;//静态变量
    //成员方法
    //在外部类中访问成员内部类:new 内部类名------》表示内部对象
    //通过内部类对象访问
    public void fun(){
        System.out.println( new Inner().x);
    }
    //成员内部类
    class Inner{
        int x=100;
//        static  int y=200;//编译错误:成员内部类中不能存在静态成员
    }
}

示例二:

//外部类
public class OuterDemo3 {
    int a=10;
    static int b=20;//静态变量
    //成员内部类
    class Inner{
        int x=100;
//        static  int y=200;//编译错误:成员内部类中不能存在静态成员
     public void fun(){
         //在内部类中访问外部类成员,外部类名.this得到外部类对象
         System.out.println(OuterDemo3.this.a);
         //this 在内部类中表示当前的内部类对象
         System.out.println(this.x);
     }
    }
}

静态内部类

  • 静态内部类创建在类中,方法外,使用static修饰
  • 四种访问权限修饰符都可以修饰静态内部类,类可以被任何地方使用,其他类使用静态内部类时,要受静态内部类的权限修饰行影响,这种影响与类中成员变量和成员一样
  • 导入静态内部类的包的格式为import …外部类.静态内部类
  • 只导入静态内部类的外部类也可以使用静态内部类,只是使用时格式为“外部类.内部类.";
  • 静态内部类中可以有静态成员变量与静态成员方法
  • 静态内部类的实例方法中没有外部类对象,所以不能在静态内部类中使用"外部类.this"
    ,即静态内部类只能访问外部类的静态成员,不能访问外部类的实例成员
//外部类
public class OuterDemo4 {

    //静态内部类
    static class Inner {
        static int x = 20;
        public  static  void fun(){
            System.out.println("static 内部类");
        }
    }
    public void test(){
        //使用类名.变量名调用静态内部类中的静态变量
        System.out.println(Inner.x);
    }

}

局部内部类

  • 方法中定义的内部类
  • 局部内部类与局部变量有很多相似之处

   - 都不可使用权限修饰符修饰
   - 作用域范围相同,都是定义地方起到第一个"}"结束

  • 局部内部类拥有外部类对象,即可以使用"外部类名.this"访问外部类成员
  • 局部内部类中可访问外部方法的局部变量,但是该局部变量必须是
//外部类
public class OuterDemo5 {
   int a=10;
    public void fun(){
        /*
        *局部内部类:定义在方法内部或参数
        * 作用域只在该方法内有效,不能使用权限修饰符修饰
        * */
        int x=100;//局部变量
        // 局部内部类
        class Inner{
            public void test(){
                //访问外部类成员,通过“外部类.this.”访问
                System.out.println(OuterDemo5.this.a);
                //访问方法的局部变量
                System.out.println(x);
            }
        }
    }
}

匿名内部类

  • 匿名内部类一定是跟在一个new关键字后面
  • 匿名内部类可以在外部类成员变量赋值是创建
  • 匿名内部类可以在方法体中直接创建并使用,并且可以与局部内部类一样。可以访问外部方法的final修饰的局部变量
  • 匿名内部类可以在调用方法传参时创建
  • 匿名内部类中拥有外部类对象,即可以使用"外部类名.this"访问外部类成员
//外部类
public class OuterDemo6 {
    //1、在成员变量赋值时创建
    //声明引用变量·并创建匿名内部类对象:new 类名(){}  ----->匿名内部类
    Animal a1 = new Animal() {
        @Override
        public void eat() {
            System.out.println("小狗再吃");
        }
    };

    // 2、在方法内部定义并使用
    public void fun() {
        //匿名内部类---->匿名对象,用完一次机回收
        new Animal() {
            @Override
            public void eat() {
                System.out.println("小猫再吃");
            }
        };
    }

    //3、在方法参数位置创建
    public void m(Animal a) {
        a.eat();
    }

    public static void main(String[] args) {
        new OuterDemo6().m(new Animal() {
            //在方法参数位置创建

            @Override
            public void eat() {
                System.out.println("小鱼再吃");
            }
        });

    }

}

class Animal {
    public void eat() {
        System.out.println("吃东西");
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值