内部类对于新手来说就像是个谜团,极少接触到,也极少用到,更加不知道在什么场景下使用内部类。内部类就是将一个类(内部类)的定义放入另一个类(外围类)的定义内部。内部类更多的是辅助外围类,可以理解为外围类需要一个独立的类来帮助他完成工作。今天我们来介绍一下内部类一些比较常见的用法和特性。
下面先来介绍下内部类的基本用法。
创建一个内部类其实很简单,下图就是一个最简单的定义。(创建内部类、内部类和外围类的互相引用、在方法和作用域中的内部类)
//外围类
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年,云计算作为新一代信息技术的代表,正以前所未有的速度推动着智慧城市的发展。阿里巴巴集团与天津市的战略合作,表明了政府对云计算大数据产业的高度重视,这为...
这种失真可能源于信息的过时、解读的偏差,或是故意的扭曲。一旦关键信息在传递过程中出现失真,将会直接影响企业的决策质量,甚至导致战略失误,影响企业的整体运营效率和市场竞争力。 因此,《企业内部控制应用...
本文将对Java内部类进行详细解读,分析其分类、特点以及在编程中的应用和注意点。 首先,内部类可以被分为几种不同的类型,每种类型都有其特定的应用场景和特点。从功能上来讲,内部类可以访问外部类的所有成员变量...
【企业内部控制基本规范解读】 内部控制是企业为了实现其目标,由董事会、管理层及全体员工共同参与的,旨在确保企业经营管理合法合规、资产安全、财务报告及相关信息真实完整,并提高经营效益和效果的一系列程序和...
本文将详细解读新《内部审计基本准则》的核心内容和意义。 首先,新准则的修订以科学性和实用性为导向,对原有的准则体系进行了全面的梳理和优化。新准则体系包括一个基本准则、一个规范、二十个具体准则以及五个...
内部类分为几种类型,包括静态内部类、匿名内部类、成员式内部类和局部内部类。 1. **静态内部类**: 静态内部类与普通的成员变量类似,可以在类的外部直接通过外部类的名字和"."操作符创建对象,不需要外部类的...
《公路技术状况评定标准JTG5210-2018》是中国公路工程技术标准的重要组成部分,由武汉大学卓越工程研究院进行内部培训解读。这份标准是针对我国公路维护与管理的一项核心规范,旨在确保公路设施的安全、高效和可持续...
### 解读PHP类的封装 在面向对象编程中,封装是一种重要的特性,它允许我们将数据(属性)和方法(函数)组织在一起,并控制外部代码如何访问这些数据和方法。PHP作为一种广泛使用的开源脚本语言,支持面向对象编程...
应用指引分为三类:内部环境类、控制活动类和控制手段类。内部环境类包括组织架构、发展战略、人力资源、企业文化和社会责任,是企业内部控制的基础,影响员工的控制意识和行为。例如: 1. 组织架构:规定了董事会...
### 会计继续教育行政事业单位内部控制规范解读 #### 内部控制概述 内部控制是现代行政事业单位管理的重要组成部分,它旨在通过制定一系列制度、措施和程序来防范经济活动中的风险,确保单位经济活动合法合规、...
[精选]解读我国内部控制体系.pptx
【企业内部控制应用指引1-18解读】 组织架构是企业内部控制体系的基础,是构建现代企业制度的核心要素。根据《企业内部控制应用指引第 1 号——组织架构》,它涉及到企业内部的董事会、监事会、经理层及各个层级的...
《单位内部控制规范》是针对行政事业单位管理的一项重要指导文件,旨在强化单位的内部管理,防止腐败,提升公共服务效率。这份规范的制定有多重背景和依据,包括政府对廉洁高效服务型政府的建设需求,事业单位分类...
当我们想要解读随机森林的内部工作时,可以参考Ando Saabas的GitHub项目,该项目提供了可视化工具,帮助我们理解单个决策树以及整个森林的预测贡献。通过观察决策树的不同路径,我们可以看到各个特征如何影响预测...
为了确保医疗器械标准的实施,监督机制应运而生,这包括政府的执法监督、行业的自我管理、企业内部审核和社会公众的参与。只有通过这些多层次、多角度的监督体系,才能保证标准得到有效的执行,从而保障公众健康和...
《企业内部控制基本规范》是企业管理和运营中至关重要的指导文件,旨在通过有效的内部控制体系来确保企业目标的实现,防范潜在风险。全面预算内部控制是其中的关键组成部分,它涉及到企业经营活动的各个方面,包括...