Java进阶07 嵌套类

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

 

到现在为止,我们都是在Java文件中直接定义类。这样的类出现在包(package)的级别上。Java允许类的嵌套定义。

这里将讲解如何在一个类中嵌套定义另一个类。

 嵌套

内部类

Java允许我们在类的内部定义一个类。如果这个类是没有static修饰符,那么这样一个嵌套在内部的类称为内部类(inner class)。

内部类被认为是外部对象的一个成员。在定义内部类时,我们同样有访问权限控制(public, private, protected)。

 

在使用内部类时,我们要先创建外部对象。由于内部类是外部对象的一个成员,我们可以在对象的内部自由使用内部类:

public class Test
{public static void main(String[] args){Human me        = new Human("Vamei");me.drinkWater(0.3);}
}class Human
{/*** inner class*/private class Cup{public void useCup(double w){this.water = this.water - w;}public double getWater(){return this.water;}private double water = 1.0;}/*** constructor*/public Human(String n){this.myCup = new Cup();this.name  = n;}public void drinkWater(double w){myCup.useCup(w);System.out.println(myCup.getWater());}private Cup myCup;private String name;
}

上面的例子中,Cup类为内部类。该内部类有private的访问权限,因此只能在Human内部使用。这样,Cup类就成为一个被Human类专用的类。

 

如果我们使用其他访问权限,内部类也能从外部访问,比如:

public class Test
{public static void main(String[] args){Human me        = new Human("Vamei");me.drinkWater(0.3);Human.Cup soloCup = me.new Cup(); // be careful here}
}class Human
{/*** inner class*/                                                                                                                                                             class Cup{public void useCup(double w){this.water = this.water - w;}public double getWater(){return this.water;}private double water = 1.0;}/*** constructor*/public Human(String n){this.myCup = new Cup();this.name  = n;}public void drinkWater(double w){myCup.useCup(w);System.out.println(myCup.getWater());}private Cup myCup;private String name;
}

这里,内部类为默认访问权限(包访问权限)。我们可以在Test类中访问Human的内部类Cup,并使用该内部类创建对象。注意我们创建时如何说明类型以及使用new:

Human.Cup soloCup = me.new Cup();

我们在创建内部类对象时,必须基于一个外部类对象(me),并通过该外部类对象来创建Cup对象(me.new)。我将在下一节讲述其中的含义。

 

闭包

可以看到,我们直接创建内部类对象时,必须是基于一个外部类对象。也就是说,内部类对象必须依附于某个外部类对象。

 

内部对象与外部对象

与此同时,内部类对象可以访问它所依附的外部类对象的成员(即使是private的成员)。从另一个角度来说,内部类对象附带有创建时的环境信息,也就是其他语言中的闭包(closure)特性。可参考Python闭包

我们看下面的例子:

public class Test
{public static void main(String[] args){Human me        = new Human("Vamei");Human him       = new Human("Jerry");Human.Cup myFirstCup  = me.new Cup();Human.Cup mySecondCup = me.new Cup();Human.Cup hisCup      = him.new Cup();System.out.println(myFirstCup.whosCup());System.out.println(mySecondCup.whosCup());System.out.println(hisCup.whosCup());}
}class Human
{/*** inner class*/class Cup{public String whosCup(){return name;  // access outer field
        }}/*** constructor*/public Human(String n){this.name = n;}public void changeName(String n){this.name = n;}private String name;
}

运行结果:

Vamei
Vamei
Jerry

 

在上面的例子中,我们通过内部类对象访问外部类对象的name成员。当我们基于不同的外部对象创建内部类对象时,所获得的环境信息也将随之变化。

 

嵌套static类 

我们可以在类的内部定义static类。这样的类称为嵌套static类(nested static class)。

我们可以直接创建嵌套static类的对象,而不需要依附于外部类的某个对象。相应的,嵌套static类也无法调用外部对象的方法,也无法读取或修改外部对象的数据。从效果上看,嵌套static类拓展了类的命名空间(name space),比如下面的Human.Mongolian:

public class Test
{public static void main(String[] args){Human.Mongolian him = new Human.Mongolian();him.Shout();}
}class Human
{/*** nested class*/static class Mongolian{public void Shout(){System.out.println("Oh...Ho...");}}
}

在定义嵌套static类时,我们同样可以有不同的访问权限修饰符。

 

总结

嵌套类允许我们更好的组织类

内部类实现了闭包

 

欢迎继续阅读“Java快速教程”系列文章

 

转载于:https://www.cnblogs.com/vamei/archive/2013/04/16/3000896.html

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

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

相关文章

MySQL笔记——DQL查询数据

DQL查询包括以下这些内容: • 基础查询 • 条件查询(WHERE) • 分组查询(GROUP BY) • 排序查询(ORDER BY) • 分页查询(LIMIT)(一)、基础查询 1、查询多个字段 SELECT 字段列表 FROM 表名; SELECT * FROM 表名; 当前表中数据如下: 2、去除重复记录 …

c++两个vector合并_数据结构——算法初步(4)——合并排序算法

从之前的学习可以看到,对大型vectory要求的排序,选择排序算法显然不符合要求,因为运行时间与输入问题规模大小的平方成比例增加,对于以线性顺序处理向量的元素的大多数排序算法也是如此。 所以要采用不同的方法来开发…

asterisk 互联

如上图所示,两个sip客户端分别注册在A,B两个asterisk服务器下,让A和B通过各自的asterisk服务器来相互通信。 xlite A的账号为2001,xlite B的账号为5001 asterisk A的sip.conf如下配置: [general] contextunauthenticated allow…

[活动通知]Nanjing GDG 2013年4月活动

致各位亲爱的 Google 技术爱好者 很高兴的通知各位朋友,Nanjing GDG 将在本周日 (04/21) 举办我们 Nanjing GDG 的 4月份活动,热烈欢迎大家报名参加。 主题:利用开放社区和代码库来构建 Android 应用 时间: 4月21 日 (周日) 下午 …

MySQL笔记——外键约束和表关系(一对一,多对一,多对多)

一、外键约束 概念:外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性。语法:(1)添加约束-- 创建表是添加外键约束CREATE TABLE 表名(列名 数据类型,…[CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REF…

仿个人税务 app html5_【注意】你下载的可能是个假的个税App

新个税法从1月初开始实施。国家税务总局推出“个人所得税”APP,方便纳税人线上填报资料进行专项抵扣。几天来,这款APP的下载量和注册量大幅增长。随之而来的是,很多商业公司制作的各类“个税”APP也成为热门。这其中有不少纯属蹭热点&#xf…

MySQL笔记——多表查询

多表查询不能使用 SELECT * from emp, dept; 会产生笛卡尔积。 笛卡尔积,有A,B两个集合,A中有5条信息,B中有4条信息,那么查询结果就是5*420条一、内连接查询 -- 隐式内连接SELECT 字段列表 FROM 表1,表2,… WHERE 条件…

遇见王沥川的人生感悟_23岁酱油泡饭默默无闻,31岁逆袭人生,王彦霖有何魅力?...

文/小白说娱S姐 原创精品,请勿转载如果兜里只剩下1块钱,生活所迫你会怎样过?王彦霖23岁刚毕业熬过了1元危机,他永远都不会想到当年咬牙坚持熬成就了如今的综艺诸葛。《元气满满的哥哥》连播六期多次排名第一,成为芒果台…

antd vue form 手动校验_参与《开课吧》vue训练营笔记(Day1)

大神说的目标:Vue 挑战20k组件间通信component 官网 详解组件间的传递方式:父传子 直接属性传递子传父 this.$emit 时间传递兄弟组件 利用父组件搭桥组件和子孙 provide / inject子孙 -> 祖先 this.$dispatch 或provide 获取组件元素实例$listeners $…

MySQL笔记——打开日志

在my.ini文件中输入如下命令:log_outputFILE general_logon general_log_file"D:\\SoftwareTools\\Mysql\\mysqllog\\mysql.log" slow_query_logon long_query_time 2 slow_query_log_file"D:\\SoftwareTools\\Mysql\\mysqllog\\mysql_slow.log"…

链表怎么输出最后一个元素无空格_剑指offer系列----从尾到头打印链表

从尾到头打印链表信息卡片时间:2020-03-23题目:从尾到头打印链表tag:list题目描述输入一个链表,按链表从尾到头的顺序返回一个 ArrayList。01调用 reverse 函数解题思路这是一种简单粗暴的解法。先遍历一遍链表,在遍历…

EntiyFramework :Update model from database引起的两个问题

EntiyFramework一大特点就是Code first,但难免有时候因特殊原因需要Update model from database。此次使用该功能时遇到两个问题,且记之。 [问题一] Error 3027: No mapping specified for the following EntitySet/AssociationSet - XXXXXXX. [起因] 在…

MySQL笔记——JDBC入门

(一)JDBC简介 JDBC概念:(1)JDBC就是使用Java语言操作关系型数据库的一套API(2)全称:(Java DataBase Connectivity)Java数据库连接(二)…

Maven笔记——maven下载与配置

(一)Maven简介 Apache Maven是一个项目管理和构建的工具,它基于项目对象模型(POM)的概念。通过一小段描述信息来管理项目的构建,报告和文档。○ 项目对象模型○ 依赖管理模型○ 插件• 仓库分类&#xff1a…

Telerik Reporting之生成报表

本文为原创文,难免会有一些小得瑕疵,敬请谅解。所有示例均是博主测试过的,如有转载请标明出处,谢谢。第一步:建立一个普通类库。 第二步:在此类库中,新建项——Telerik Report报表。 第三步&…

Maven笔记——依赖管理

使用坐标导入jar包1) 在pom.xml中编写<dependencies>标签2) 在<dependencies>标签中使用<dependency>引入坐标3) 定义坐标的groupId、artifactId、version<dependencies><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->…

android 4.2以上版本永不休眠

android4.2以上版本比android4.2以前的版本framework层框架部分有了很大的改变&#xff0c;androd4.2以前版本framework层给上的接口函数与android4.2以上版本的接口函数也有了些变化&#xff0c;以前让机器永不休眠的方法用在android4.2以上版本已经不起作用了。现将android4.…

Mybatis笔记——Mybatis入门

&#xff08;一&#xff09;MyBatis快速入门 通过一个案例快速入门Mybatis框架案例&#xff1a;查询user表中所有数据1) 创建user表&#xff0c;添加数据2) 创建模块&#xff0c;导入坐标3) 编写MyBatis核心配置文件-->替换连接信息&#xff0c;解决硬编码问题4) 编写SQL映…

POJ-3693 Maximum repetition substring 后缀数组

题目链接&#xff1a;http://poj.org/problem?id3693 求字符串的重复次数最多的且字典序最小的字串。 很不错的题目。罗穗骞大牛论文的模板题&#xff0c;摘了Neo / Add ~0U>>1大牛的详细题解&#xff0c;如下&#xff1a; 首先求第一问最大重复数。从N的范围来看O(N^2)…

python nlp_Python NLP入门教程

本文简要介绍Python自然语言处理(NLP)&#xff0c;使用Python的NLTK库。NLTK是Python的自然语言处理工具包&#xff0c;在NLP领域中&#xff0c;最常使用的一个Python库。 什么是NLP&#xff1f; 简单来说&#xff0c;自然语言处理(NLP)就是开发能够理解人类语言的应用程序或服…