JavaSE

JavaSE Day07 面向对象、匿名类

2021-02-10  本文已影响0人  望穿秋水小作坊
1. 说一说你对多态的理解?
image.png
2. 接口实现类继承 都是里氏代换原则的具体实现吗?
3. 思考下图,为什么 Animal dog2 = new Dog() 调用的是 Animal - run?
image.png image.png
4. instanceof 判断类型 对父类和接口都可以吗?
image.png
5. 如何定义一个匿名类?什么时候使用匿名类?
image.png
6. 匿名类最重要的用途(本质其实就一点,重要)?
image.png
7. 实战:用匿名类实现代码传递,做一个测试代码块指向时间的工具类?
package com.lsp.utils;
public class TimeUtil {
    public interface Block {
        void execute();
    }
    public static void executeBlock(Block block) {
        long startTime = System.currentTimeMillis();
        block.execute();
        long endTime = System.currentTimeMillis();
        System.out.println(endTime - startTime);
    }
}
package com.lsp.demo;
import com.lsp.utils.*;
public class TimeDemo {
    public static void main(String[] args) {
        TimeUtil.executeBlock(new TimeUtil.Block() {
            @Override
            public void execute() {
                String str = "";
                for (int i = 0; i < 30000; i++) {
                    str += i;
                }
            }
        });
    }
}
8. 实战:使用匿名类,实现一个仿 HTTP 的 get 请求函数,能异步回调成功或失败?
package com.lsp.utils;
public class NetworkUtil {
    public interface Block {
        void success(Object obj);
        void failure(Object obj);
    }
    public static void getUser(String url, Block block) {
        // 1. 开启异步线程获取数据库资源
        String data = "用户数据获取成功:张三、男、24 岁";
        // 2. 如果成功就调用 success 返回 ,如果失败就调用 failure
        if (data.length() > 0) {
            block.success(data);
        } else {
            block.failure("获取失败");
        }
    }
}
package com.lsp.demo;
import com.lsp.utils.NetworkUtil;
public class NetworkDemo {
    public static void main(String[] args) {
        NetworkUtil.getUser("http://xxxx", new NetworkUtil.Block() {
            @Override
            public void success(Object obj) {
                // 获取成功会来到这里
                System.out.println(obj);
            }
            @Override
            public void failure(Object obj) {
                // 获取失败会来到这里
                System.out.println(obj);
            }
        });
    }
}
9. 实战:写一个能够让调用 定制过滤策略 的文件读取功能?
package com.lsp.utils;
import java.util.ArrayList;
public class FilenameReadUtil {
    public interface Block {
        boolean accept(String filename);
    }
    public static ArrayList<String> readFiles(Block filter) {
        // 1.模拟读取文件
        String[] filenameArray = {"Java编程","C++编程","OC编程","Swift编程"};
        // 2.调用过滤器,获取用户定制过滤条件,过滤之后的数据
        ArrayList<String> resultArray = new ArrayList<String>();
        for (int i = 0; i < filenameArray.length; i++) {
            String filenameString = filenameArray[i];
            if (filter.accept(filenameString)) {
                resultArray.add(filenameString);
            }
        }
        // 3.返回过滤后的数据
        return resultArray;
    }
}
package com.lsp.demo;
import java.util.ArrayList;
import com.lsp.utils.FilenameReadUtil;
public class FilenameFilterDemo {
    public static void main(String[] args) {
        ArrayList<String> resultList = FilenameReadUtil.readFiles(new FilenameReadUtil.Block() {
            @Override
            public boolean accept(String filename) {
                if (filename.contains("C")) {
                    return true;
                } else {
                    return false;
                }
            }
        });
        System.out.println(resultList.toString());
    }
}
10. 什么是 Lambda 表达式?如何把上面的实战 7 用 Lambda 表达式进行改造?
image.png
package com.lsp.demo;
import com.lsp.utils.TimeUtil;
public class LambdaDemo {
    public static void main(String[] args) {
        TimeUtil.executeBlock(() -> {
            String str = "";
            for (int i = 0; i < 30000; i++) {
                str += i;
            }
        });
    }

}
11. Lambda 表达式没有引入新的作用于是什么意思?
image.png
12. 使用方法引用技术来简化 lambda 表达式?(以后用多了再看吧,现在看了也记不住)
image.png
上一篇 下一篇

猜你喜欢

热点阅读