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

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

  静态嵌套类  

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

1 class out1{
2     private static String name = "xingoo";
3     static class info{
4         void print(){
5             System.out.println("name:"+name);
6         }
7     }
8 }

  使用样例

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();}
}

  成员内部类

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

1 class outer{
2     private String name = "xingoo";
3     class inner{
4         void print(){
5             System.out.println(name);
6         }
7     }
8 }

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

 1 interface Printer{
 2     void print(String name);
 3 }
 4 class outerImpl1 implements Printer{
 5     @Override
 6     public void print(String name) {
 7         System.out.println(name);
 8     }
 9 }
10 class outerImpl2{
11     private class inner implements Printer{
12         @Override
13         public void print(String name) {
14             System.out.println(name);
15         }
16     }
17     public Printer getPrinter(){
18         return new inner();
19     }
20 }

  使用样例

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{@Overridepublic void print(String name) {System.out.println(name);}
}
class outerImpl2{private class inner implements Printer{@Overridepublic 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类型的,这样就实现了接口的隐藏
    }
}

  局部内部类

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

 1 interface Logger{
 2     public void log(String message);
 3 }
 4 public class test3 {
 5
 6     String startTime = (new Date()).toString();
 7     /**
 8      * 局部内部类,从定义上来讲,不属于任何其他的类,因为是声明在这个类内部的。与匿名内部类不同的就是它有名字。
 9      * @return
10      */
11     public Logger getLogger(){
12         //由于LoggerImpl只在 getLogger内部使用,因此把它定义在函数内部,相对来说更安全一些
13         class LoggerImpl implements Logger{
14             @Override
15             public void log(String message) {
16                 System.out.println(startTime + ":" + message);
17             }
18         }
19         return new LoggerImpl();
20     }
21
22     public static void main(String[] args){
23         test3 test = new test3();
24         Logger logger = test.getLogger();
25         logger.log("hello xingoo!");
26     }
27 }

  匿名内部类

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

 1 abstract class Printable{
 2     public void print(String name){
 3
 4     }
 5 }
 6 /**
 7  * 就是跟在new创建对象之后,直接定义它的类实现
 8  * @author Administrator
 9  */
10 public class test4 {
11     public static void main(String[] args){
12         Printable printer = new Printable(){
13             public void print(String name){
14                 System.out.println(name);
15             }
16         };//注意因为这其实是一个new语法,因此要加上分号;
17         printer.print("hello!xingoo!");
18     }
19 }

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


from: http://www.cnblogs.com/xing901022/p/3966609.html

【java开发系列】—— 嵌套类与内部类相关推荐

  1. java嵌套类与内部类

    一.嵌套类(Nested Classes) 使用嵌套类减少了命名冲突,一个内部类可以定义在一个类中,一个方法中甚至一个表达式中. (1)定义 A nested(嵌套) class is any cla ...

  2. kotlin学习之嵌套类和内部类(六)

    目录 1. Java中的内部类和嵌套类 2. kotlin中的嵌套类和内部类 1. Java中的内部类和嵌套类 //内部类,内部类持有了外部类的引用,所以在内部类中可以调用外部类的方法 public ...

  3. 【Java 面向对象】基础、Java程序的内存划分、嵌套类(内部类、静态嵌套类)、局部类、接口的升级问题(默认方法、静态方法)、instanceof

    面向对象 对象的内存 复杂对象的内存 对象数组的内存 思考:方法存储在哪里? Java程序的内存划分 this.super 注解(Annotation) 访问控制(Access Control) to ...

  4. Java基础篇:介绍嵌套类和内部类

    在另一个类中定义的类就是嵌套类(nested classes).嵌套类的范围由装入它的类的范围限制.这样,如果类B被定义在类A之内,那么B为A所知,然而不被A的外面所知. 嵌套类可以访问嵌套它的类的成 ...

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

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

  6. Java进阶07 嵌套类

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 到现在为止,我们都是在Java文件中直接定义类.这样的类出现在包(package) ...

  7. 【java开发系列】—— JDK安装

    前言 作为一个java开发者,安装JDK是不可避免的,但是配置路径却总是记不住,百度也有很多参考例子.这里仅仅当做以后参考的笔记记录. 说到JDK,就不得不提JRE.他们到底是什么呢? 通常我们进行j ...

  8. JAVA学习3-抽象类、内部类、数组、Object、System、String、基本包装类型

    21.类之间的关系 is a:继承关系 has a : 关联关系,通常以属性的形式存在 like a:实现关系,通常是类与接口的关系; 22.抽象类与接口的区别 抽象类是半抽象的,接口是完全抽象的: ...

  9. 【java开发系列】—— 自定义注解

    之前在开发中,就总纳闷,为什么继承接口时,会出现@Override注解,有时候还会提示写注解@SuppressWarnings? 原来这是java特有的特性,注解! 那么什么是注解呢? 注解就是某种注 ...

最新文章

  1. ECS 实例网络带宽
  2. cufflinks基于dataframe数据自定义绘图基于df.iplot功能
  3. Poemscape|Beta阶段第九天
  4. linux netbeans 中文乱码,浅谈Linux Netbeans字体反锯齿处理
  5. Google高性能RPC框架gRPC 1.0.0发布
  6. [Node.js] 模块化 -- url、querystring模块
  7. IDEA启动项目报错:非法字符: ‘\ufeff‘
  8. 【HNOI2006】【Luogu2320】鬼谷子的钱袋(进制,玄学)
  9. [洛谷U22157]刷水题(数位dp)(hash)
  10. 《离散数学及其应用》章节总结与github地址
  11. 超标量处理器设计 姚永斌 第2章 Cache 摘录
  12. 2021年大学生可以参加的科创竞赛-最全信息汇总
  13. 大华平台linux密码,大华指纹锁管理员密码忘了
  14. C++ 面向对象的编程语言有哪些特点?
  15. 名片互赞软件(安卓版)
  16. c语言(vd6.0) sleep函数用法 及delay用法
  17. 访问学者在德国访学,值得推荐的特色美食有哪些?
  18. 我学习编程的好的学习方法!
  19. 复制 python cache 文件到预训练模型
  20. 45-Jenkins-Sidebar Link插件实现添加侧边栏

热门文章

  1. Lesson 4.34.4 梯度下降(Gradient Descent)基本原理与手动实现随机梯度下降与小批量梯度下降
  2. Docker 命令终极教程:8步走
  3. mysql t-sql,将T-SQL转换为MySQL
  4. Java Review - 并发编程_ CountDownLatch原理源码剖析
  5. jvm性能调优 - 16案例实战_每日上亿请求量的电商系统 年轻代垃圾回收参数如何优化
  6. 深入理解分布式技术 - 实践分库分表
  7. Shell脚本攻略01-简介/终端打印
  8. 25 linux ndk 头文件_正点原子Linux第二十五章RTC实时时钟实验
  9. Redis之压缩链表ziplist
  10. 安装ubuntu20.4+gtx1050+cuda11.3