惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Jina AI
Jina AI
博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
美团技术团队
腾讯CDC
博客园 - Franky
MyScale Blog
MyScale Blog
人人都是产品经理
人人都是产品经理
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
aimingoo的专栏
aimingoo的专栏
博客园_首页
V
V2EX
Martin Fowler
Martin Fowler
T
The Blog of Author Tim Ferriss

博客园 - simply-zhao

Java 类加载基本原理[转] 浅谈Java内部类的四个应用场景[转--相当不错的文章] Java 静态内部类/内部类 Java Serializable Interface [转] Java Immutable Class[ From ] Java Clone机制[转] java clone机制 ANT十五大最佳实践【转】 Ant基础 System.TypeInitializationException C# Foundation---keyword: sealed C# Foundation---keyword: new C# Foundation---indexer C# Foundation---keyword: base & this C# Foundation Series C# Foundation---keyword: abstract & virtual & new & override C# Foundation---keyword: const & readonly & static readonly C# Foundation---keyword extern & P/Invoke [OS Homework] C# Foundation---keyword:static & static constructor
Java 局部类/匿名类[转]
simply-zhao · 2008-04-13 · via 博客园 - simply-zhao

[局部类]
对一个静态成员类,去掉其声明中的“
static”关键字,将其定义移入其外部类

的静态方法或静态初始化代码段中就成为了局部静态成员类。

       对一个成员类,将其定义移入其外部类的实例方法或实例初始化代码中就成为了局部成员类。

       局部静态成员类与静态成员类的基本特性相同。例如,都只能访问外部类的静态字段或方法,但不能访问外部类的实例字段和实例方法等。

       局部成员类与成员类的基本特性相同。例如,局部成员类实例必属于其外部类的一个实例,可通过OuterClass.this引用其外部类实例等。

另外,局部类也有其自己的特性,如以下代码所示:

public class Outer {
    
private int instanceField; 
    
private static int staticField; 
    
    
//define a local member class in instance code block
    {
        
int localVirable1 = 0;
        
final int localVirable2 = 1;
        
class Inner1 {
            
public Inner1() {
                
//can access its outer class' field and method directly
                instanceField = 1;
                
//use OuterClass.this to get its corresponding outer class instance
                Outer.this.instanceField = 1;
                
                
//can not access the not final local virable in its containing code block
                
//System.out.print(localVirable1);
                
                
//can access the final local virable in its containing code block
                System.out.print(localVirable2);
            }
        }        
        
        
//local class can not have privilege modifier 
        /*public class inner2 {            
        }
*/
    }
    
    
// define a local static member class in static code block
    static {
        
class Inner2 {
            
public Inner2() {
                staticField 
= 1;
                
//can not access instance field and method in a local static member class 
                
//intanceField = 2;
            }
        }
    }
    
    
public void intanceMethod() {
        
//define a local class in its out class' instance method
        class Inner3 {
        }
        
        
//local class is visible only in its containning code block
        
//Outer.Inner2 inner2;
    }
    
    
private static void staticMethod() {
        
//define a local static member class in its out class' static method
        class Inner4 {    
            
public Inner4() {
                staticField 
= 2;
            }
        }
        
        
//can not define a interface as a local class
        /*interface I {
        }
*/
    }
}


局部类特性
如示例代码所示,局部类能且只能访问其所属代码段中的声明为final的局部变量。为什么只能访问声明为final的局部变量呢?我们知道,局部变量在其所属的代码段(譬如某个函数)执行完毕后就会被回收,而一个局部类的实例却可以在其类定义所属代码段执行完毕后依然存在,如果它可操控非final的局部变量,用户就可以通过该实例修改已不存在的局部变量,无意义。

局部类约束

  • 如示例代码所示,内部类只在定义它的代码段中可见,不能在它所属代码段之外的代码中使用;因此也就没有public/private/default权限修饰符(无意义)
  • 不能以局部类形式定义一个接口。局部类只在其所属代码段中可见,定义这样的接口无意义
  • 局部类类名不能与其外部类类名重复

什么时候使用局部类
局部类大部分以匿名类的形式使用。

[匿名类]

没有类名的局部类就是匿名类。用一条语句完成匿名类的定义与实例创建。例如如下代码:

public class Outer {
    
public void instanceMethod() {
        
//define a nonymous class which implements Action interface and creat an instance of it
        Action action = new Action() {
            
public void doAction() {
                System.out.println(
"a simple anonymous class demo");
            }};
        action.doAction();
        
        
//define a nonoymous class which extends BaseClass and create an instance of it
        new BaseClass(5) {
            
public void printData(){
                System.out.println(
"data = " + getData());
            }
        }.printData(); 
//"data = 5" will be outputed
    }
}
interface Action {
    
void doAction();
}
class BaseClass {
    
private int data;
    
    
public BaseClass (int data) {
        
this.data = data;
    }
    
    
public int getData() {
        
return data;
    }
}

匿名类是一种特殊的局部类。局部类的特性与约束都适用与它。