java嵌套类与内部类

一、嵌套类(Nested Classes)

使用嵌套类减少了命名冲突,一个内部类可以定义在一个中,一个方法中甚至一个表达式中。

(1)定义

A nested(嵌套) class is any class whose declaration occurs within the body of another class or interface.  A top level class is a class that is not a nested class. 

一般把定义内部类的外围类成为包装类(enclosing class)或者外部类.

(2)嵌套类分类

1、静态嵌套类 (static nested classes)

2、非静态嵌套类

非静态嵌套类就是内部类(Inner classes)。Inner Classes 不能定义为static,不能有static方法static初始化语句块

在JLS(java语言规范)里面是这么定义的:

An inner class is a nested class that is not explicitly or implicitly declared static. Inner classes may not declare static initializers (§8.7) or member inter- faces

非静态嵌套类分为三种:

1)成员嵌套类(member nested class)

  成员嵌套类 作为 enclosing class 的成员定义的,成员嵌套类有enclosing class属性

2)局部嵌套类(local nested class)

  局部嵌套类定义在 enclosing class 的方法里面,局部嵌套类有enclosing class 属性和enclosing method属性

3)匿名嵌套类(anonymous nested class)

  匿名嵌套类没有显示的定义一个类,直接通过new 的方法创建类的实例。一般回调模式情况下使用的比较多

 

也可以称为成员内部类(member inner classes)、局部内部类(local inner classes)、匿名内部类(anonymous inner classes)

 

二、静态嵌套类

简称静态类,最简单的嵌套类,只能访问外部类的静态成员变量与静态方法

1、静态类不能访问外部类的非静态成员和非静态方法(不管是public还是private的);
2、静态类的实例不需要先实例化外部类成员,可直接实例化。

3、静态类的修饰符与普通类的属性的修饰符一样,也可以使用访问控制符,可以使用final修饰,可以是abstract抽象类

 代码实例

public class Outer{public static class StaticNested{//其他代码
   }
}

 实例方式

Outer.StaticNested staticNested=new Outer.StaticNested();

 

三、成员内部类

成员内部类可以访问外部类的所有实例属性静态属性。因为内部成员类持有一个外部对象的引用,内部类的实例可以对外部类的实例属性进行修改。

如果是public的 inner  member classes,可以通过 外部类实例.new 内部类()的方式进行创建,当调用内部类的构造器的时候,会把当前创建的内部类对象实例中持有的外部对象引用赋值为当前创建内部类的外部类实例。

内部成员类可以是使用访问控制符,可以定义为final,也可以是abstract抽象类。

 代码实例

class Outer{public  class MemberNested{//其他代码
   }
}

 

 实例方式

Outer.MemberNested staticNested=new Outer().new MemberNested();

 或者

Outer outer=new  Outer(); 
Outer.MemberNested staticNested=outer.new MemberNested();

 

四、局部内部类

(1)定义位置

   定义位置既可以是静态方法,也可以是实例方法,也可以是构造器方法,还可以是动态初始化语句块或者静态初始化语句块

(2)修饰符限制

   局部类不能有访问控制符(private,public,protected修饰),可以是abstract的,也可以定义为final

(3)局部类可以定义在一个static上下文里面 和 非static上下文里面。

   定义在static上下文(static初始化块,static方法)里面的local inner classes 可以访问类的静态属性

   在static上下文定义的局部类,没有指向父类实例变量的引用,因为static方法不属于类的实例,属于类本身。而且局部类不能在外部进行创建,只能在定义位置调用的时候进行创建。

代码实例

class Outer {//定义在构造方法public Outer() {final class LocalNested {//其他代码
        }LocalNested localNested=new LocalNested();}//定义在成员方法public void methodA() {abstract class LocalNested {//其他代码
        }LocalNested localNested=new LocalNested(){ };//匿名实现抽象类
    }//定义在静态方法public static void methodB() {abstract class LocalNested {//其他代码
        }LocalNested localNested=new LocalNested(){ };//匿名实现抽象类
    }//定义在动态初始化块
    {class LocalNested {//其他代码
        }LocalNested localNested=new LocalNested();}//定义在静态初始化块static {final class LocalNested {//其他代码
        }LocalNested localNested=new LocalNested();}
}
View Code

 

五、匿名内部类

(1)定义位置

 定义位置既可以是静态方法,也可以是实例方法,也可以是构造器方法,还可以是动态初始化语句块或者静态初始化语句块。

(2)实现方式

匿名类和局部类访问规则一样,只不过内部类显式的定义了一个类,然后通过new的方式创建这个局部类实例,而匿名类直接new一个类实例,没有定义这个类。匿名类最常见的方式就是回调模式的使用,通过默认实现一个接口创建一个匿名类然后,然后new这个匿名类的实例。

代码实现

class Outer {//定义在构造方法public Outer() {AnonymousNested anonymousNested=new AnonymousNested(){ };//匿名实现抽象类
    }//定义在成员方法public void methodA() {AnonymousNested anonymousNested=new AnonymousNested(){ };//匿名实现抽象类
    }//定义在静态方法public static void methodB() {AnonymousNested anonymousNested=new AnonymousNested(){ };//匿名实现抽象类
    }//定义在动态初始化块
    {AnonymousNested anonymousNested=new AnonymousNested(){ };//匿名实现抽象类
    }//定义在静态初始化块static {AnonymousNested anonymousNested=new AnonymousNested(){ };//匿名实现抽象类
    }
}abstract class AnonymousNested {//其他代码
}
View Code

 

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

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

相关文章

jsr303 spring_使用Spring和JSR 303进行方法参数验证

jsr303 springSpring提供了一种使用JSR 303 bean验证来验证方法参数的简便方法。 在这篇文章中,我们将看到如何使用此功能。 建立 首先,我们需要通过创建MethodValidationPostProcessor bean添加对方法参数验证的支持: Configuration publi…

优先队列——斐波那契堆(without source code)

【0】README 0.1) 本文部分内容转自 数据结构与算法分析,旨在理解 斐波那契堆 的基础知识; 0.2) 文本旨在理清 斐波那契堆的 核心idea,还没有写出源代码实现,表遗憾; 0.3)从实际角…

计算机专业考研可关注哪些公众号,考研应关注哪些公众号?

考研应关注哪些公众号?2018-11-30深夜睡不着,看到了这个问题,觉得我能帮上忙,就坐起来写了一份回答(^_^)微信公众号有:考研狗之家(特别推荐,各种资源)考研军火库(特别推荐,各种技巧)考研圈考研资…

cassandra 备份_使用sstableloader恢复Cassandra Priam备份

cassandra 备份我之前曾写过关于设置Cassandra和Priam进行备份和集群管理的文章。 但是,我在此处提供的用于备份还原的示例并不适用于所有情况,例如,它可能不适用于完全独立的群集。 或者在部分还原到一个表而不是整个数据库的情况下。 在这…

XML——XML概述

【0】README 0.1)本文描述 转自 core java volume 2, 旨在理解 XML——XML概述 的基础知识; 【1】XML概述相关 1)problemsolution (干货——引入XML的原因) 1.1)problem:1.1.1&am…

java入门配置

一、下载安装JDK JDK下载路径:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 点击 Accept License Agreement ,选择自己的系统类型JDK下载,然后安装JDK。 二、安装JDK 双击JDK运行,选择…

华中科技大学计算机学院发表论文规定,华中科技大学等7所大学取消“研究生毕业必须发表论文”要求...

华中科技大学等7所大学取消“研究生毕业必须发表论文”要求北京晨报发表于 2006/07/17 10:51中国7所大学取消“研究生毕业必须发表论文”要求中新网7月16日电据《北京晨报》报道,昨天,记者从大学校长论坛了解到,中国人民大学、北京师范大学、…

计算机网络中的广播啥意思,开启无线广播啥意思

大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。以路由器为例,开启无线广播是指开启无线路由器功能。路由器(Router,又称路径器)是一种计算机网络设备,它能将数据包通过一个个网络传送至目的地(选…

jep290涉及jdk版本_JDK 14 – JEP 361从预览中切换表达式

jep290涉及jdk版本在我的前一篇文章中 ,我写了有关作为JDK 12的预览功能发布的开关表达式和相关增强功能的信息。随后,在JDK 13中提出了一些更改,例如使用yield关键字从switch块返回值并在预览中发布。 在即将于明年3月在GA上市的即将发布的…

java变量作用域Scope

一、变量Scope 作用域同时决定了它的“可见性”以及“存在时间”。在C,C和Java里,作用域是由花括号的位置决定的。变量的作用域分为四个级别:类级、对象实例级、方法级、块级。 二、类级Scope 类级变量又称全局级变量或静态变量&#xff0c…

XML——解析XML文档

【0】README 0.1)本文描述 转自 core java volume 2, 旨在理解 XML——解析XML文档 的基础知识; 0.2) for source code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter2…

计算机维修与维护入门,计算机组装与维护基础知识

《计算机组装与维护基础知识》由会员分享,可在线阅读,更多相关《计算机组装与维护基础知识(5页珍藏版)》请在人人文库网上搜索。1、计算机组装与维护基础知识关键考点:CPU主板内存硬盘显卡CMOS硬件组装操作系统学生姓名:总分&…

java oauth2.0_OAuth 2.0 Java指南:5分钟保护您的应用程序安全

java oauth2.0使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 今天尝试Okta。 现代应用程序依赖于用户身份验证,但是它可能给Java开发人员带来困难的挑战,以及…

Java编程规范

一、常见命名规则 (1)匈牙利命名法 比 较著名的命名规则是匈牙利命名法,但这种命名法对于跨平台移植简直是灾难。这种命名方法是由Microsoft程序员查尔斯西蒙尼(Charles Simonyi) 提出的。其主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。匈牙利…

XML—— 验证XML文档

【0】README 0.0)本文文字描述转自 core java volume 2 , 旨在理解 XML—— 验证XML文档 的基础知识 0.1)problemsolution (干货——不推荐使用DOM 技术解析XML) 0.1.1)problem:如果仅仅按照…

计算机数据链路层教案,第三章 数据链路层(2) 新.ppt

文档介绍:计算机通信网20112011年教案年教案作者:段景山作者:段景山杨宁杨宁毛玉明毛玉明2第三章数据链路层??链路层功能链路层功能??成帧成帧??差错检测和纠正差错检测和纠正??差控与流控协议差控与流控协议??协议描述与验证协议描述与验证??示例示例?…

java导出javadoc文档

一、注释 (1)文档注释的格式化 生成的文档是 HTML 格式,而这些 HTML 格式的标识符并不是 javadoc 加的,而是我们在写注释的时候写上去的。比如,需要换行时,不是敲入一个回车符,而是写入 <br>&a…

java内核_测量时间:从Java到内核再到

java内核问题陈述 当您深入研究时,即使是最基本的问题也会变得很有趣。 今天,我想深入研究一下Java时间。 我们将从Java API的最基础知识开始,然后逐步降低堆栈:通过OpenJDK源代码glibc一直到Linux内核。 我们将研究各种环境下的性…

XML——文档类型定义(DTD-Document Type Definition)

【0】README 0.1)本文文字描述转自 core java volume 2 , 旨在理解 XML——文档类型定义(DTD-Document Type Definition) 的基础知识; 0.2) for source code, please visit https://github.com/pacosonTa…

职称计算机考试 数量,职称计算机考试WPS基础考点:自动求和

职称计算机考试WPS基础考点:自动求和导语:随着信息技术的发展,计算机日益走进人们的工作、学习和生活,成为专业技术人员不可或缺的工具。下面我们一起来看看职称计算机考试WPS的内容吧。1. 对不相邻单元格的数据求和假如要将单元格…