Java 的内部类


1.创建内部类

  • 内部类定义在外部类的内部;
  • 内部类可以是静态的,也可以用 public default protected private 修饰,而外部类只能用 public default 修饰;
  • 内部类的成员变量,方法名可以与外部类相同;
  • 编译成功后会出现 Outer.class 和 Outer$Inner.class 两个类;

2. 外部类访问内部类

  • 外部类不能直接使用内部类的成员和方法,必须先使用外部类对象来创建内部类对象;
class out {
    void m() {
        System.out.println("out");
    }

    class in {
        void m() {
            System.out.println("in");
        }
    }
}

public class test {
    public static void main(String[] args) {
        //创建内部类的对象
        //方法1
        out.in i = new out().new in();
		//方法2
		out o =new out();
        out.in i =o.new in();
        i.m();
    }
}

3. 内部类访问外部类

  • 成员内部类可以访问外部类的所有数据,包括私有数据;
  • 如果外部类与内部类有重名的成员变量或方法,内部类就近原则先访问自己的,但是可以用 外部类名.this 来访问外部类;
class out {
    void m() {
        System.out.println("out");
    }

    class in {
        void m() {
            System.out.println("in");
            out.this.m();
        }
    }
}

public class test {
    public static void main(String[] args) {
        out.in i = new out().new in();
        i.m();
    }
}

4. 匿名内部类

  • 匿名类指没有命名的类,多体现在链式编程中:
public class test {
    public static void main(String[] args) {
        new String();
    }
}
  • 而匿名内部类是没有名字的内部类,是最常用的内部类,用来简化实现类的创建;
  • 匿名内部类做的事情是创建一个类的子类对象;
  • 匿名内部类没有构造器,大部分情况用于接口回调;
  • 匿名内部类用于继承或实现时,不需要增加额外的方法,因为它只是对集成方法的实现或重写;
  • 匿名对象可以直接访问标记了 final 的外层局部变量、对象的字段与静态变量,而成员变量在内部类中会被当成 final 修饰;
  • 匿名内部类在编译的时候由系统自动命名为 Outter$1.class;
  • 在 swing 编程中,使用匿名内部类可以使代码更容易维护;
  • 创建匿名类时,要先创建匿名类的接口,否则编译时提示匿名类不存在,如下图所示,在用匿名内部类 new FlyAble(){} 时,要先有 abstract class FlyAble;
abstract class FlyAble {
    public abstract void fly();
}

public class test {
    public static void main(String[] args) {
        new FlyAble() {
            public void fly() {
                System.out.println("can fly");
            }
        }.fly();
    }
}

5. 局部内部类

  • 定义在方法或一个作用域内,像方法内的一个局部变量一样,不能用 public protected private static 修饰;
public class test {
    void internalTracking(boolean b) {
        if (b) {
            class in {
                //局部内部类
            }
        }
    }

    void track() {
        internalTracking(true);
    }

    public static void main(String[] args) {
        test t1 = new test();
        t1.track();
    }
}

6. 静态内部类

  • 加 static 的内部类是静态内部类,在没有外部类的对象时也可以直接创建静态内部类的对象,
  • 不能直接访问外部类的非静态成员变量或方法,但可以创建外部类对象来访问;
class out {
    int o = 2;

    static class in {
        int i = 1;

        void in() {
            System.out.println(i);
            System.out.println(new out().o);
        }
    }
}

public class test {
    public static void main(String[] args) {
        out.in i = new out.in();//这里引用了外部类,与非静态内部类创建对象:out.in i = new out().new in();不同
        i.in();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值