首页 > 其他分享 >内部类

内部类

时间:2023-04-14 21:35:17浏览次数:16  
标签:Node 定义 静态 static class 内部

在一个.java源文件中,只能定义一个类名与文件名完全一致的公开类,使用public class关键字来修饰。但在面向对象语言中,任何一个类都可以在内部定义另外一个类,前者为外部类,后者为内部类。内部类本身就是类的一个属性,与其他属性定义方式一致。比如,属性字段private static String str,由访问控制符、是否静态、类型、变量名组成,而内部类private static class Inner{},也是按这样的顺序来定义的,类型可以为class、enum、甚至是interface,当然在内部类中定义接口是不推荐。内部类可以是静态和非静态的,它可以出现在属性定义、方法体和表达式中,甚至可以匿名出现,具体分为如下四种。
 ·静态内部类,如:static class StaticInnerClass{};
 ·成员内部类,如:private class InstanceInnerClass{};
 ·局部内部类,定义在方法或者表达式内部;
 ·匿名内部类,如:(new Thread(){}).start()。
如下是最精简的4种内部类定义方式:

点击查看代码
 public class OuterClass {
   
  // 成员内部类 
  private class InstanceInnerClass {}

  // 静态内部类
  static class StaticInnerClass {}
  
  public static void main(String[] args) {

   // 两个匿名内部类,分别对应图2-1所示的OuterClass$1和OuterClass$2
   (new Thread(){}).start();
   (new Thread(){}).start();
  
  // 两个方法内部类,分别对应图2-1所示的OuterClass$1MethodClass1和
  // OuterClass$1MethodClass2
  class MethodClass1{}
  class MethodClass2{}  
 } 
}
无论是什么类型的内部类,都会编译成一个独立的.class文件。 外部类与内部类之间使用$符号分割,匿名内部类使用数字进行编号,而方法内部类,在类名前还有一个编号来标识是哪个方法。匿名内部类和静态内部类是比较常用的方式。在本书的示例代码中经常使用匿名类来启动线程,节约了若干行代码。而静态内部类是最常用的内部表现形式,外部可以使用OuterClass.StaticInnerClass直接访问,类加载与外部类在同一个阶段进行,在JDK源码中定义包内可见静态内部类的方式很常见,这样做的好处是: (1)作用域不会扩散到包外 (2)可以通过“外部类.内部类”的方式直接访问 (3)内部类可以访问外部类中的所有静态属性和方法
点击查看代码
static class Node<K,V> implements Map.Entry<K,V> {
  final int hash;
  final K key;
  volatile V val;
  volatile Node<K,V> next;
}
如上所示的源码是在ConcurrentHashMap中定义的Node静态内部类,用于表示一个节点数据,属于包内可见,包内其他集合要用到这个Node时,直接使用ConcurrentHashMap.Node。仅包内可见,可以阻止外部程序随意使用此类来生成对象,Node的父类Entry是Map的静态内部类,之所以可以被Node成功继承,是因为两个外部类同属一个包。在JDK源码中,使用内部类封装某种和操作的方式比较常见,比如应用类加载器Launcher的AppClassLoader,ReentrantLock中继承自AbstractQueuedSynchronizer的内部类Sync,ArrayList中的私有成员内部类SubList。内部类中还可以定义内部类,形成多层嵌套,如在ThreadLocal静态内部类ThreadLocalMap中还定义一个内部类Entry。 因为访问权限可见,所以在同一个包内的Thread可以直接使用如下方式声明自己的属性: ThreadLocal.ThreadLocalMap threadLocals = null; ThreadLocal.ThreadlLocalMap inheritableThreadLocals = null;

标签:Node,定义,静态,static,class,内部
From: https://www.cnblogs.com/ganjing/p/17317036.html

相关文章

  • 业财一体化,实现内部数据语言的统一
    创业是一场没有终点的修炼,基本功是否扎实直接关系着企业能走多远。疫情之下,创业公司在企业经营、组织管理上的短板和盲区被暴露无遗,管理基本功也成为企业核心管理层的重要考验和必修课。特别邀请了原永辉超市财务总监、财得得创始人徐薇,讲授了创业公司的顶层财务模型设计、财务组......
  • HashMap内部的bucket(桶)数组长度为什么一直都是2的整数次幂?
    这样做有两个好处:第一,可以通过(table.length-1)&key.hash()这样的位运算快速寻址,第二,在HashMap扩容的时候可以保证同一个桶中的元素均匀的散列到新的桶中,具体一点就是同一个桶中的元素在扩容后一半留在原先的桶中,一半放到了新的桶中。......
  • 参加2015 qcon 回来的分享及年末做一次内部“监控演进分享”
          有幸参加2015的qcon三天会议,回来做的分享:               年末内部又有机会做一次监控的演进分享             知识的总结.............
  • 02_JAVA匿名内部类
    匿名对象就是没有名字的对象匿名对象的应用场景A:调用方法,仅仅只调用一次的时候。(调用多次的时候不适合,且匿名对象调用完毕就是垃圾,可以被回收器回收)//newStudent().show();B:匿名对象可以作为实际参数传递。StudentDemosd=newsStudentDemo();//Studentss=newSt......
  • Java基础知识点内部类之成员内部类
    一:概述1.成员内部类顾名思义就是写在成员位置的,属于外部类成员。2.成员变量可以被一些修饰符所修饰,比如:private,default,public,static等。3.在成员内部类中,jdk16之前不能定义静态变量,jdk16开始才可以定义静态变量。二;获取内部类对象方法一;当成员内部类被private修饰时,在外部类中......
  • 原生JS修改输入框value,并触发前端框架改变内部管理的响应式数据
    背景有时候,我们需要在一个网站上重复地执行某些操作,例如:输入>查询>输入>查询······这时候,我们可以写一个js自动化脚本执行这些操作,来保护我们的手指关节,以及键盘鼠标。对于大多数网站来说,使用web框架如vue进行开发,这些框架使用内部的响应式系统来管理数据,针对input元素,v......
  • 基于交替方向乘子法与纳什谈判的社区微网电能共享模型 代码主要做的是一个社区微网内
    基于交替方向乘子法与纳什谈判的社区微网电能共享模型主要内容:代码主要做的是一个社区微网内部产消者之间P2P电能交易与共享的问题。构建了基于合作博弈多产消者电能共享模型,在社区微网储能装置的约束下进行P2P电能交易,以社会福利最大化为目标函数,构建了P2P交易模型,并通过ADMM法......
  • 内部类会暂停主类/线程创建方案
        //创建新线程处理联网动作,并更新屏幕(newThread(){publicvoidrun(){UiApplication.getUiApplication().invokeLater(newRunnable(){publ......
  • (已解决)安装PyMySQL出现问题--'pip' 不是内部或外部命令,也不是可运行的程序 或批处理文
    问题描述:输入cmd,进入命令窗口,输入pipinstallpymysql时候出现下面的问题: 然后进入python环境中去输入还是报错:问题原因:环境变量配置出错,cmd下无法调用pip程序。解决办法:①首先退出python环境,输入命令:exit() ②然后去电脑里面找到python的安装位置,如图类似这样的文件......
  • C++逆向分析——友元、内部类、命名空间和static
    友元友元可以理解为:朋友、元素;老师认为这个友元是C++中的一个垃圾,因为友元的存在破坏了面向对象的封装性,不推荐使用,之所以有这个章节是因为有人不了解这个概念。注意:在一些新版本的C++编译器里面已经不再提供类似于友元这样的特性了。大家都知道在C++中对象的私有成员,外部是无......