java的内部类

前言

一、内部类

1.1 实例内部类代码示例(一)

class Outclass{

    public int num1 = 1;
    public int num2 = 2;
    public static int num3 = 3;

    class Innerclass{
        public int num4 = 4;
        public int num5 = 5;
        public void test(){
            System.out.println("内部类中的test方法");
        }
    }

    public void test(){
        System.out.println("外部类中的test方法");
    }
}
public class TestDemo6 {
    public static void main(String[] args) {
        Outclass outclass = new Outclass();
        System.out.println(outclass.num1);
        System.out.println(outclass.num2);
        System.out.println(Outclass.num3);
        outclass.test();
        System.out.println("===================");
        Outclass.Innerclass innerclass = outclass.new Innerclass();
        // Outclass.Innerclass innerclass = new outclass().new Innerclass();
        System.out.println(innerclass.num4);
        System.out.println(innerclass.num5);
        innerclass.test();
    }
}

结果如下:在这里插入图片描述

1.1 实例内部类代码示例(二)

class Outclass{

    public int num1 = 1;
    public int num2 = 2;
    public static int num3 = 3;

    class Innerclass{
        public int num1 = 1111;
        public int num4 = 4;
        public int num5 = 5;

        public static final int num6 = 6;
        public void test(){
            System.out.println("内部类中的test方法");
        }
    }

    public void test(){
        System.out.println("外部类中的test方法");
    }
}
public class TestDemo6 {
    public static void main(String[] args) {
        Outclass outclass = new Outclass();
        System.out.println(outclass.num1);
        System.out.println(outclass.num2);
        System.out.println(Outclass.num3);
        outclass.test();
        System.out.println("===================");
        Outclass.Innerclass innerclass = outclass.new Innerclass();
        System.out.println(innerclass.num1);
        System.out.println(innerclass.num4);
        System.out.println(innerclass.num5);
        innerclass.test();
    }
}

结果如下:在这里插入图片描述

1.1 实例内部类代码示例(三)

class Outclass{
    public int num1 = 1;
    public int num2 = 2;
    public static int num3 = 3;

    class Innerclass{
        public int num4 = 4;
        public int num5 = 5;

        public static final int num6 = 6;
        public void test(){
            System.out.println("内部类中的test方法");
        }
    }

    public void test(){
        System.out.println("外部类中的test方法");
    }
}
public class TestDemo6 {
    public static void main(String[] args) {
        Outclass outclass = new Outclass();
        System.out.println(outclass.num2);
        System.out.println(Outclass.num3);
        outclass.test();
        System.out.println("===================");
        Outclass.Innerclass innerclass = outclass.new Innerclass();
        System.out.println(outclass.num1);
        System.out.println(innerclass.num4);
        System.out.println(innerclass.num5);
        innerclass.test();
    }
}

结果如下:在这里插入图片描述

1.1 实例内部类代码示例(四)

class Outclass{
    public int num1 = 1;
    public int num2 = 2;
    public static int num3 = 3;

    class Innerclass{
        public int num1 = 11;
        public int num4 = 4;
        public int num5 = 5;

        public static final int num6 = 6;
        public void test(){
            System.out.println(Outclass.this.num1);
            System.out.println(num1);
            System.out.println(this.num1);
            System.out.println(num2);
            System.out.println(num3);
            System.out.println(num4);
            System.out.println(num5);
            System.out.println("内部类中的test方法");
        }
    }

    public void test(){
        System.out.println(this.num1);
        System.out.println(num2);
        System.out.println("外部类中的test方法");
    }
}
public class TestDemo6 {
    public static void main(String[] args) {
        Outclass outclass = new Outclass();
        outclass.test();
        System.out.println("===================");
        Outclass.Innerclass innerclass = outclass.new Innerclass();
        innerclass.test();
    }
}

结果如下:在这里插入图片描述

1.1 实例内部类代码示例(五)

class Outclass{
    public int num1 = 1;
    public int num2 = 2;
    public static int num3 = 3;

    class Innerclass{
        public int num1 = 11;
        public int num4 = 4;
        public int num5 = 5;

        public static final int num6 = 6;
        public void test(){
            System.out.println("外部类中的重名成员变量:" + Outclass.this.num1);
            System.out.println("====================");
            System.out.println("内部类中的重名成员变量:" + num1);
            System.out.println("内部类中的重名成员变量:" + this.num1);
            System.out.println("====================");
            System.out.println("外部类中的重名成员变量:" + num2);
            System.out.println("外部类中的重名成员变量:" + num3);
            System.out.println("====================");
            System.out.println("内部类中的重名成员变量:" + num4);
            System.out.println("内部类中的重名成员变量:" + num5);
            System.out.println("内部类中的test方法");
        }
    }

    public void test(){
        System.out.println("外部类中的重名成员变量:" + this.num1);
        System.out.println("外部类中的重名成员变量:" + num2);
        System.out.println("====================");
        Innerclass innerclass = new Innerclass();
        System.out.println("内部类中的重名成员变量:" + innerclass.num4);
        System.out.println("内部类中的重名成员变量:" + innerclass.num5);
        System.out.println("====================");
        System.out.println("外部类中的test方法");
    }
}
public class TestDemo6 {
    public static void main(String[] args) {
        Outclass outclass = new Outclass();
        outclass.test();
        System.out.println("===================");
        Outclass.Innerclass innerclass = outclass.new Innerclass();
        innerclass.test();
    }
}

结果如下:
在这里插入图片描述

1.2 学习小贴士

  1. 外部类中的任何成员都可以在实例内部类方法中直接访问。
  2. 实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束。
  3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名 称.this.同名成员来访问。
  4. 实例内部类对象必须在先有外部类对象前提下才能创建。
  5. 实例内部类的非静态方法中包含了一个指向外部类对象的引用。
  6. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。

二、匿名内部类

2.1 匿名内部类代码示例(一)

interface A{
    void test();
}
public class Test {
    public static void main(String[] args) {
        new A() {
            @Override
            public void test() {
                System.out.println("匿名内部类");
            }
        }.test();
    }
}

结果如下:在这里插入图片描述

2.1 匿名内部类代码示例(二)

interface A{
    void test();
}
public class Test {
    public static void main(String[] args) {
        A a = new A(){
            @Override
            public void test() {
                System.out.println("匿名内部类");
            }
        };
        a.test();
    }
}

结果如下:在这里插入图片描述

2.1 匿名内部类代码示例(三)

interface A{
    void test();
}

public class TestDemo7 {
    public static void main(String[] args) {
       int val = 10;
        new A(){
            @Override
            public void test() {
                System.out.println("值:" + val);//在匿名内部类当中,只能够访问没有被修改过的数据——>变量的捕获
            }
        }.test();
    }
}

结果如下:在这里插入图片描述

三、静态内部类

3.1 静态内部类代码示例(一)

class OutClass{
    public int num1 = 1;
    private int num2 = 2;
    private static int num3 = 3;

    public void test(){
        System.out.println("外部类的test方法");
    }

    static class InnerClass{
        public int num4 = 4;
        private int num5 = 5;
        public static int num6 = 6;
        public void test(){
            System.out.println(num3);
            System.out.println("调用外部类的静态成员变量");
            System.out.println(num4);
            System.out.println(num5);
            System.out.println(num6);
            System.out.println("静态内部类的test方法");
        }
    }
}

public class TestDemo7 {
    public static void main(String[] args) {
        OutClass.InnerClass innerClass = new OutClass.InnerClass();
        innerClass.test();
    }
}

结果如下:在这里插入图片描述

3.1 静态内部类代码示例(二)

class OutClass{
    public int num1 = 1;
    private int num2 = 2;
    private static int num3 = 3;

    public void test(){
        System.out.println("外部类的test方法");
    }

    static class InnerClass{
        public int num4 = 4;
        private int num5 = 5;
        public static int num6 = 6;
        public void test(){
            OutClass outclass = new OutClass();
            System.out.println(outclass.num1);
            System.out.println("访问外部类的普通成员变量");
            System.out.println("==============");
            System.out.println(num3);
            System.out.println("访问外部类的静态成员变量");
            System.out.println(num4);
            System.out.println(num5);
            System.out.println(num6);
            System.out.println("静态内部类的test方法");
        }
    }
}
public class TestDemo7 {
    public static void main(String[] args) {
        OutClass outclass = new OutClass();
        outclass.test();
        System.out.println("===========");
        OutClass.InnerClass innerClass= new OutClass.InnerClass();
        innerClass.test();
    }
}

结果如下:在这里插入图片描述

四、局部内部类

4.1 局部内部类代码示例

public class TestDemo7 {

    public void test(){
        class InnerClass{
            public int num1 =1;
        }
        InnerClass innerClass = new InnerClass();
        System.out.println(innerClass.num1);
    }
    public static void main(String[] args) {
        TestDemo7 testDemo7 = new TestDemo7();
        testDemo7.test();
    }
}

结果如下:在这里插入图片描述

4.2 学习小贴士

【注意事项】

  1. 局部内部类只能在所定义的方法体内部使用
  2. 不能被public、static等修饰符修饰
  3. 编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class

五、总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mo_吉托的莫。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值