JAVA中的闭包

本文深入探讨了Java中内部类的多种实现方式,包括成员内部类、局部内部类、匿名内部类等,并通过具体示例展示了它们的应用场景及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



public class DemoClass1 {
    private int length =0;

    //private|public
    private class InnerClass implements ILog
    {
        @Override
        public void Write(String message) {
            //DemoClass1.this.length = message.length();
            length = message.length();
            System.out.println("DemoClass1.InnerClass:" + length);
        }
    }
    
    public ILog logger() {
        return new InnerClass();
    }
 
    public static void main(String[] args){
        DemoClass1 demoClass1 = new DemoClass1();
        demoClass1.logger().Write("abc");
        
        //.new
        DemoClass1 dc1 = new DemoClass1();
        InnerClass ic = dc1.new InnerClass();
        ic.Write("abcde");
    }
}

interface ILog
{
	void Write(String message);
}

/*
DemoClass1.InnerClass:3
DemoClass1.InnerClass:5
请按任意键继续. . .
*/

public class DemoClass2 {
    private int length =0;

    public ILog logger() {
        //在方法体的作用域中定义此局部内部类
        class InnerClass implements ILog
        {
            @Override
            public void Write(String message) {
                length = message.length();
                System.out.println("DemoClass2.InnerClass:" + length);
            }
        }
        return new InnerClass();
    }

    public static void main(String[] args){
        DemoClass2 demoClass2 = new DemoClass2();
        demoClass2.logger().Write("abc");

    }

}

interface ILog
{
	void Write(String message);
}

/*
DemoClass2.InnerClass:3
请按任意键继续. . .
*/


public class DemoClass3 {
    private int length =0;
    
    public ILog logger() {
    return new ILog() {
        @Override
        public void Write(String message) {
              length = message.length();
              System.out.println("DemoClass3.AnonymousClass:" + length);
        }
       };
    }

    public static void main(String[] args){
        DemoClass3 demoClass3 = new DemoClass3();
        demoClass3.logger().Write("abc");

    }

}

interface ILog
{
	void Write(String message);
}

/*
DemoClass3.AnonymousClass:3
请按任意键继续. . .
*/

public class DemoClass4 {
    private int length =0;
    
    public ILog logger(int level) {//final int level
        //final
        final int logLevel = level+1;
        
        switch(level)
        {
            case 1:
                return new ILog() {
                    @Override
                    public void Write(String message) {
                        length = message.length();
                        System.out.println("DemoClass4.AnonymousClass:InfoLog " + length);
                        System.out.println(logLevel);
                    }
                };    
            default:
            return new ILog() {
                @Override
                public void Write(String message) {
                    length = message.length();
                    System.out.println("DemoClass4.AnonymousClass:ErrorLog " + length);
                    System.out.println(logLevel);
                }
            };
                
        }
    }
    
    public static void main(String[] args){
        DemoClass4 demoClass4 = new DemoClass4();
        demoClass4.logger(1).Write("abcefghi");
		 System.out.println("demoClass4.length= "+demoClass4.length);
		demoClass4.logger(2).Write("abcefghij");
		System.out.println("demoClass4.length= "+demoClass4.length);
    }
    
}

interface ILog
{
	void Write(String message);
}

/*
DemoClass4.AnonymousClass:InfoLog 8
2
demoClass4.length= 8
DemoClass4.AnonymousClass:ErrorLog 9
3
demoClass4.length= 9
请按任意键继续. . .
*/

public class DemoClass5 {
    private int length =0;
    
 public ILog logger(final int level) throws Exception {
        
        return new ILog() {
            {
                //实例初始化,不能重载 
                if(level !=1)
                    throw new Exception("日志等级不正确!");
            }
            
            @Override
            public void Write(String message) {
                length = message.length();
                System.out.println("DemoClass5.AnonymousClass:" + length);
            }
        };
    }
    
    public static void main(String[] args) throws Exception {
        DemoClass5 demoClass5 = new DemoClass5();
        demoClass5.logger(1).Write("abcefghi");		
		demoClass5.logger(2).Write("abcefghij");		
    }
    
}

interface ILog
{
	void Write(String message);
}

/*
DemoClass5.AnonymousClass:8
Exception in thread "main" java.lang.Exception: 日志等级不正确!
        at DemoClass5$1.<init>(DemoClass5.java:10)
        at DemoClass5.logger(DemoClass5.java:6)
        at DemoClass5.main(DemoClass5.java:24)
请按任意键继续. . .
*/

import java.util.*;

interface Action
{
    void Run();
}

public class ShareClosure {

    List<Action> list = new ArrayList<Action>();
    
    public void Input()
    {
        for(int i=0;i<10;i++)
        {
            final int copy = i;
            list.add(new Action() {    
                @Override
                public void Run() {
                    System.out.println(copy);
                }
            });
        }
    }
    
    public void Output()
    {
        for(Action a : list){a.Run();}
    }
    
    public static void main(String[] args) {
        ShareClosure sc = new ShareClosure();
        sc.Input();
        sc.Output();

    }

}
/*
0
1
2
3
4
5
6
7
8
9
请按任意键继续. . .
*/




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值