JavaSE 基础(十二) 内部类

目录

前言

一.内部类

1.静态内部类

1.1实例化静态内部类的对象

1.2静态内部类中访问外部类成员

1.3 外部类中访问内部类的成员变量 

(1)访问静态成员

(2) 访问非静态成员

2.实例内部类

2.1实例化实例内部类

2.2在实例内部类当中,不能定义静态的成员变量

2.3 外部类访问实例内部类的成员变量

2.4实例内部类中调用外部类的成员变量

3.局部内部类

4.匿名内部类

后记


前言

Hi~ 你好! 

欢迎点击我的博客 : )       

这是我的学习总结,希望也能帮助到你

我的博客地址:hi~,我在这里~,欢迎关注哦,

三连不迷路,优质内容持续更新!

一.内部类

1.静态内部类

class OuterClass {//外部类
    public int data1 = 1;
    private int data2 = 2;//外部类的成员变量
    private static int data3 = 3;//外部类的静态成员变量
    private static final int data4 = 4;//外部类的常量

    public void func(){
        InnerClass innerClass = new InnerClass();
        System.out.println("外部类的成员方法");
        System.out.println(data1);
        System.out.println(data2);
        System.out.println(data3);
        System.out.println(data4);
        System.out.println(innerClass.data5);//外部类的成员方法要想访问内部类的成员变量,通过实例化内部类,用类名来引用
        System.out.println(innerClass.data6);//外部类可以访问静态内部类当中的所有成员 即使是private
        System.out.println(InnerClass.data7);//内部类静态的成员变量可以通过类名访问
        System.out.println(InnerClass.data8);
    }

    static class InnerClass {//静态内部来看
        public int data5 = 5;
        protected int data6 = 6;//内部类的成员方法
        private static int data7 = 7;//内部类的静态成员变量
        private static final int data8 = 8;//内部类的常量
        public void func(){
            System.out.println("静态内部类中的方法");
            OuterClass outerClass = new OuterClass();
           // 静态内部类当中,不能直接访问外部类的非静态成员.可以通过实例化外部类对象的引用来访问
            System.out.println(outerClass.data1);
            System.out.println(outerClass.data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(this.data5);
            System.out.println(data6);
            System.out.println(data7);
            System.out.println(data8);
        }
    }

}
1.1实例化静态内部类的对象
    public static void main(String[] args) {
        OuterClass.InnerClass innerClass= new OuterClass.InnerClass();
        //实例静态内部类,因为是静态的,所以要通过外部类的引用,来调用内部类
        innerClass.func();
    }

实例静态内部类,因为是静态的,所以要通过外部类的引用,来调用内部类

1.2静态内部类中访问外部类成员
           OuterClass outerClass = new OuterClass();
           // 静态内部类当中,不能直接访问外部类的非静态成员.可以通过实例化外部类对象的引用来访问
            System.out.println(outerClass.data1);
            System.out.println(outerClass.data2);

1.静态内部类当中,不能直接访问外部类的非静态成员.

可以通过实例化外部类对象的引用来访问 

1.3 外部类中访问内部类的成员变量 

外部类可以访问静态内部类当中的所有成员, 即使是private

(1)访问静态成员
 System.out.println(InnerClass.data7);

 内部类静态的成员变量可以通过类名访问

(2) 访问非静态成员
InnerClass innerClass = new InnerClass();
System.out.println(innerClass.data5);

外部类的成员方法要想访问内部类的成员变量,通过实例化内部类,用类名来引用 

2.实例内部类

2.1实例化实例内部类
        OuterClass2 outerClass2 = new OuterClass2();
        OuterClass2.InnerClass2 innerClass2 =outerClass2.new InnerClass2();

先实例化外部类的对象再实例化实例内部类,比静态内部类麻烦

2.2在实例内部类当中,不能定义静态的成员变量
         protected int data6 = 6;//内部类的成员方法
        //private static int data7 = 7;//非静态内部类不能定义静态成员,静态成员不依赖于对象

        private static final int data7 = 7;//非静态内部类不能定义静态成员,静态成员不依赖于对象,可以改为常量
        //常量在程序编译的时候,就能确定.变量是在程序运行时,才确定的

  实例内部类不能定义静态成员变量,静态成员不依赖于对象,可以改为常量可以改为常量
  常量在程序编译的时候,就能确定.变量是在程序运行时,才确定的

2.3 外部类访问实例内部类的成员变量
InnerClass2 innerClass2 = new InnerClass2();
System.out.println(innerClass2.data5);
System.out.println(innerClass2.data6);

 先实例化实例内部类对象,再通过对象名引用

2.4实例内部类中调用外部类的成员变量
            System.out.println(new OuterClass2().data1);
            System.out.println(OuterClass2.this.data1);

实例内部类中调用外部类的成员变量,先实例化外部类,在通过类名访问

或者通过外部类类名.this来访问 ,在非静态内部类当中,包含外部类this       

3.局部内部类

class OuterClass3{
    public void func(){
        class InnerClass3{
            public int data = 1;
            public void test(){
                System.out.println("局部内部类");
            }
        }
        InnerClass3 innerClass3 = new InnerClass3();
        innerClass3.test();
    }
}
1.局部内部类只能在所定义的方法体内部使用
2. 不能被 public static 等修饰符修饰

4.匿名内部类

interface Itext1{
    void func();
}
class Test_1 implements Itext1{
    @Override
    public void func() {
        System.out.println("hello");
    }
}

public class Test {
    public static void main(String[] args) {
            new Itext1(){//new接口,在{}内重写方法,一个匿名类实现了接口,重写了方法
                // 等价于上面
                @Override
                public void func() {
                    System.out.println("匿名类666");
                }
            }.func();//调用重写的方法
    }

new接口,在{}内重写方法,一个匿名类实现了接口,重写了方法

后记

看到这里,希望能帮到你~

您的点赞 ,收藏 ,关注 是我创作的最大动力!

同时也欢迎在评论区进行交流,共同进步~       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值