- 浏览: 218687 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
flychao88:
nothingismao 写道623deyingxiong 写 ...
nio与io的比较 -
李冰冰:
如果NIO单个线程处理业务逻辑,那么如果这个业务逻辑非常耗时, ...
nio与io的比较 -
wj_126mail:
IO是一个连接就创建一个线程来处理;NIO是一个线程在处理所有 ...
nio与io的比较 -
nothingismao:
623deyingxiong 写道wwj85523 写道 看完 ...
nio与io的比较 -
623deyingxiong:
wwj85523 写道
看完后我迷糊了,
IO一样可以一个线 ...
nio与io的比较
前言:
本来是想总结一下inner class 的用法,但是却发现这几位颇为亲近。索性一起拉出来溜溜。
写作目的:
跟 static , final, inner class 搞好关系,以便将来遇见了,就像用if ,else一样,一清二楚。
文中的术语定义以java language spec为准。
先想想,要关注的是那些地方?
1。语法。 (code, 我们吃饭的家伙)
2。语义。 (其实写代码也就是为了这个)
3。怎么用简单,可人的结构来表达语义。(这也是每个程序员追求的)
语义无限的,语法是Limited, 我们要理解不同的语法所表现的语义,这是本文的重点。
1。final 篇
final 做为一个独立的存在,也表现的与众不同。一般情况都可以理解为 can't be changed.
1)final data: 实现constant语义。说明这个值:在编译时不会变;在运行时也不能被改变。
在java中,提供了blank final:允许大家将初始化的动作延迟到constructor中。这是极限,有编译器保证。
2)final parameter: 同上语义。
3)final method:
a)防止子类overriden.(注:这个角度,private 隐含了final语义) b)efficiency: 允许编译器转换调用为inline call.
4)final class: 拒绝inherited.
2。static 篇
1。定义:static is modifier.本想找一个权威的定义给大家,才发现此物没有特定范围。也就意味着可能明天还有新的用法,也说明了语言的无限扩展性。不得以,我们只好在此注明:以下用法为java 1.5 之前的说明:
闲言碎语:这 static 可不得了,跟谁沾上整个就变质了。如果你想标榜独立个性,请用。static 一上,就表明 “我是人民的公仆,你只要找得着我,就可以让我为您服务“。它属于定义层次,在jvm层次独一无二。从另一个角度上,它只能用于成员定义。我们不能定义一个 top-level class 为static.
public static class Outest { // compile error
...;
}
装载:
因为static成员(include field, method, nested class)是在存储在类定义层次的,只要任何与其类相关的操作,均会产生它的初始化动作。(也就意味着,它已经准备就绪,你只要想用就用。classname.staticMember)
所有的static object/primitive and static block,按照先来后到的顺序执行初始化操作。
与其他一样。
可以用在:
1)static import (static import ...)
single-static-import declaration: import static TypeName.Identifier 使得访问标识得以简化。(简单,无二义)
2) static initializer: (static {}):
完成一段初始化操作.常见用法:
3) static field: (static type field)
static field : 别名:class variable ;
non-static fileds: 别名:instance variable.
4) static method: (static type method())
同上。
5)static member type.( member class & member interface:
此处放在 nested class 部分讲解)
jvm是实现这些java程序语义的根源:类变量是作为类型信息的一部分存储在方法区(jvm放置类定义的内存结构)。jvm在使用类之前,必须在方法区中为这些类变量分配空间。所以类变量是所有类实例共享的,即使没有任何类实例,它也可以被访问。这些变量只与类有关。
下面是重头戏:nested class.
3。nested class 篇
说到类定义,我们先看看有那些值得关注的:
在java中,类声明的表现形式可以分为两种:
1)top level class:
2)nested class:
define: nestd class is any class whose declaration occurs within the body of another class or interface.
top level class is a class that is not a nested class.
而在nested class 我们需要特殊关注的是inner class, local class, anonymous class的用法。
在讨论下面两种特殊定义时,我们先看看一个重要概念:inner class.
1)An inner class is a nested class that is not explicitly or implicitly declared
static. Inner classes may not declare static initializers or member interfaces.
Inner classes may not declare static members, unless they are compile-time
constant fields。(对内部类的限制:不能声明static 初始化操作)
在这里我要澄清一点:Nested class != inner class, inner class 是一种特殊的 Nested class.Bruce 大叔在thinking java 3rd中混肴了这两个概念。(汗,直到写此文时我才究正过来,还好我写得时候把 java language spec和 jvm spec 拿来参考)
看看inner class 的表现形式吧。
/* 普通的情况 */
class HasStatic{
static int j = 100;
|
class Outer{
class Inner extends HasStatic {
static final int x = 3; // ok - compile-time constant
static int y = 4; // compile-time error, an inner class
}
static class NestedButNotInner {
static int z = 5; // ok, not an inner class
}
interface NeverInner{} // interfaces are never inner
}
2)local class: is a nested class that is not a member of any class and that has a name. all local classes are inner classes. local class 不能用public, protected, private, or static声明(编译错误).
从定义中我们可以看出,它的生命期是 block scope.比较local variable的形式,就不难理解其语义。同样你也不能用modifier(public/static etc.)去定义一个局部变量。
e.p
class Test {
public static void main (String[] args) {
int i ;
// public class Local{} : compile error: illegal start of expression
class Local {
{
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
}
public void p() {
System.out.println("call local class p():");
}
}
Local l = new Local();
l.p();
}
}
3)anonymous class:is automatically derived from a class instance creation expression by the compiler.
:1.never abstract; 2.inner class; 3.never static; 4.impicitly final.
interface Contents{};
public class Parcel6 {
public Contents cont() {
return new Contents() {
private int i = 11;
public int value() { return i; }
};
}
public static void main(String[] args) {
Parcel6 p = new Parcel6();
Contents c = p.cont();
}
} ///:~
这个看似神秘的结构,让你将类的定义和构建过程融为一体。实际上它实现的语义是:
class MyContents implements Contents {
private int i = 11;
public int value() { return i; }
}
return new MyContents();
(impicitly final)这样大家就一目了然了吧。
看了以上或简单,或复杂的类定义。也许大家都有些头痛。为什么java提供如此丰富的类定义方式呢?不如让我们问问自己,我们定义类的目的是什么?是为了让我们的程序拥有更好的逻辑结构。类定义是信息组织的形式。java语言给我们提供了在各个的实现阶段允许我们去做信息的封装,真正是everything is object.这些是我们应该高兴的事才对。它绝不是负担,只是给我们更多的选择空间。
语义特点:(以下inner class is thinkingInjava3th 中的定义,可以看作本文所定义的nested class)
Each inner class can independently inherit from an implementation. Thus, the inner class is not limited by whether the outer class is already inheriting from an implementation.
(是不是看到了点什么,多继承!!visitor pattern!!)
1。 The inner class can have multiple instances, each with its own state information that is independent of the information in the outer class object. 一个独立的实体,诞生于某个更大的实体中(外部实体),却可以用外部实体的资源(请联想寄生虫:<)
2。 In a single outer class you can have several inner classes, each of which implement the same interface or inherit from the same class in a different way. (可以有不同种类的寄生虫)
3。The point of creation of the inner class object is not tied to the creation of the outer class object.
(它的创建过程并不系于外部对象的创建)
4。There is no potentially confusing “is-a” relationship with the inner class; it’s a separate entity.
(于外部类无inherit关系)
经过以上的说明,你是否头脑中更清晰了些:
Inner class 常见用法:
Closures & Callbacks
1.在java中可以利用Inner class 实现Closure(闭包) 和 Callback(回调) 语义:
Closure的定义:(我试图从不同侧面来阐述这个概念)
Martin Fowler :Essentially a closure is a block of code that can be passed as an argument to a function call.
Bruce:A closure is a callable object that retains information from the scope in which it was created.
那什么时候使用它呢?它有什么优点呢?
打个比方:让你去照看小孩:你是想要婴儿还是小学生呢?我想大多数人会选择小学生。为什么?因为小学生可以自己吃饭,自己上厕所,自己洗澡。这两个对象的实现,你更偏向哪一个呢?:)
call back:With a callback, some other object is given a piece of information that allows it to call back into the originating object at some later point. (顺藤摸瓜,制造一个可控的接口)
转自http://www.iteye.com/topic/15022
本来是想总结一下inner class 的用法,但是却发现这几位颇为亲近。索性一起拉出来溜溜。
写作目的:
跟 static , final, inner class 搞好关系,以便将来遇见了,就像用if ,else一样,一清二楚。
文中的术语定义以java language spec为准。
先想想,要关注的是那些地方?
1。语法。 (code, 我们吃饭的家伙)
2。语义。 (其实写代码也就是为了这个)
3。怎么用简单,可人的结构来表达语义。(这也是每个程序员追求的)
语义无限的,语法是Limited, 我们要理解不同的语法所表现的语义,这是本文的重点。
1。final 篇
final 做为一个独立的存在,也表现的与众不同。一般情况都可以理解为 can't be changed.
1)final data: 实现constant语义。说明这个值:在编译时不会变;在运行时也不能被改变。
在java中,提供了blank final:允许大家将初始化的动作延迟到constructor中。这是极限,有编译器保证。
2)final parameter: 同上语义。
3)final method:
a)防止子类overriden.(注:这个角度,private 隐含了final语义) b)efficiency: 允许编译器转换调用为inline call.
4)final class: 拒绝inherited.
2。static 篇
1。定义:static is modifier.本想找一个权威的定义给大家,才发现此物没有特定范围。也就意味着可能明天还有新的用法,也说明了语言的无限扩展性。不得以,我们只好在此注明:以下用法为java 1.5 之前的说明:
闲言碎语:这 static 可不得了,跟谁沾上整个就变质了。如果你想标榜独立个性,请用。static 一上,就表明 “我是人民的公仆,你只要找得着我,就可以让我为您服务“。它属于定义层次,在jvm层次独一无二。从另一个角度上,它只能用于成员定义。我们不能定义一个 top-level class 为static.
public static class Outest { // compile error
...;
}
装载:
因为static成员(include field, method, nested class)是在存储在类定义层次的,只要任何与其类相关的操作,均会产生它的初始化动作。(也就意味着,它已经准备就绪,你只要想用就用。classname.staticMember)
所有的static object/primitive and static block,按照先来后到的顺序执行初始化操作。
与其他一样。
可以用在:
1)static import (static import ...)
single-static-import declaration: import static TypeName.Identifier 使得访问标识得以简化。(简单,无二义)
2) static initializer: (static {}):
完成一段初始化操作.常见用法:
3) static field: (static type field)
static field : 别名:class variable ;
non-static fileds: 别名:instance variable.
4) static method: (static type method())
同上。
5)static member type.( member class & member interface:
此处放在 nested class 部分讲解)
jvm是实现这些java程序语义的根源:类变量是作为类型信息的一部分存储在方法区(jvm放置类定义的内存结构)。jvm在使用类之前,必须在方法区中为这些类变量分配空间。所以类变量是所有类实例共享的,即使没有任何类实例,它也可以被访问。这些变量只与类有关。
下面是重头戏:nested class.
3。nested class 篇
说到类定义,我们先看看有那些值得关注的:
在java中,类声明的表现形式可以分为两种:
1)top level class:
2)nested class:
define: nestd class is any class whose declaration occurs within the body of another class or interface.
top level class is a class that is not a nested class.
而在nested class 我们需要特殊关注的是inner class, local class, anonymous class的用法。
在讨论下面两种特殊定义时,我们先看看一个重要概念:inner class.
1)An inner class is a nested class that is not explicitly or implicitly declared
static. Inner classes may not declare static initializers or member interfaces.
Inner classes may not declare static members, unless they are compile-time
constant fields。(对内部类的限制:不能声明static 初始化操作)
在这里我要澄清一点:Nested class != inner class, inner class 是一种特殊的 Nested class.Bruce 大叔在thinking java 3rd中混肴了这两个概念。(汗,直到写此文时我才究正过来,还好我写得时候把 java language spec和 jvm spec 拿来参考)
看看inner class 的表现形式吧。
/* 普通的情况 */
class HasStatic{
static int j = 100;
|
class Outer{
class Inner extends HasStatic {
static final int x = 3; // ok - compile-time constant
static int y = 4; // compile-time error, an inner class
}
static class NestedButNotInner {
static int z = 5; // ok, not an inner class
}
interface NeverInner{} // interfaces are never inner
}
2)local class: is a nested class that is not a member of any class and that has a name. all local classes are inner classes. local class 不能用public, protected, private, or static声明(编译错误).
从定义中我们可以看出,它的生命期是 block scope.比较local variable的形式,就不难理解其语义。同样你也不能用modifier(public/static etc.)去定义一个局部变量。
e.p
class Test {
public static void main (String[] args) {
int i ;
// public class Local{} : compile error: illegal start of expression
class Local {
{
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
}
public void p() {
System.out.println("call local class p():");
}
}
Local l = new Local();
l.p();
}
}
3)anonymous class:is automatically derived from a class instance creation expression by the compiler.
:1.never abstract; 2.inner class; 3.never static; 4.impicitly final.
interface Contents{};
public class Parcel6 {
public Contents cont() {
return new Contents() {
private int i = 11;
public int value() { return i; }
};
}
public static void main(String[] args) {
Parcel6 p = new Parcel6();
Contents c = p.cont();
}
} ///:~
这个看似神秘的结构,让你将类的定义和构建过程融为一体。实际上它实现的语义是:
class MyContents implements Contents {
private int i = 11;
public int value() { return i; }
}
return new MyContents();
(impicitly final)这样大家就一目了然了吧。
看了以上或简单,或复杂的类定义。也许大家都有些头痛。为什么java提供如此丰富的类定义方式呢?不如让我们问问自己,我们定义类的目的是什么?是为了让我们的程序拥有更好的逻辑结构。类定义是信息组织的形式。java语言给我们提供了在各个的实现阶段允许我们去做信息的封装,真正是everything is object.这些是我们应该高兴的事才对。它绝不是负担,只是给我们更多的选择空间。
语义特点:(以下inner class is thinkingInjava3th 中的定义,可以看作本文所定义的nested class)
Each inner class can independently inherit from an implementation. Thus, the inner class is not limited by whether the outer class is already inheriting from an implementation.
(是不是看到了点什么,多继承!!visitor pattern!!)
1。 The inner class can have multiple instances, each with its own state information that is independent of the information in the outer class object. 一个独立的实体,诞生于某个更大的实体中(外部实体),却可以用外部实体的资源(请联想寄生虫:<)
2。 In a single outer class you can have several inner classes, each of which implement the same interface or inherit from the same class in a different way. (可以有不同种类的寄生虫)
3。The point of creation of the inner class object is not tied to the creation of the outer class object.
(它的创建过程并不系于外部对象的创建)
4。There is no potentially confusing “is-a” relationship with the inner class; it’s a separate entity.
(于外部类无inherit关系)
经过以上的说明,你是否头脑中更清晰了些:
Inner class 常见用法:
Closures & Callbacks
1.在java中可以利用Inner class 实现Closure(闭包) 和 Callback(回调) 语义:
Closure的定义:(我试图从不同侧面来阐述这个概念)
Martin Fowler :Essentially a closure is a block of code that can be passed as an argument to a function call.
Bruce:A closure is a callable object that retains information from the scope in which it was created.
那什么时候使用它呢?它有什么优点呢?
打个比方:让你去照看小孩:你是想要婴儿还是小学生呢?我想大多数人会选择小学生。为什么?因为小学生可以自己吃饭,自己上厕所,自己洗澡。这两个对象的实现,你更偏向哪一个呢?:)
call back:With a callback, some other object is given a piece of information that allows it to call back into the originating object at some later point. (顺藤摸瓜,制造一个可控的接口)
转自http://www.iteye.com/topic/15022
发表评论
-
ant build.xml例子
2010-01-10 20:16 2512<?xml version="1.0" ... -
避免内存泄露专题
2009-12-17 16:19 1237For Java: 1.限制使用单例模式;单例模式是引发mem ... -
万恶的inner class, memory leak的源头之一
2009-12-17 15:35 1327非static inner class隐式的含有一个引用指向o ... -
resolve maven [Request to merge when 'filtering' is not identical]. issue
2009-11-06 11:18 2711mvn org.apache.maven.plugins:ma ... -
an example of cloneable
2009-10-10 09:43 1081The following code describes ho ... -
jvm 远程debug
2009-04-17 10:01 1150-Xdebug -Xrunjdwp:transport=dt_ ... -
java dynamic proxy
2008-11-21 20:45 1134package proxy.cxz.org; impor ... -
serializable例子一则
2008-11-15 21:13 1056实现Serializable接口,编写地定义的针对transi ... -
jmx添加naming service以及一个rmi 监听方式
2008-11-11 15:22 2634ObjectName namingName = new ... -
指定编码器、解码器,并且利用ByteBuffer读写文件
2008-11-04 20:48 2689指定编码器、解码器,并且利用ByteBuffer读写文件。 做 ... -
java 网络编程探讨
2008-11-02 19:30 2097毕业有一年多了,大学的时候上过网络课程,但我一直认为:网络技术 ... -
Differences Between notify() and notifyAll()
2008-08-08 21:20 1052package com.cxz.currency.test; ... -
一套基于http的聊天c/s结构工具(除了网页tomcat还能做什么)
2008-08-08 11:51 4050在我的认识当中以前一直有一种误区认为:tomcat=web。在 ... -
jdk1.6中添加的future
2008-07-18 13:59 1329摘自: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 1785太鲜灵儿了! package com.cxz.tools; ... -
j2se中实现jndi的控制、管理
2008-07-01 19:34 1171jndi例子一则,转载自网络。利用一个container实现了 ... -
jmx控制tomcat
2008-07-01 09:22 5050以前所作的一切应用程序基本上都是由tomcat容器,控制web ... -
jmx例子一则
2008-06-30 07:32 2895很简单的一个hellojmx的例子。其中实现了:标准bean、 ... -
nio与io的比较
2008-06-21 17:31 14949nio是new io的简称,从jdk1.4就被引入了。现在的j ...
相关推荐
Java 面试题 经典 第一,谈谈final, finally, finalize的区别。...第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 第四,&和&&的区别。 第五,HashMap和Hashtable的区别。
Java编程语言中存在一些易混淆的概念,今天我们将探讨 Anonymous Inner Class、final、finally、finalize 的区别,Static Nested Class 和 Inner Class 的不同,&和&&的区别,HashMap 和 Hashtable 的区别,...
总结起来,Inner Class和Static Nested Class的主要区别在于: 1. **依赖性**:Inner Class实例化需要外部类的实例;而Static Nested Class不需要。 2. **成员访问**:Inner Class可以访问外部类的所有成员,包括...
Static Nested Class和Inner Class是Java中两种不同的内部类。Static Nested Class不需要一个外部类对象,可以独立存在,而Inner Class需要一个外部类对象,才能存在。Inner Class可以访问外部类的所有成员,而...
在上面的例子中,`StaticNestedClass`可以直接访问`OuterClass`的静态成员`str_2`,并通过持有`OuterClass`的实例引用`outer`来访问实例成员`str_1`及实例方法`print_instance()`。 #### 三、非静态嵌套类(内部类...
在Java中,还有Static Nested Class和Inner Class的概念。Static Nested Class意味着创建一个static内部类的对象,不需要一个外部类对象,不能从一个static内部类的一个对象访问一个外部类对象。 在Java面试中,还...
本文将对 Java 面试题进行详解,涵盖 final、finally、finalize、Anonymous Inner Class、Static Nested Class、Inner Class、& 和&&、HashMap 和 Hashtable、Collection 和 Collections 等知识点。 一...
3. Static Nested Class 和 Inner Class 的不同 Inner Class 是一个内部类,需要外部类对象来访问,而 Static Nested Class 不需要外部类对象。Inner Class 可以访问外部类对象的成员变量,而 Static Nested Class...
final—修饰符 Anonymous Inner Class Static Nested Class 和 Inner Class的不同
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类...
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 第四,&和&&的区别。 第五,HashMap和Hashtable的区别。 第六,Collection 和 Collections的区别。 第七,什么时候...
本文将对Java中的异常处理机制、垃圾回收机制、Error与Exception的区别、final、finally、finalize的区别、Anonymous Inner Class、static Nested Class与Inner Class的区别、HashMap与Hashtable的区别、断言、垃圾...
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 第四,&和&&的区别。 这个问得很少。 第五,HashMap和Hashtable的区别。 常问。 第六,Collection 和 ...
1. 静态内部类(Static Nested Class): - 静态内部类是使用`static`关键字声明的,它可以像其他静态成员一样被外部类的静态引用直接访问。 - 静态内部类不能直接访问外部类的非静态成员,因为它们不持有外部类的...
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 第四,&和&&的区别。 第五,HashMap和Hashtable的区别。 第六,Collection 和 Collections的区别。 第七,什么时候...
第三、Static Nested Class 和 Inner Class 的区别: * Static Nested Class 是一个 static 的内部类,它可以独立于外部类实例化。 * Inner Class 是一个非 static 的内部类,它只能在外部类实例化后才能被实例化。...
- 静态内部类(Static Nested Class):类似于普通的顶级类,但仍然与外部类有联系。它们不能直接访问外部类的非静态成员,但可以通过实例化外部类对象来访问。 - 非静态内部类(Member Inner Class):可以直接...
三、Static Nested Class和Inner Class的不同 Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。 四、&和&&的区别 &是...
三、Static Nested Class 和 Inner Class 的不同 Nested Class(一般是 C++ 的说法),Inner Class(一般是 JAVA 的说法)。Java内部类与 C++ 嵌套类最大的不同就在于是否有指向外部的引用上。静态内部类(Inner ...
StaticNestedClass nested = new StaticNestedClass(); nested.display(); } } ``` #### 总结 内部类提供了强大的功能来组织和封装代码。通过理解不同类型的内部类以及如何使用它们,你可以更有效地编写清晰、...