java中的内部类

内部类:定义在类结构中的另一个类:
类中的定义的成员:字段、方法、内部类
为什么使用内部类?

  1. 增强封装,把内部类隐藏在外部类之内,不许其他类访问该类。
  2. 内部类能提高代码的可读性和可维护性,把小型类嵌入到外部类中结构上代码更靠近。
  3. 内部类可以直接访问外部类的成员。
package com.test;
//双向链表
public class LinkledList {//第一个节点private Node first;//最后一个节点private Node last;//火车的车厢是在火车的内部class Node{private Node prev;//上一个节点private Node next;//下一个节点private Object ele;//当前节点存储的数据}
}

外部类的访问修饰符:要么public要么缺省。

内部类看做是外部类的一个成员,那么内部类可以使用public/缺省\protected\private修饰,还可以是static修饰。

内部类分为四种:

  1. 实例内部类:内部类没有使用static修饰
  2. 静态内部类:内部类使用了static修饰
  3. 局部内部类:在方法中定义的内部类
  4. 匿名内部类适合于使用一次使用的类,属于局部内部类的特殊情况。
    对于每个内部类来说:java编译器会生成独立的.class文件。
  5. 成员内部类:外部类$内部类名称
  6. 局部内部类:外部类名$数字&内部类名称
  7. 匿名内部类:外部类名¥数字

实例内部类:没有static修饰内部类,说明内部类属于外部类的对象
特点:

  1. 创建实例内部类前,必须存在外部类对象,通过外部类对象创建内部类对象(当存在内部类对象时,一定存在外部类对象)。
package com.test;class Outer{String name="ok";class Inner{void print(){System.out.println(name);}}
}
public class test1{public static void main(String[] args){Outer out=new Outer();out.new Inner().print();;//通过外部类对uter.Inner in=out.new Inner();}
}
  1. 实例内部类的实例自动持有外部类的实例的引用,内部类可以直接访问外部类成员。
    这里写图片描述
  2. 外部类中不能够直接访问内部类的成员,必须通过内部类的实例去访问。
    class Outer{
    String name="外部类";
    void OuterPrint(){
    System.out.println(new Inner().str);
    }
    class Inner{
    private String str="内部类";
    void print(){
    System.out.println(name);
    }
    }
    }

    “`
  3. 如果实例内部类和外部类存在同名的字段和方法abc,在内部类中:this.abc:表示
    访问内部类成员,反之亦然。

静态内部类:
使用static修饰的内部类。
特点:

  1. 静态内部类的实例不会自动持有外部类的特定实例的引用,在创建内部类的实例时,不必创建外部类的实例。
package com.test;class Outer{static String name="外部类";static class Inner{private static final String str="内部类";void print(){System.out.println(name);}}
}
public class test1{public static void main(String[] args){//不必new Outer().new Inner(),因此不必创建外部类的实例new Outer.Inner().print();}
}

2.静态内部类中可以直接访问外部类的静态成员,如果访问外部类的实例成员,必须通过外部类的实例去访问。

class Outer{static String str="外部类";String s="非静态";static class Inner{static void print(){System.out.println(str);}}
}

3.在静态内部类中可以定义静态成员和实例成员。
4.测试类可以通过完整的类名直接访问静态内部类的静态方法。

package com.test;class Outer{static class Inner{static void print(){System.out.println("静态内部类");}}
}
public class test1{public static void main(String[] args){//不必new Outer().new Inner(),因此不必创建外部类的实例Outer.Inner.print();}
}

局部内部类(没啥用):
在方法中的定义的内部类,其可见范围是当前方法和局部变量是同一个级别。

public class test1{public static void main(String[] args){class Inner{void print(){System.out.println("内部类");}}}
}

1.不能使用public、private、protected和static修饰符。
2.局部内部类只能在当前方法中使用。
3.局部内部类和实力内部类一样,不能包含静态成员。
4.局部内部类和实力内部类,可以访问外部类的所有成员。
5.

局部内部类访问的局部变量必须使用final修饰(在java中自动隐式加上final,但是依然是常量不能改变值)。
这里写图片描述
上述代码报错!!!

package com.test;public class test1{public static void main(String[] args){final int num=17;class Inner{void print(){System.out.println(num);}}new Inner().print();}
}

java 中变量存储位置的区别
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
3. 堆:存放所有new出来的对象。
4. 静态域:存放静态成员(static定义的)
5. 常量池:存放字符串常量和基本类型常量(public static final)。
6. 非RAM存储:硬盘等永久存储空间

如果用final修饰变量就是常量存放在常量池中,当方法被销毁后对象仍然可以调用。这里写图片描述

匿名内部类:是一个没有名称的局部内部类,适合只使用依次的类,是特殊的局部内部类,满足局部内部类特征。
这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中枚举类型详解

枚举类型的引入: 枚举是从java5开始提供的一种新的数据类型,是一个特殊的类,就是固定的多个常量对象的集合。 定义格式: [修饰]enum 枚举类名 { 常量A,常量B,常量C; } 代码: package com.test;enum Weekday {…

Hbase 预写日志WAL处理源码分析之 LogCleaner

目录 Hlog WALs和oldWALs 整体流程 HMaster 初始化 定时执行 LogCleaner 日志清理类 ReplicationLogCleaner 日志清理类 总结 Hlog WALs和oldWALs 这里先介绍一下Hlog失效和Hlog删除的规则 HLog失效:写入数据一旦从MemStore中刷新到磁盘,…

Dubbo 2.7.x admin 控制台管理提示 : 无元数据信息,请升级至Dubbo2.7及以上版本

版本:2.7.3 安装完Dubbo admin 运行后,查询服务提示 无元数据信息,请升级至Dubbo2.7及以上版本,或者查看application.properties中关于config center的配置,详见 这里 这里描述着处理方法:https://github…

Unity在运行时(代码中)设置材质的渲染模式(RenderingMode)

在Unity中,有些少数情况下我们需要用代码来创建材质。比如说在材质非常多,而仅仅是纹理不一样的时候。 而用代码创建的材质是没有对应的资源文件的,我们也就无法使用Inspector来设置它的Rendering Mode。 关于Rendering Mode,许我…

java中String与new String的区别

String类:表示不可改变的字符串,当前对象创建完毕之后,该对象的内容(字符序列)是不能改变的,一旦内容改变就是一个新的对象。 String对象的创建: 1):直接赋一个字面量&a…

Yarn 监控 - 监控任务运行状态 (包括Spark,MR 所有在Yarn中运行的任务)

目录 Maven pom引用 配置文件 代码 平时开发中可以在yarn的web页面查看应用程序运行状态&#xff0c;如下图 下面代码实现了&#xff0c;代码监控Yarn运行程序&#xff0c;可以对部分任务进行实时监控 Maven pom引用 这里Demo使用的hadoop版本是 3.0.0 <dependency>…

HugeGraph 图数据库索引介绍 - 范围索引,全文索引

目录 HugeGraph 索引介绍 二级索引 组合索引 范围索引 全文索引 HugeGraph 索引介绍 二级索引 创建schema和添加数据 schema.propertyKey("name").asText().ifNotExist().create();schema.propertyKey("uid").asLong().ifNotExist().create();schem…

Hbase JMX 监控 - Region

获取Region监控信息页面&#xff1a; http://regionServerName:16030/jmx?qryHadoop:serviceHBase,nameRegionServer,subRegions 获得数据如下 参数代表含义 *** 为前缀代表&#xff1a;Namespace_${namespace}_table_${tableName}_region_${regionName} ***_metric_storeCo…

c++ 之类的前置声明

转自&#xff1a;http://blog.csdn.net/fjb2080/archive/2010/04/27/5533514.aspx 作者&#xff1a;清林&#xff0c;博客名&#xff1a;飞空静渡 刚开始学习c的人都会遇到这样的问题&#xff1a; 定义一个类 class A&#xff0c;这个类里面使用了类B的对象b&#xff0c;然后定…

Hbase Compaction 源码分析 - RatioBasedCompactionPolicy 策略

目录 类的关系图 ​ RatioBasedCompactionPolicy selectCompaction 方法 getCurrentEligibleFiles方法 skipLargeFiles方法 createCompactionRequest方法 filterBulk方法 applyCompactionPolicy方法 removeExcessFiles方法 setIsMajor方法 其他相关文章 Hbase Compa…

Hbase Compaction 源码分析 - CompactSplitThread 线程池选择

目录 CompactSplitThread requestCompactionInternal方法 selectCompaction方法 requestCompaction方法 其他相关文章 Hbase Compaction 源码分析 - CompactionChecker Hbase Compaction 源码分析 - RatioBasedCompactionPolicy 策略 Hbase Compaction 源码分析 - CompactS…

Hbase Compaction 队列数量较大分析

目录 问题 问题原因分析 总结建议 问题 前几天朋友公司Hbase集群出现Compaction队列持续处于比较大的情况&#xff0c;并且mem flush队列也比较大&#xff0c;一起看了下问题&#xff0c;大概情况如下图 从图中可以看出来压缩队列总和持续在1000-2000&#xff0c;平对压缩队列…

Hbase 2.x Region in transition (永久RIT) 异常解决

环境 Hbase 版本&#xff1a;2.0 问题原因 hbase长时间出现RIT&#xff0c;并且发生RIT的Region是已经删除了的Hbase表&#xff0c;表未删除的情况下执行assgin可以消除该问题 Hbase Region in transition (RIT) 异常解决&#xff1a;https://datamining.blog.csdn.net/artic…

sigslot库源码分析

言归正传&#xff0c;sigslot是一个用标准C语法实现的信号与槽机制的函数库&#xff0c;类型和线程安全。提到信号与槽机制&#xff0c;恐怕最容易想到的就是大名鼎鼎的Qt所支持的对象之间通信的模式吧。不过这里的信号与槽虽然在概念上等价与Qt所实现的信号与槽&#xff0c;但…

Hue开发指南 - 提交 Spark 程序

目录 Hue开发指南 1.Spark文件打包成一个Jar包提交Hue运行 1.1 上传Spark Jar包至HDFS文件系统 1.2.Hue中创建Spark任务 2.多jar包导入执行&#xff08;依赖jar包与主程序jar包分开打包&#xff09; 2.1 修改worksapce 2.2 添加程序依赖jar包 Hue开发指南 Hue是面向 Had…

如何缩小码农和高手的差距

为什么同样的时间有的人可以漂亮的完成工作&#xff0c;而有些人废了很大的力气也没有完成&#xff1f;前者我们常常称之为“大牛”&#xff0c;后者我们常常叫他们“菜鸟”。当然“大牛”都是相对而言的&#xff0c;“大牛”也不可能方方面面都非常厉害&#xff0c;换句话说大…

OpenResty 安装,收集日志保存到文本文件

目录 安装 1.安装相关类库 2.安装编译openresty 3.编写配置启动openresty服务 4.通过 openresty 保存日志数据到系统 安装 1.安装相关类库 yum install -y readline-devel pcre-devel openssl-devel gcc 2.安装编译openresty wget https://openresty.org/download/open…

Hadoop Yarn REST API未授权漏洞利用挖矿分析

目录 一、背景情况 二、 漏洞说明 攻击步骤&#xff1a; 三、入侵分析 四、安全建议 清理病毒 安全加固 五、IOCs 一、背景情况 5月5日腾讯云安全曾针对攻击者利用Hadoop Yarn资源管理系统REST API未授权漏洞对服务器进行攻击&#xff0c;攻击者可以在未授权的情况…

Linux shell编程学习总结

主要内容&#xff1a; shell编程sed命令awk命令crontab定时器 什么是Shell&#xff1f; Shell是用户与内核进行交互操作的一种接口&#xff0c;目前最流行的Shell称为bash Shell Shell也是一门编程语言<解释型的编程语言>&#xff0c;即shell脚本 一个系统可以存在多…