Java—内部类

在这里插入图片描述


一、内部类

一个类的定义出现在另外一个类,那么这个出现的类就叫内部类(Inner)。
内部类所在的类叫做外部类(Outer)。
在这里插入图片描述

二、应用特点

一个类对应提供的内容仅仅是为某一个类单独服务
可以直接访问外部类的私有的成员变量

三、分类

3.1、普通内部类:直接将一个类的定义放在另外一个类的类体中

1、定义格式
在这里插入图片描述
2、调用方式
在这里插入图片描述
3、特点:
普通内部类和普通类一样
普通内部类权限修饰符都可以用
创建调用普通内部类,需要外部类实例对象来创建内部类对象
final可修饰内部类

4、案例

内部类访问外部类的成员变量:外部类类名.this.id
内部类访问内部类的成员变量:this.id
直接访问id:形参中传递的id

package com.company.innerp;

public class NormalInnerDemo {
    //成员变量
    private int id = 1;
    //定义普通内部类
    public class NormalInner{
//    private class NormalInner{
        //内部类的成员变量
        private String name = "inner";
        private int id =2;

        public NormalInner(String name){
            this.name=name;
            System.out.println("普通内部类NormalInner的有参构造方法");
        }
        public NormalInner(){
            System.out.println("普通内部类NormalInner的无参构造方法");
        }
        public void show(){
            //可以直接访问外部类的私有化的成员变量
            System.out.println("外部类NormalInnerDemo变量id"+id);
            System.out.println("普通内部类NormalInner变量name"+name);
        }

        public void show1(int id){
            //可以直接访问外部类的私有化的成员变量
            System.out.println("变量id:"+id);  //形参内容  就近原则
            System.out.println("外部类id:"+ NormalInnerDemo.this.id);  //外部类的id  类名.this.id
            System.out.println("内部类id:"+ this.id);         //内部类的id    this.id
        }
    }
}
package com.company.innerp;

public class innerTest {
    public static void main(String[] args) {
        //1、外部类实例化
        NormalInnerDemo outer = new NormalInnerDemo();
        //2、普通内部类实例化
        NormalInnerDemo.NormalInner inner = outer.new NormalInner();

        //3、调用show方法
        inner.show();

        inner.show1(8);
    }
}

3.2、静态内部类

使用static修饰的内部类,属于类层级。

1、定义格式
在这里插入图片描述

2、调用方式
在这里插入图片描述
3、特点
静态内部类:不能直接访问外部类的非静态成员。
静态内部类:可以直接创建对象
如果静态内部类访问外部类中与本类同名的成员变量或者方法时,需要使用类名.的方式访问。

案例:静态内部类:不能直接访问外部类的非静态成员。
在这里插入图片描述

package com.company.innerp;

public class StaticInnerDemo {
    //成员变量
    private int id = 1;
    private static int sid = 2;

    //定义静态内部类
    public static class StaticInner{
        //内部类的成员变量
        private String name = "inner";
//        private int id =2;
        private static int sid =4;

        public StaticInner(){
            this.name=name;
            System.out.println("静态内部类StaticInner的构造方法");
        }

        public void show(){
            //可以直接访问外部类的私有化的成员变量
            System.out.println("外部类StaticInner的静态变量sid"+ sid);
            System.out.println("内部类StaticInner的成员变量sid"+ sid);

//            System.out.println("外部类StaticInner的成员变量id"+ id);
        }

        public void show1(int sid){
            System.out.println("-----------------------------------------------------");
            System.out.println("形参变量sid:"+sid);   //局部优先
            //内部类的成员id
            System.out.println("静态内部类StaticInner的静态成员变量sid值是:"+StaticInner.sid);
            System.out.println("静态外部类StaticInnerDemo的静态成员变量sid值是:"+StaticInnerDemo.sid);

        }

    }


    public static void main(String[] args) {
        StaticInnerDemo.StaticInner s=new StaticInnerDemo.StaticInner();
        s.show();
        s.show1(8);
    }
}

执行结果:

静态内部类StaticInner的构造方法
外部类StaticInner的静态变量sid4
内部类StaticInner的成员变量sid4
-----------------------------------------------------
形参变量sid8
静态内部类StaticInner的静态成员变量sid值是:4
静态外部类StaticInnerDemo的静态成员变量sid值是:2

Process finished with exit code 0

3.3、局部内部类

直接将一个类的定义放在方法体的内部
1、定义格式
在这里插入图片描述
2、调用
在这里插入图片描述
3、特点:
局部内部类只能在方法的内部可以使用
局部内部类可以在方法体内直接创建对应对象

package com.company.innerp;

public class JubuInnerDemo {
    private int aid = 2;

    public void show(){
        //定义局部内部类 局部内部类:只在当前方法体的内部使用 不能用访问修饰符
        class AreaInner{
            private int id = 1;

            public AreaInner() {
                System.out.println("局部内部类AreaInner的构造方法");
            }

            public void testArea(){
                System.out.println("局部内部类AreaInner的id的值:"+id);
                System.out.println("AreaInnerDemo的aid的值:"+aid);

            }
        }

        //声明局部内部类的引用指向局部内部类的对象
        AreaInner areaInner = new AreaInner();
        areaInner.testArea();

    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

敲代码敲到头发茂密

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

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

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

打赏作者

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

抵扣说明:

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

余额充值