内部类对于新手来说就像是个谜团,极少接触到,也极少用到,更加不知道在什么场景下使用内部类。内部类就是将一个类(内部类)的定义放入另一个类(外围类)的定义内部。内部类更多的是辅助外围类,可以理解为外围类需要一个独立的类来帮助他完成工作。今天我们来介绍一下内部类一些比较常见的用法和特性。
下面先来介绍下内部类的基本用法。
创建一个内部类其实很简单,下图就是一个最简单的定义。(创建内部类、内部类和外围类的互相引用、在方法和作用域中的内部类)
//外围类
public class OutClass {
//内部类
class InnerClass{
}
}
内部类可以访问外围类的成员和元素,而不需要任何特殊条件(外围类在创建了内部类对象以后也可以访问内部类的成员和元素)
public class OutClass {
private String s="this is a OutClass!";
private void output(){
System.out.println(s);
}
class InnerClass{
private String inner ="this is a inner attribute!";
//修改并输出外围类私有属性s
public void innerOutPut(){
OutClass.this.s = "this is a innerClass!";
output();
}
}
//输出内部类私有属性inner
public void visitInnerClass(){
InnerClass innerClass = new InnerClass();
System.out.println(innerClass.inner);
}
public static void main(String[] args){
OutClass o = new OutClass();
InnerClass i = o.new InnerClass();
o.visitInnerClass();
i.innerOutPut();
}
}
上图在创建内部类对象的时候用到了.new的形式在其他对象中创建内部类对象(注意必须使用外围类的对象来创建内部类对象)。在内部类中可以通过对象名+.this的方式引用外围类的属性,当然也可以不写,java会自动默认这种方式。
但是,内部类作用于方法和作用域时,在方法和作用域之外不能直接访问在其中的内部类;当内部类作用于方法中时,可以通过向上转型将方法中的内部类对象引用到了外部,所以方法结束并不意味着内部类对象就不可用了。
匿名内部类以及jdk8的新特性:
匿名内部类应该是这些内部类中最常用的一种类型,他的写法比普通的内部类简单许多,通过new表达式返回的引用被自动向上转型为对接口的引用:
public class OutClass implements OutClassInterface{
public InnerClassInterface innerClassInterface(){
return new InnerClassInterface() {
@Override
public void innerOutPut() {
System.out.println("hello world!");
}
};
}
}
匿名内部类比较多的应用在回调领域,下面是一段判断zk节点是否存在的代码,其中就用匿名内部类作为回调函数,因为有时候一个对象方法的内容是根据具体情况改变的,使用匿名内部类可以很好的解决方法变化频繁,对象确是固定的问题;匿名内部类的关注点是重写方法,而不是对象的复用,所以不需要实际的已声明的对象。
//设置监视点
public void maseterExists(){
zooKeeper.exists("/master",new Watcher() { //得到通知 主节点状态变化,竞选主节点
@Override
public void process(WatchedEvent event) {
if(event.getType().equals(Event.EventType.NodeDeleted)){
assert "/master".equals(event.getPath());
runForMaster();
}
}
},masterExsistCallback,null);
}
这里顺便介绍下jdk8新增的特性lambda表达式,下面的写法更简单:
//设置监视点
public void maseterExists() {
zooKeeper.exists("/master", (event) -> { //得到通知 主节点状态变化,竞选主节点
if (event.getType().equals(Event.EventType.NodeDeleted)) {
assert "/master".equals(event.getPath());
runForMaster();
}
}, masterExsistCallback, null);
}
内部类的继承与覆盖:
内部类和外围类是相互独立的类,所以在继承和覆盖外围类的时候都不会影响的内部类,除非直接继承和覆盖内部类。
嵌套类:
将内部类声明为static通常叫做静态内部类 也叫嵌套类。嵌套类和外围类之间没有直接关联,所以嵌套类的创建不需要外围类对象就可以直接new一个嵌套类对象new InnerClass(),这里还有一个细节点就是在声明嵌套类的时候也可以带上外围类名比如new OutClass .InnerClass();由于static的特性,嵌套类不能调用外围类中非静态的元素和成员,但是嵌套类内部可以包含静态和非静态方法和属性,这一点和内部类有所区别,内部类是不能声明static的。
嵌套类还有一个方便的使用就是在接口中声明嵌套类,在接口中声明的内部类会隐性的加上static,实例化的方式和在类中的嵌套类是一样的。用于给接口的不同实现提供公共嵌套类,实现了该接口的类可以当做是自己的嵌套类使用。
public interface OutClassInterface {
public void outPut();
//接口嵌套类 隐式声明为static
class test implements OutClassInterface {
public void outPut(){
}
}
}
静态内部类有一个重要的应用就是单例模式,利用了classloader的机制来保证初始化instance时只有一个线程,所以是线程安全的,同时没有性能损耗。
public class OutClass implements OutClassInterface{
public static OutClass getInstance(){
return staticClassLazy.outClass;
}
@Override
public void outPut(){
System.out.println("");
}
static class staticClassLazy{
private static OutClass outClass = new OutClass();
}
}
看完java编程思想的内部类,这些是我的读后感和笔记,第一次写还请多多指教。
分享到:
相关推荐
在"匿名内部类解读代码"这个主题中,我们将深入探讨它与工厂模式(Factory Pattern)的核心区别。 首先,让我们了解工厂模式。工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,一个...
在Java编程语言中,匿名类、内部类和本地类是三种特殊的类定义方式,它们各自具有独特的特性和用途。下面将详细解读这三者之间的差异,并通过实例来帮助理解。 首先,**匿名类**是在没有类名的情况下创建的类,通常...
以下是对Java匿名内部类的详细解读: 首先,匿名内部类的创建方式是在`new`关键字后面直接定义类的主体。它可以是类的子类或实现一个接口。例如,如果我们有一个接口`pr`,我们可以这样创建一个匿名内部类: ```...
然而,不当使用Handler,尤其是结合匿名内部类或非静态内部类,可能导致内存泄漏和Native内存增加,这对应用性能和稳定性造成负面影响。 首先,我们要理解内存泄漏的概念。内存泄漏是指程序中已分配的内存没有被...
《2015云计算市场发展趋势及内部威胁解读》 2015年,云计算作为新一代信息技术的代表,正以前所未有的速度推动着智慧城市的发展。阿里巴巴集团与天津市的战略合作,表明了政府对云计算大数据产业的高度重视,这为...
【企业内部控制基本规范解读】 内部控制是企业为了实现其目标,由董事会、管理层及全体员工共同参与的,旨在确保企业经营管理合法合规、资产安全、财务报告及相关信息真实完整,并提高经营效益和效果的一系列程序和...
内部类分为几种类型,包括静态内部类、匿名内部类、成员式内部类和局部内部类。 1. **静态内部类**: 静态内部类与普通的成员变量类似,可以在类的外部直接通过外部类的名字和"."操作符创建对象,不需要外部类的...
《企业内部控制应用指引第 17 号——内部信息传递》是针对企业在内部信息传递过程中可能出现的问题和风险,提供的一套管理和控制策略。这份指引旨在确保企业决策基于准确、完整的信息,避免信息失真导致的决策失误和...
《公路技术状况评定标准JTG5210-2018》是中国公路工程技术标准的重要组成部分,由武汉大学卓越工程研究院进行内部培训解读。这份标准是针对我国公路维护与管理的一项核心规范,旨在确保公路设施的安全、高效和可持续...
具体准则按照作业类、业务类和管理类进行了分类,旨在明确审计程序、审计方法、审计技术以及不同审计类别的要求。新准则对原有准则进行了精简和整合,从29个减少到20个,提高了准则的逻辑性和实用性。内部审计实务...
### 解读PHP类的封装 在面向对象编程中,封装是一种重要的特性,它允许我们将数据(属性)和方法(函数)组织在一起,并控制外部代码如何访问这些数据和方法。PHP作为一种广泛使用的开源脚本语言,支持面向对象编程...
应用指引分为三类:内部环境类、控制活动类和控制手段类。内部环境类包括组织架构、发展战略、人力资源、企业文化和社会责任,是企业内部控制的基础,影响员工的控制意识和行为。例如: 1. 组织架构:规定了董事会...
### 会计继续教育行政事业单位内部控制规范解读 #### 内部控制概述 内部控制是现代行政事业单位管理的重要组成部分,它旨在通过制定一系列制度、措施和程序来防范经济活动中的风险,确保单位经济活动合法合规、...
[精选]解读我国内部控制体系.pptx
【企业内部控制应用指引1-18解读】 组织架构是企业内部控制体系的基础,是构建现代企业制度的核心要素。根据《企业内部控制应用指引第 1 号——组织架构》,它涉及到企业内部的董事会、监事会、经理层及各个层级的...
《单位内部控制规范》是针对行政事业单位管理的一项重要指导文件,旨在强化单位的内部管理,防止腐败,提升公共服务效率。这份规范的制定有多重背景和依据,包括政府对廉洁高效服务型政府的建设需求,事业单位分类...
当我们想要解读随机森林的内部工作时,可以参考Ando Saabas的GitHub项目,该项目提供了可视化工具,帮助我们理解单个决策树以及整个森林的预测贡献。通过观察决策树的不同路径,我们可以看到各个特征如何影响预测...
《企业内部控制基本规范》是企业管理和运营中至关重要的指导文件,旨在通过有效的内部控制体系来确保企业目标的实现,防范潜在风险。全面预算内部控制是其中的关键组成部分,它涉及到企业经营活动的各个方面,包括...
《医疗器械标准分类与解读》这份材料详细阐述了医疗器械标准及其相关概念,对于理解医疗设备行业的规范具有重要意义。标准是为了一定范围内重复性事物和概念达成共识而制定的规范性文件,旨在确保最佳秩序,提高产品...
### 实例解读51单片机完全学习与应用 #### 一、单片机基础知识与应用概述 **1.1 单片机的概念与应用场景** 单片机是一种将微处理器、存储器、输入输出接口等集成在一个芯片上的微型计算机系统。它体积小、成本低...