您的位置:首页 > 编程语言 > Java开发

【java开发系列】—— 嵌套类与内部类

2016-08-02 23:53 429 查看
嵌套类与内部类在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{
@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类型的,这样就实现了接口的隐藏
}
}



  局部内部类

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

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息