java内部类

    通过本篇文章,读者会深入理解到什么是内部类?如何使用内部类?在什么情况下使用内部类。言归正传,我们正式开始

  有多少种内部类?

(这段话出自effectivejava):嵌套类是指定义在另一个类得内部类。嵌套类存在的目的应该只是为了它的外围类提供服务。如果嵌套类将会可能用于其他的某个环境中,它就应该是顶层类。嵌套类有四种:静态成员类、非静态成员类、匿名类、和局部类。除了第一个外,其他三种都成为内部类

在这里插入图片描述
    今天要讲的就是上面代码给出的4种创建桥套类的方式。让我们开始一个个分别介绍一下它们的作用

  静态成员类

    在effectivejava中(没错又是它,确实是本好书)第24条:静态成员类优于非静态成员类。
接下里让我们来看看它们之间两则的区别

    //静态成员类
    static class StaticClass{

    }
    public static class StaticClass{

    }
    private static class StaticClass{

    }
    protected static class StaticClass{

    }

静态成员类跟一般的方法、域一样可以用四种作用域修饰。它们的作用也是一样。最好把它看成普通的类,只是碰巧被声明在另一个类的内部而已,它可以访问外围类的所有成员,包括声明私有的成员。
在这里插入图片描述

静态成员类和外围类的关系

    太多了我就不一一全部演示了,可以得出结果在静态成员类中,外围类对它来说都是可见的。
现在我把方法调用删掉。就会神奇一幕
在这里插入图片描述
在这里插入图片描述
这张图是不是让你觉得有点误解,觉得和NestedClass有一定的关系。看下面这张
在这里插入图片描述

结果都一样只会打印1,也就是说静态成员类在被加载到jvm中,外围类是不会被加载的。反之亦然,只调用外围类而不使用静态成员类。只会打印2。它们两者是相互独立的加载到jvm当中,这有什么什么好处呢?单例模式!延用我在effective中的图
在这里插入图片描述
但是这有一点问题。就是第一次用的时候需要先加载,对于有性能要求的而言,建议使用其他方法。如:DCL(Double check Lock)可以看我effectivejava 第83条。

  非静态成员类

  非静态成员一样拥有四种作用域修饰。其作用也是类似的。

  非静态成员类与外围类的关系

    每一个静态成员类在创建的时候都会隐含地与外围类的一个外围实例相关联。设想代码如下

public class NestedClass {
	 class NonStaticClass {
			NonStaticClass(NestedClass nestedClass  ){ 
			   NestedClass.this = nestedClass ;
			}
    }	
 }

在这里插入图片描述
这样的代码已经够明显了吧,非静态成员类实例对象中存在一个外围实例对象的应用。那么该该外围对象能引用啥!那我非静态内部类就能操作啥!什么实例域,实例方法。

注意:前面提到每一个静态成员类实例在创建的时候都会隐含地与外围类的一个外围实例相关联,那么也就是内非静态成员类只有在外围实例创建它时,他才会初始化,这导致一个什么样的问题?–>非静态成员类不能有静态方法非final修饰的静态域
在这里插入图片描述
首先又要重复介绍一下 final staic 和 static 的区别了:被static final 修饰的属性还是方法 是在类初始化之前就已经初始化完成类还未被jvm加载进入的时候,他就会先加载被static final修饰的属性和方法。然而static是在加载后在初始化(这里要注意Enum类除外 详细看第34条: Effective java

    光static修饰的方法和域只有在类被加载到jvm当中才会被加载,所以如果能让你调用。那么在外围类还没有初始化的时候,非静态成员内部类已经初始化了,这明显和前面提到的相违背。

  非静态成员类的作用

    显然我们已经知道了非静态成员类能调用外围类的什么东西,那么到底他有什么作用呢?

作为该实例的工具(经验不足,等待补充)

如迭代器Iterator。

    匿名类

沿用 Java编程思想第8版本的图
在这里插入图片描述
这个类的创建很奇怪,仿佛看上去像是定义了一个属性。然而最后却是定义了一个类。这里就不详细展开了不然又涉及到lambda和流。简单提一点自己个人理解

其实跟聚合差不多,把类当作属放到了另一个类当中,然后该类是一个抽象类,或者是接口。里面有需要实现的方法。然而每个类对于实现的方法无法很好的复用。需要重写这些方法。所以就会产生这种匿名类。

    局部类

在这里插入图片描述
大概的用法就是这样,他跟匿名类有一点像。上次代码完全可以改成
在这里插入图片描述
当然啦!这只是一个方法,是一个函数接口如果多个方法就不能替换了。用法呢,其实跟之前差不多也是为了提供特定的实现方法。

谢谢观看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值