Java中的几种内部类

Java中的几种内部类

  1. 成员内部类
  2. 静态内部类
  3. 匿名内部类
  4. 局部内部类

成员内部类:顾名思义,就是类里面有一个类,例子如下:

public class Outer { // 外部类
    private int id = 10;//外部类的私有属性
    public void out()
    {
        System.out.println("外部类方法.");
    }

    class Inner{//成员内部类
        public void in()
        {
            System.out.println("内部类方法.");
        }
    }
}

但是如果需要创建内部类的对象的话应该怎么做呢?

骚操作来了:

public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner =  outer.new Inner(); // 创建内部类对象
        inner.in();
    }
}

输出的结果如下:

内部类方法.

不知道大家注意到没,我特意给外部类设置了一个私有属性,看看内部类能不能访问:

    class Inner{
        public void in()
        {
            System.out.println("内部类方法.");
        }

        public int getID()// 可以访问外部类的私有属性~
        {
            return id; 
        }
    }

结果是可以的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q2ZYugMZ-1616338345772)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210321222010889.png)]

总结一下:

成员内部类可以被public修饰符修饰,我们知道在Java文件中可以存在多个class,但是只有一个class能被public修饰,这一点要与成员内部类区分,而且内部类可以访问外类的私有属性。

静态内部类:其实应用也很简单,就是在成员内部类添加static关键字修饰符就可以。但是同样也有几点需要注意:

一旦内部类添加了static关键字以后,就不能对外部类的私有属性进行访问了,原因是此时的内部类是在类加载的时候就被加载了进来,它属于类,而私有属性是在外部类进行实例化以后才加载出来,是属于对象。如果此时还是想要对其进行访问需要给私有属性也添加static关键字。

局部内部类:这个其实也很简单,就是在成员方法中添加内部类:

public class Outer {
    private int id = 10;//私有属性

    public void out()//成员方法
    {
        class Inner{ // 局部内部类
            public void in()
            {
                System.out.println("局部内部类.");
            }
        }
    }
}

匿名内部类:没有名字去初始化类,不用将实例保存在变量中,有点抽象,先看代码:

public class Test {
    public static void main(String[] args) {
        new Apple().eat();//匿名内部类调用方法
    }
}

class Apple{
    public void eat()
    {
        System.out.println("I eat a apple.");
    }
}

上述的new Apple就是一个匿名内部类,是不是看上去很简单,下面来点好玩的:

public class Test {
    public static void main(String[] args) {
        new Apple().eat();//匿名内部类

        new UserService(){//匿名实现接口
            @Override
            public void ServiceTest() {
                System.out.println("测试服务器接口...");
            }
        };
    }
}

class Apple{
    public void eat()
    {
        System.out.println("I eat a apple.");
    }
}

interface UserService{ 
     void ServiceTest();
}

匿名接口实现也是匿名内部类的一种高阶玩法~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值