本帖最后由 沫然 于 2014-4-10 22:53 编辑
Nested Class (一般是C++的说法),InnerClass (一般是JAVA的说法)。
Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。
Nested class分为静态Static nestedclass 的和非静态的 inner class,
静态的Static nested class是不可以直接调用它的外部类enclosing class的,但是可以通过外部类的引用来调用,就像你在一个类中写了main方法一样。
非静态类inner class 可以自由的引用外部类的属性和方法,但是它与一个实例绑定在了一起,不可以定义静态的属性、方法。
Inner Class(内部类)定义在类中的类。
Nested Class(嵌套类)是静态(static)内部类。 1. 要创建嵌套类的对象,并不需要其外围类的对象。 2. 不能从嵌套类的对象中访问非静态的外围类对象。
Anonymous Inner Class (匿名内部类)匿名的内部类是没有名字的内部类。
匿名的内部类不能extends(继承)其它类,但一个内部类可以作为一个接口,由另一个内部类实现。
嵌套类可以作为接口的内部类。正常情况下,你不能在接口内部放置任何代码,但嵌套类可以作为接口的一部分,因为它是static 的。只是将嵌套类置于接口的命名空间内,这并不违反接口的规则。
静态方法是不能继承的,因为它是静态的,所谓静态当然是时间和空间的静止喽. 然后final是java里面定义的,不能被重载的函数。
java里面的函数如果没有特别标识,只要在子类中定义了一个同名的函数,那么父类的函数就被重载掉了。如果new一个子类的对象给父类再调用这个函数,就是调用子类的了。只有new的是父类的调的才是父类的。
java里面没有virtual的说法,因为不是final或static就是virtual的。
abstract是虚函数,自然不可能是final的,同时如上所说,static是不能被重载只能被覆盖的,所以也不可以是abstract的。
在使用匿名内部类时,要记住以下几个原则: ·匿名内部类不能有构造方法。 ·匿名内部类不能定义任何静态成员、方法和类。 ·匿名内部类不能是public,protected,private,static。 ·只能创建匿名内部类的一个实例。 ·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。 ·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
匿名类和内部类中的中的this :
有时候,我们会用到一些内部类和匿名类。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。
- /**
- *
- * 普通内部类持有对外部类的一个引用, 静态内部类却没有
- *
- * @author howard
- */
- public class OutterClass {
-
- /*
- * this is static nested class
- */
- private static class StaticNestedClass {
- private void yell() {
- System.out.println(this.toString());
- // OutterClass.this.yell();//静态内部类实例没有外部类实例的引用
- }
- }
-
- /*
- * this is inner class
- */
- private class InnerClass {
- private void yell() {
- System.out.println(this.toString());
- OutterClass.this.yell();//内部类实例显式使用外部类实例的方式
- }
- }
-
- private void yell() {
- System.out.println( this.toString());
- }
-
- private void run() {
- /*
- * this is local class
- */
- class LocalClass {
- public void yell(){
- System.out.println(this.toString());
- }
- }
- /*
- * this is anonymous class
- */
- new Object() {
- public void yell(){
- System.out.println(this.toString());
- }
- }.yell();
- LocalClass lc=new LocalClass();
- InnerClass ic = new InnerClass();
- StaticNestedClass sc=new StaticNestedClass();
- lc.yell();
- ic.yell();
- sc.yell();
- }
-
- public static void main(String[] args) {
- OutterClass oc = new OutterClass();
- oc.run();
- }
- }
复制代码
仔细分析如上代码,可以得出一个结论,所有的内部类,Local 内部类,匿名内部类都可以直接访问外面的封装类的实例变量和方法。而静态嵌套类则不能。
调试代码可以发现,内部类,Local内部类,匿名内部类的实例都持有一个外部封装类实例的隐式引用; 而java对象序列化要求对象里所有的对象成员都实现序列化接口。
所以,如果只有内部类实现序列化,而外部封装类没有实现序列化接口,就会在对内部类进行序列化的时候报出异常。
|