java内部类和静态内部类区别_静态内部类对象的创建

java内部类和静态内部类区别_静态内部类对象的创建在阅读JavaCollectionFramwork时,LinkedList中有个静态内部类:privatestaticclassNode<E>{Eitem;Node<E>next;Node<E>prev;Node(Node<E>prev,Eelem…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

在阅读Java Collection Framwork时,LinkedList中有个静态内部类:

  private static class Node<E> { 
   
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) { 
   
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

它为什么被定义成静态呢?从之前的学习中,我们应该对静态这个关键字有一定的了解,静态代表它是属于类的,而不是属于实例的。我们可以通过类名直接对静态的玩意儿直接进行引用,但这里的Node静态内部类却是私有的。
为了找到静态内部类和普通内部类的区别,我使用jad工具,自己重写一个类似的Node类,对其进行反编译后发现:

普通内部类版本:

private class List$Node
{ 
   
    List$Node next;
    List$Node pre;
    Object data;
    final List this$0;

    List$Node(List$Node pre, Object data, List$Node next)
    { 
   
        this$0 = List.this;
        super();
        this.next = next;
        this.pre = pre;
        this.data = data;
    }
}

静态内部类版本:

private static class List$Node
{ 
   
    List$Node next;
    List$Node pre;
    Object data;

    List$Node(List$Node pre, Object data, List$Node next)
    { 
   
        this.next = next;
        this.pre = pre;
        this.data = data;
    }
}

嗯,从以上例子有可以发现,区别很明显:
在非静态的内部类中,存在一个隐藏的外部类引用字段,在构造内部类时,用于指向外部类的引用。每次生成一个非静态的内部类实例,都会有这样的操作。
恰巧Node类只是外部类的一个组件,他不需要引用外部类的任何字段,所以,把它声明成静态的能减小不必要的消耗。

所以,在定义一个内部类时,如果该内部类不需要引用外部类的非静态属性/方法,则应该将它声明为静态的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183210.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Latex 参考文献上标

    Latex 参考文献上标1.如何使连续的参考文献能够中间用破折号连起来?比如[6,7,8,9]变成[6-9]?方法:在文档开始前加上下面的语句命令\usepackage[numbers,sort&compress]{natbib}不但可以压缩参考文献标号,还可以进行排序,即无论正文里面的顺序怎样,显示出来都是先后顺序。在elsevier模板中,natbib包已经默认引用了,无需重新引用,改一下natb

    2022年9月10日
    0
  • 什么是静态代理和动态代理,两者的区别(笔记)「建议收藏」

    什么是静态代理和动态代理,两者的区别(笔记)「建议收藏」文章目录1.什么是代理?2.静态代理3.动态代理4.总结:1.什么是代理?​ 代理:就是让代理角色帮助真实角色完成一件事情;​ 举例:过年回家让朋友代买火车票,朋友帮你买火车票的过程就是代理2.静态代理​ 什么是静态代理:静态代理相当于是多写了一个代理类,在调用的时候调用的是代理类,在代理类中的处理还是原生的处理逻辑,不过在前后添加上需要添加的代码。缺点:需要为每一个被代理的对象都创建一个代理类。​ 特点:​ 代理角色和真实角色都需要实现同一个接口,​ 真实角色专注于自己的.

    2022年10月19日
    1
  • qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

    qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

    2021年12月5日
    36
  • mysql 查看函数fsync_fsync()函数 Unix/Linux「建议收藏」

    mysql 查看函数fsync_fsync()函数 Unix/Linux「建议收藏」fsync,fdatasync-同步文件在内核态与存储设备内容简介#includeintfsync(intfd);intfdatasync(intfd);描述fsync()transfers(“flushes”)allmodifiedin-coredataof(i.e.,modifiedbuffercachepagesfor)thefilereferre…

    2022年5月18日
    46
  • 基金基础知识

    基金基础知识基金基础知识文章目录基金的基础知识基金分类基金交易基金的费用指数基金种类估值方法专有名词解释问题解答规则本篇文章仅限于本人学习基金的笔记。基金的基础知识基金是最适合普通人的投资工具,这里要讲的“基金”属于广义基金下的证券投资基金。证券投资基金通俗的讲就是大家把钱凑在一起统一交给基金公司管理,基金公司会任命基金经理专门打理这笔钱,用于投资股票、债券等。基金收益性:大多数人并不具备金融投资的知识和能力。但基金经理则不同,他们受过专业的教育,具备投资的知识和能力。怎样的收益

    2022年5月27日
    37
  • ASP.NET Jumpstart:Media Share Library Starter Kit 简介

    ASP.NET Jumpstart:Media Share Library Starter Kit 简介

    2022年3月12日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号