- 浏览: 218532 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
flychao88:
nothingismao 写道623deyingxiong 写 ...
nio与io的比较 -
李冰冰:
如果NIO单个线程处理业务逻辑,那么如果这个业务逻辑非常耗时, ...
nio与io的比较 -
wj_126mail:
IO是一个连接就创建一个线程来处理;NIO是一个线程在处理所有 ...
nio与io的比较 -
nothingismao:
623deyingxiong 写道wwj85523 写道 看完 ...
nio与io的比较 -
623deyingxiong:
wwj85523 写道
看完后我迷糊了,
IO一样可以一个线 ...
nio与io的比较
转自:http://caterpillar.onlyfun.net/Gossip/JavaGossip-V1/InnerClass.htm
在類別中您還可以定義類別,稱之為內部類別(Inner class)或「巢狀類別」(Nested class)。非"static"的內部類別可以分為三種:成員內部類別(Member inner class)、區域內部類別(Local inner class)與匿名內部類別(Anonymous inner class)。
使用內部類別的好處在於可以直接存取外部類別的私用(private)成員,舉個例子來說,在視窗程式中,您可以使用內部類別來實作一個事件傾聽者類別,這個視窗傾聽者類別可以直接存取視窗元件,而不用透過參數傳遞。
另一個好處是,當某個Slave類別完全只服務於一個Master類別時,我們可以將之設定為內部類別,如此使用Master類別的人就不用知道 Slave的存在。
成員內部類別是直接宣告類別為成員,例如:
public class OuterClass {
// ....
// 內部類別
private class InnerClass {
// ....
}
}
內部類別同樣也可以使用"public"、"protected"或"private"來修飾,通常宣告為"private"的情況較多,下面這個程式簡單示範成員內部類別的使用:
OutClass.java
public class OutClass { // 內部類別 private class Point { private int x, y; public Point() { x = 0; y = 0; } public void setPoint(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } } private Point[] points; public OutClass(int length) { points = new Point[length]; for(int i = 0; i < points.length; i++) { points[i] = new Point(); points[i].setPoint(i*5, i*5); } } public void showPoints() { for(int i = 0; i < points.length; i++) { System.out.printf("Point[%d]: x = %d, y = %d%n", i, points[i].getX(), points[i].getY()); } } }
上面的程式假設Point類別只服務於OutClass類別,所以使用OutClass時,不必知道Point類別的存在,例如:
UseInnerClass.java
public class UseInnerClass { public static void main(String[] args) { OutClass out = new OutClass(10); out.showPoints(); } }
區域內部類別的使用與成員內部類別類似,區域內部類別定義於一個方法中,類別的可視範圍與生成之物件僅止於該方法之中,區域內部類別的應用一般較為少見。
內部匿名類別可以不宣告類別名稱,而使用new直接產生一個物件,該物件可以是繼承某個類別或是實作某個介面,內部匿名類別的宣告方式如下:
new [類別或介面()] {
// 實作
}
一個使用內部匿名類別的例子如下所示,您直接繼承Object類別來生成一個物件,並改寫其toString()方法:
UseInnerClass.java
public class UseInnerClass { public static void main(String[] args) { Object obj = new Object() { public String toString() { return "匿名類別物件"; } }; System.out.println(obj.toString()); } }
執行結果:
匿名類別物件
注意如果要在內部匿名類別中使用某個方法中的變數,它必須宣告為"final",例如下面是無法通過編譯的:
....
public void someMethod() {
int x = 10;
Object obj = new Object() {
public String toString() {
return "" + x;
}
};
System.out.println(obj.toString());
}
編譯器會回報以下的錯誤:
local variable x is accessed from within inner class; needs to be declared final
您要在 x 宣告時加上final才可以通過編譯:
....
public void someMethod() {
final int x = 10;
Object obj = new Object() {
public String toString() {
return "" + x;
}
};
System.out.println(obj.toString());
}
究其原因,在於 區域變數 x 並不是真正被拿來於內部匿名類別中使用,而是在內部匿名類別中複製一份,作為field成員來使用,由於是複本,即便您在內部匿名類別中對 x 作了修改,會不會影響真正的區域變數 x,事實上您也通不過編譯器的檢查,因為編譯器要求您加上"final"關鍵字,這樣您就知道您不能在內部匿名類別中改變 x 的值。
內部類別還可以被宣告為"static",不過由於是"static",它不能存取外部類別的方法,而必須透過外部類別所生成的物件來進行呼叫,一般來說較少使用,一種情況是在main()中要使用某個內部類別時,例如:
UseInnerClass.java
public class UseInnerClass { private static class Point { private int x, y; public Point(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } } public static void main(String[] args) { Point p = new Point(10, 20); System.out.printf("x = %d, y = %d%n", p.getX(), p.getY()); } }
由於main()方法是"static",為了要能使用Point類別,該類別也必須被宣告為"static"。
被宣告為static的內部類別,事實上也可以看作是另一種名稱空間的管理方式,例如:
public class Outer {
public static class Inner {
....
}
....
}
您可以如以下的方式來使用Inner類別:
Outer.Inner inner = new Outer.Inner();
在檔案管理方面,內部類別在編譯完成之後,所產生的檔案名稱為「外部類別名稱$內部類別名稱.class」,而內部匿名類別則在編譯完成之後產生「外部類別名稱$編號.class」,編號為1、2、3.....,看它是外部類別中的第幾個匿名類別。
在類別中您還可以定義類別,稱之為內部類別(Inner class)或「巢狀類別」(Nested class)。非"static"的內部類別可以分為三種:成員內部類別(Member inner class)、區域內部類別(Local inner class)與匿名內部類別(Anonymous inner class)。
使用內部類別的好處在於可以直接存取外部類別的私用(private)成員,舉個例子來說,在視窗程式中,您可以使用內部類別來實作一個事件傾聽者類別,這個視窗傾聽者類別可以直接存取視窗元件,而不用透過參數傳遞。
另一個好處是,當某個Slave類別完全只服務於一個Master類別時,我們可以將之設定為內部類別,如此使用Master類別的人就不用知道 Slave的存在。
成員內部類別是直接宣告類別為成員,例如:
public class OuterClass {
// ....
// 內部類別
private class InnerClass {
// ....
}
}
內部類別同樣也可以使用"public"、"protected"或"private"來修飾,通常宣告為"private"的情況較多,下面這個程式簡單示範成員內部類別的使用:
OutClass.java
public class OutClass { // 內部類別 private class Point { private int x, y; public Point() { x = 0; y = 0; } public void setPoint(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } } private Point[] points; public OutClass(int length) { points = new Point[length]; for(int i = 0; i < points.length; i++) { points[i] = new Point(); points[i].setPoint(i*5, i*5); } } public void showPoints() { for(int i = 0; i < points.length; i++) { System.out.printf("Point[%d]: x = %d, y = %d%n", i, points[i].getX(), points[i].getY()); } } }
上面的程式假設Point類別只服務於OutClass類別,所以使用OutClass時,不必知道Point類別的存在,例如:
UseInnerClass.java
public class UseInnerClass { public static void main(String[] args) { OutClass out = new OutClass(10); out.showPoints(); } }
區域內部類別的使用與成員內部類別類似,區域內部類別定義於一個方法中,類別的可視範圍與生成之物件僅止於該方法之中,區域內部類別的應用一般較為少見。
內部匿名類別可以不宣告類別名稱,而使用new直接產生一個物件,該物件可以是繼承某個類別或是實作某個介面,內部匿名類別的宣告方式如下:
new [類別或介面()] {
// 實作
}
一個使用內部匿名類別的例子如下所示,您直接繼承Object類別來生成一個物件,並改寫其toString()方法:
UseInnerClass.java
public class UseInnerClass { public static void main(String[] args) { Object obj = new Object() { public String toString() { return "匿名類別物件"; } }; System.out.println(obj.toString()); } }
執行結果:
匿名類別物件
注意如果要在內部匿名類別中使用某個方法中的變數,它必須宣告為"final",例如下面是無法通過編譯的:
....
public void someMethod() {
int x = 10;
Object obj = new Object() {
public String toString() {
return "" + x;
}
};
System.out.println(obj.toString());
}
編譯器會回報以下的錯誤:
local variable x is accessed from within inner class; needs to be declared final
您要在 x 宣告時加上final才可以通過編譯:
....
public void someMethod() {
final int x = 10;
Object obj = new Object() {
public String toString() {
return "" + x;
}
};
System.out.println(obj.toString());
}
究其原因,在於 區域變數 x 並不是真正被拿來於內部匿名類別中使用,而是在內部匿名類別中複製一份,作為field成員來使用,由於是複本,即便您在內部匿名類別中對 x 作了修改,會不會影響真正的區域變數 x,事實上您也通不過編譯器的檢查,因為編譯器要求您加上"final"關鍵字,這樣您就知道您不能在內部匿名類別中改變 x 的值。
內部類別還可以被宣告為"static",不過由於是"static",它不能存取外部類別的方法,而必須透過外部類別所生成的物件來進行呼叫,一般來說較少使用,一種情況是在main()中要使用某個內部類別時,例如:
UseInnerClass.java
public class UseInnerClass { private static class Point { private int x, y; public Point(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } } public static void main(String[] args) { Point p = new Point(10, 20); System.out.printf("x = %d, y = %d%n", p.getX(), p.getY()); } }
由於main()方法是"static",為了要能使用Point類別,該類別也必須被宣告為"static"。
被宣告為static的內部類別,事實上也可以看作是另一種名稱空間的管理方式,例如:
public class Outer {
public static class Inner {
....
}
....
}
您可以如以下的方式來使用Inner類別:
Outer.Inner inner = new Outer.Inner();
在檔案管理方面,內部類別在編譯完成之後,所產生的檔案名稱為「外部類別名稱$內部類別名稱.class」,而內部匿名類別則在編譯完成之後產生「外部類別名稱$編號.class」,編號為1、2、3.....,看它是外部類別中的第幾個匿名類別。
发表评论
-
ant build.xml例子
2010-01-10 20:16 2509<?xml version="1.0" ... -
避免内存泄露专题
2009-12-17 16:19 1233For Java: 1.限制使用单例模式;单例模式是引发mem ... -
万恶的inner class, memory leak的源头之一
2009-12-17 15:35 1325非static inner class隐式的含有一个引用指向o ... -
resolve maven [Request to merge when 'filtering' is not identical]. issue
2009-11-06 11:18 2708mvn org.apache.maven.plugins:ma ... -
an example of cloneable
2009-10-10 09:43 1079The following code describes ho ... -
jvm 远程debug
2009-04-17 10:01 1147-Xdebug -Xrunjdwp:transport=dt_ ... -
java dynamic proxy
2008-11-21 20:45 1132package proxy.cxz.org; impor ... -
serializable例子一则
2008-11-15 21:13 1054实现Serializable接口,编写地定义的针对transi ... -
jmx添加naming service以及一个rmi 监听方式
2008-11-11 15:22 2632ObjectName namingName = new ... -
指定编码器、解码器,并且利用ByteBuffer读写文件
2008-11-04 20:48 2687指定编码器、解码器,并且利用ByteBuffer读写文件。 做 ... -
java 网络编程探讨
2008-11-02 19:30 2096毕业有一年多了,大学的时候上过网络课程,但我一直认为:网络技术 ... -
Differences Between notify() and notifyAll()
2008-08-08 21:20 1051package com.cxz.currency.test; ... -
一套基于http的聊天c/s结构工具(除了网页tomcat还能做什么)
2008-08-08 11:51 4048在我的认识当中以前一直有一种误区认为:tomcat=web。在 ... -
jdk1.6中添加的future
2008-07-18 13:59 1327摘自:http://caterpillar.onlyfun.n ... -
模拟jdk1.5中reentrantlock
2008-07-18 13:15 1199选自:java线程2e。 类似于jdk1.5中的reentra ... -
java线程2e中写得相当花哨的thread例子!
2008-07-14 16:53 1782太鲜灵儿了! package com.cxz.tools; ... -
j2se中实现jndi的控制、管理
2008-07-01 19:34 1169jndi例子一则,转载自网络。利用一个container实现了 ... -
jmx控制tomcat
2008-07-01 09:22 5048以前所作的一切应用程序基本上都是由tomcat容器,控制web ... -
jmx例子一则
2008-06-30 07:32 2893很简单的一个hellojmx的例子。其中实现了:标准bean、 ... -
nio与io的比较
2008-06-21 17:31 14945nio是new io的简称,从jdk1.4就被引入了。现在的j ...
相关推荐
Java 易混淆概念 Anonymous Inner Class Java编程语言中存在一些易混淆的概念,今天我们将探讨 Anonymous Inner Class、final、finally、finalize 的区别,Static Nested Class 和 Inner Class 的不同,&和&&的区别...
可以通过"OuterClass.InnerClass"的方式引用静态成员类,如`new Outer.Inner1()`。 6. **使用场景** - 当需要创建一个与外部类紧密相关的辅助类,并且希望这个类在没有外部类实例的情况下也能存在时,可以使用...
Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)
在“java_innerclass_instance.rar_innerclass”这个压缩包中,包含的资源可能是一个关于Java内部类实例应用的示例代码。 内部类主要有四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。这里我们主要...
OuterClass.InnerClass innerObj = outerObj.new InnerClass(); ``` #### 三、访问权限 内部类和静态嵌套类都可以声明不同的访问权限,包括`public`、`protected`、`package-private`(默认访问权限)、`private...
嵌套类主要分为两大类:静态嵌套类(Static Nested Class)和非静态嵌套类(Non-static Nested Class),后者通常被称为内部类(Inner Class)。 - **静态嵌套类**:此类嵌套类被声明为`static`,因此它们与外部类...
1. 对于成员内部类和静态嵌套类,可以通过`new OuterClass().new InnerClass()`或`OuterClass.InnerClass inner = new OuterClass().new InnerClass();`来实例化。 2. 局部内部类和匿名内部类只能在定义它们的方法...
匿名内部类 inner class 马克-to-win java视频的详细介绍
内部类(Inner Class)是Java语言中一个独特的特性,它允许在一个类的内部定义另一个类。这种设计模式在处理特定问题时提供了更大的灵活性,比如实现事件监听器、封装复杂逻辑或者创建私有的辅助类。本章我们将深入...
InnerClass01Test.java
在Java中,还有Static Nested Class和Inner Class的概念。Static Nested Class意味着创建一个static内部类的对象,不需要一个外部类对象,不能从一个static内部类的一个对象访问一个外部类对象。 在Java面试中,还...
匿名内部类 inner class 马克-to-win java视频的详细介绍
在Android开发过程中,有时会遇到导入项目时出现错误警告,比如"Ignoring InnerClasses attribute for an anonymous inner class"。这个问题并不会阻止项目在Windows系统上运行,但可能会导致在其他平台如OS X上无法...
Java面向对象(高级)-- 类的成员之五:内部类(InnerClass)
Java 面试题 经典 第一,谈谈final, finally, finalize的区别。...第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 第四,&和&&的区别。 第五,HashMap和Hashtable的区别。
java程序代码,供大家参考。不会的时候可以看看啊
Instance inner 实例内部类 马克-to-win java视频的介绍
本节内容包括 接口基本概念 使用接口的例子 接口的定义 接口的实现 接口与抽象类 接口和回调 内部类(介绍)
Instance inner 实例内部类 马克-to-win java视频的介绍