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(修饰符)
闲言碎语:这 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在使用类之前,必须在方法区中为这些类变量分配空间。所以类变量是所有类实例共享的,即使没有任何类实例,它也可以被访问。这些变量只与类有关。
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. (顺藤摸瓜,制造一个可控的接口)
分享到:
相关推荐
`StaticNestedClass`是静态内部类,它不依赖于外部类的实例;`InnerClass`是非静态内部类,需要依赖于外部类的实例。 #### 27. 内部类引用外部类成员 **问题**: 内部类可以引用它的包含类的成员吗?有没有什么限制...
Java 面试题 经典 第一,谈谈final, finally, finalize的区别。...第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 第四,&和&&的区别。 第五,HashMap和Hashtable的区别。
- 在`Test03`案例中,`Koo1`是`someMethod`方法内的局部内部类,它可以访问`num`这个`final`变量。 内部类在实际开发中常用于实现特定功能,如事件监听器、线程等。它们提供了封装和抽象的高级特性,使得代码更加...
OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass(); ``` 总结起来,Inner Class和Static Nested Class的主要区别在于: 1. **依赖性**:Inner Class实例化需要外部类的实例;而Static ...
本文将详细解释JAVA程序员面试中的32个问题,涵盖final、finally、finalize的区别、Anonymous Inner Class、Static Nested Class、HashMap和Hashtable的区别、Collection和Collections的区别、断言的使用、GC的概念...
### 2012 Java面试题全攻略 #### 第一题:final, finally, finalize 的区别 1. **final** - `final` 是一个修饰符,它可以应用于类、方法以及变量。 - 当一个类被声明为 `final` 时,这意味着该类不能被继承,...
- 可以通过外部类名直接访问,例如 `Outer.StaticNestedClass`. - 由于它不依赖于外部类的实例,因此可以访问外部类的所有静态成员。 - 静态嵌套类与普通类在运行时的行为和功能上几乎相同。 #### 四、& 和 && ...
- **方法级别的final**:`final`方法不能被子类重写(override),只能使用。 2. **finally块**: - `finally`块用于异常处理中,确保无论是否发生异常,都会执行一些清理操作。 - 如果抛出了异常并找到了匹配的...
#### 三、Static Nested Class 和 Inner Class 的区别 1. **Static Nested Class (静态内部类)** - **定义**: 静态内部类是内部类的一种类型,它的定义前面加上了 `static` 关键字。 - **特点**: - 不依赖于...
- 静态内部类(Static Nested Class)无需外部类实例就能创建对象,且可以访问外部类的静态成员,而不能直接访问非静态成员。 - 非静态内部类(Inner Class)需要外部类实例才能创建对象,可以访问外部类的所有...
- synchronized可以与static或final一起使用,但不能与abstract一起使用。 22. **接口继承与实现**: - 接口可以继承接口。 - 抽象类可以实现接口。 - 抽象类可以继承实体类。 23. **启动线程**: - 使用...
通常,`static final`关键字一起使用,创建不可变的类级别常量。这些常量在编译时就被确定,提高了性能。 理解并熟练使用`static`关键字对于提升Java编程能力至关重要。它可以帮助你编写更加高效和可维护的代码,...
Static Nested Class意味着创建一个static内部类的对象,不需要一个外部类对象,不能从一个static内部类的一个对象访问一个外部类对象。 在Java面试中,还需要了解&和&&的区别。&是位运算符,&&是布尔逻辑运算符。 ...
在上面的例子中,`StaticNestedClass`可以直接访问`OuterClass`的静态成员`str_2`,并通过持有`OuterClass`的实例引用`outer`来访问实例成员`str_1`及实例方法`print_instance()`。 #### 三、非静态嵌套类(内部类...
- Static Nested Class(静态嵌套类):它可以独立于外部类存在,不需要外部类的实例就可以创建。由于没有隐含的外部类引用,它不能直接访问外部类的非 static 成员。静态嵌套类可以声明为 static,这使得它们可以...
- 内部类分为静态内部类(`StaticNestedClass`)和非静态内部类(`InnerClass`)。 - 静态内部类不依赖外部类实例,而非静态内部类需要外部类实例。 #### 27. 内部类引用外部类成员 - 内部类可以直接访问外部类的所有...
- **方法**:被声明为`final`的方法不能在子类中被重写,只能被使用。 - **变量**:被声明为`final`的变量一旦初始化后就不能被修改,通常用来表示常量。 2. **finally**: - **异常处理**:`finally`块用于异常...
使用`public static final`关键字定义的变量通常被视为静态常量,其名称通常采用全大写字母和下划线分隔的约定,例如: ```java public class Constants { public static final int MAX_VALUE = 100; } ``` ...
- 使用final修饰变量意味着变量的引用不能变,如果是对象则对象本身可以变。 - ==比较的是引用的地址,而equals方法通常用来比较对象的内容。 - static变量属于类,而实例变量属于对象。 - static方法内可以调用...
- **静态嵌套类**(Static Nested Class):不属于任何外部类实例,通过类名直接访问。 #### 27. 内部类引用外部类成员 - 内部类可以访问外部类的所有成员,包括私有成员。 - 没有任何限制。 #### 28. 匿名内部类...