美文网首页JavaSE
JavaSE Day07 面向对象、匿名类

JavaSE Day07 面向对象、匿名类

作者: 望穿秋水小作坊 | 来源:发表于2021-02-10 16:34 被阅读0次
    1. 说一说你对多态的理解?
    • 父类(接口)类型指向子类对象
    • 调用子类重写的方法
    image.png
    2. 接口实现类继承 都是里氏代换原则的具体实现吗?
    • 是的
    • 使用基类或者接口的方法时,可以传入子类,从而使用子类的重写的方法,最终达到不同的效果
    3. 思考下图,为什么 Animal dog2 = new Dog() 调用的是 Animal - run?
    image.png
    • 一句话解释得很到位:Java 中的多态指的是实例方法。
    • 静态方法没有多态,只会根据类型判断,从而决定调用
    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

    相关文章

      网友评论

        本文标题:JavaSE Day07 面向对象、匿名类

        本文链接:https://www.haomeiwen.com/subject/xtzhxltx.html