嵌套类与内部类在java中使用的很广泛,为了避免难以理解,这里用了几个小例子,说明它的用法。

  嵌套类与内部类的结构如下图

  静态嵌套类  

  静态嵌套类,是一种在类之外声明的嵌套类,由于是静态的,所以不经过初始化,就可以通过类名,直接调用。

 class out1{
private static String name = "xingoo";
static class info{
void print(){
System.out.println("name:"+name);
}
}
}

  使用样例

package testClass;
class out1{
private static String name = "xingoo";
static class info{
void print(){
System.out.println("name:"+name);
}
}
}
class out2{
private static String name = "xingoo test 2";
static class info{
String name = "inner infomation!";
void printInner(){
System.out.println("name:"+name);
}
void printOuter(){
System.out.println("name:"+out2.name);
}
}
}
/**
* 静态嵌套类
* @author xingoo
*
*/
public class test1 {
public static void main(String[] args){
//创建对象时,以xxx.yyy这种格式创建
out1.info oi = new out1.info();
oi.print(); out2.info oi2 = new out2.info();
oi2.printInner();
oi2.printOuter();
}
}

  成员内部类

  成员内部类,即该类作为另一个类的成员,因此只有引用另一个类,才能创建这个类。

 class outer{
private String name = "xingoo";
class inner{
void print(){
System.out.println(name);
}
}
}

  通常也用于隐藏的实现某个接口,如下面所示,第一种是传统的实现方式,第二种是隐藏了实现接口的实现方式。

 interface Printer{
void print(String name);
}
class outerImpl1 implements Printer{
@Override
public void print(String name) {
System.out.println(name);
}
}
class outerImpl2{
private class inner implements Printer{
@Override
public void print(String name) {
System.out.println(name);
}
}
public Printer getPrinter(){
return new inner();
}
}

  使用样例

package testClass;
/**
* 简单测试成员内部类
* @author xingoo
*
*/
class outer{
private String name = "xingoo";
class inner{
void print(){
System.out.println(name);
}
}
}
interface Printer{
void print(String name);
}
class outerImpl1 implements Printer{
@Override
public void print(String name) {
System.out.println(name);
}
}
class outerImpl2{
private class inner implements Printer{
@Override
public void print(String name) {
System.out.println(name);
}
}
public Printer getPrinter(){
return new inner();
}
}
/**
* 成员内部类
* @author xingoo
*
*/
public class test2 {
public static void main(String[] args){
//创建一个外部类的对象,通过调用这个对象的new方法创建其内部类的对象
outer o = new outer();
outer.inner i = o.new inner();
i.print(); //内部类实现接口隐藏
Printer out1 = new outerImpl1();
out1.print("xingoo test1");
outerImpl1 out1trans = (outerImpl1)out1;//支持向下转换 Printer out2 = (new outerImpl2()).getPrinter();
out2.print("xingoo test2");
//无法向下转换,因为inner是private类型的,这样就实现了接口的隐藏
}
}

  局部内部类

  局部类的声明之作用与某个代码块内,因此如果某个声明的类仅仅被一段程序所使用,其他地方再也用不到,就可以用这种实现方式。·

 interface Logger{
public void log(String message);
}
public class test3 { String startTime = (new Date()).toString();
/**
* 局部内部类,从定义上来讲,不属于任何其他的类,因为是声明在这个类内部的。与匿名内部类不同的就是它有名字。
* @return
*/
public Logger getLogger(){
//由于LoggerImpl只在 getLogger内部使用,因此把它定义在函数内部,相对来说更安全一些
class LoggerImpl implements Logger{
@Override
public void log(String message) {
System.out.println(startTime + ":" + message);
}
}
return new LoggerImpl();
} public static void main(String[] args){
test3 test = new test3();
Logger logger = test.getLogger();
logger.log("hello xingoo!");
}
}

  匿名内部类

  在使用new创建对象时,直接在后面创建它的实现类。

 abstract class Printable{
public void print(String name){ }
}
/**
* 就是跟在new创建对象之后,直接定义它的类实现
* @author Administrator
*/
public class test4 {
public static void main(String[] args){
Printable printer = new Printable(){
public void print(String name){
System.out.println(name);
}
};//注意因为这其实是一个new语法,因此要加上分号;
printer.print("hello!xingoo!");
}
}

参考资料:《JAVA 7程序设计》

【java开发系列】—— 嵌套类与内部类的更多相关文章

  1. Java中的嵌套类和内部类

    以前看<Java编程思想>的时候,看到过嵌套类跟内部类的区别,不过后来就把它们的概念给忘了吧.昨天在看<数据结构与算法分析(Java语言版)>的时候,又遇到了这个概念,当时就很 ...

  2. JAVA 嵌套类和内部类

    一.什么是嵌套类及内部类?  可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:  静态嵌套类和非静态嵌套类.静态嵌套类使用很少,最重要的是非静态嵌套类, ...

  3. 分析java 嵌套类与内部类

    一.什么是嵌套类及内部类?     可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类使用很少,最重要的是非静态嵌套类 ...

  4. 深入理解java嵌套类和内部类

    一.什么是嵌套类及内部类 能够在一个类的内部定义还有一个类.这样的类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类使用非常少,最重要的是非静态嵌套类,也 ...

  5. (十二)java嵌套类和内部类

    嵌套类和内部类:在一个类里边定义的类叫做嵌套类,其中没有static修饰的嵌套类是我们通常说的内部类,而被static修饰的嵌套类不常用.有的地方没有嵌套类和内部类的区分,直接是嵌套类就称作内部类,没 ...

  6. spring 笔记1: mvn 中Controller方法的参数不能是嵌套类(内部类)。

    最近做spring开发,个人认为,Controller和客户端js通讯时传递的参数类 只使用某几个方法,为了减少对其他功能的影响,想把参数类定义为Controller类的 嵌套类(内部类).但是实践发 ...

  7. Java学习笔记-嵌套类

    嵌套类 嵌套类有两种类别:static and non-static,分别对应为静态嵌套类和内部类. class OuterClass { ... static class StaticNestedC ...

  8. Java开发设计——UML类图

    Java开发设计——UML类图 摘要:本文主要介绍了UML类图的相关知识. 简介 在UML中,类使用包含类名.属性和操作且带有分隔线的长方形来表示,类图分为三层. 第一层是类的名称,如果是抽象类或接口 ...

  9. Java 嵌套类和内部类演示样例&lt;二&gt;

    嵌套类(nested class)是一个在还有一个类或接口内部声明的类. 嵌套类分为两种:静态内部类(static inner class)和非静态嵌套类(non-static nested clas ...

随机推荐

  1. ASP.NET与.NET区别

    1.NET是什么? .Net全称.NET Framework是一个开发框架,不是一门编程语言,简单的来说 就是一组类库框架,.NET开发支持C#.VB.NET.J#.Js和Managed C++等 其 ...

  2. mongodb的初步使用

    一.mongodb简介 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产 ...

  3. llinux 目录结构 及Linux文件分享

    llinux 基础命令 及个人Linux文件分享 一, root用户名 @ 分隔符 kingle 主机名 ~当前所在目录 # root权限 $ 没分配权限用户 二, 书写格式:空格 [命令参数] 空格 ...

  4. TimesTen客户端DSN配置

    打开控制面板\管理工具 1.打开数据源(ODBC) 2.选择系统DSN 3.选择添加: 4.单击完成 5.Servers

  5. 牛客网Java刷题知识点之为什么HashMap不支持线程的同步,不是线程安全的?如何实现HashMap的同步?

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  6. kafka配置文件中参数的限制

    在kafka的优化过程中,不断的调节配置文件中的参数,但是有时候会遇到java.lang.NumberFormatException这样的错误 比如socket.receive.buffer.byte ...

  7. 基于 jdk1.7 发布一个 WebService 服务

    1 服务端的发布 第一步: 创建一个 Java 项目第二步: 创建一个类, 加入 Webservice 注解第三步: 提供一个方法 sayHello第四步: 在 main 方法中调用 jdk 提供的发 ...

  8. 网站加入QQ聊天链接

    有时候我们的网站需要加入客服聊天功能,实现方式各不相同同,对于流量不大的网站,可以加入qq聊天的链接,点击链接,会打开本地qq的聊天窗口, 和指定的人会话.实现方式很简单,就是一个<a>标 ...

  9. BNU34067——Pair——————【找规律】

    Pair Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: M ...

  10. go test遇到的一些问题-command-line-arguments undefined: xxxxx

    一 问题是在我写算法题的时候出的,test后缀的文件编译报command-line-arguments undefined: xxxxx 二 没记错,go test是 所有在以_test结尾的源码内以 ...