美文网首页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 面向对象、匿名类

    1. 说一说你对多态的理解? 父类(接口)类型指向子类对象 调用子类重写的方法 2. 接口实现 和 类继承 都是里...

  • 面向对象总结

    面向对象思想 类与对象 定义类格式: 面向对象的三大特征 封装 继承 多态: 抽象类 接口 内部类 匿名内部类: ...

  • 匿名函数,面向对象

    匿名函数和使用 类 &面向对象 给对象添加属性 ——init——()方法 魔法方法

  • Java 学习路线

    JavaSE 基础语法 面向对象 异常处理 常用类(包装类、String) 集合框架及泛型 IO 流 多线程 网络...

  • Day07 - 面向对象进阶

    Day07的课程要点记录详细教程地址:Day7 - 面向对象编程进阶 一、静态方法、类方法、属性方法 1.1 静态...

  • 提示四十二

    提示四十二:lambda 表达式优于匿名类。 匿名类适用于需要函数对象的经典面向对象设计模式,特别是策略模式。 L...

  • 黑马程序员面试宝典(Java)Beta6.0免费下载

    场景 JavaSE基础 面向对象特征以及理解 访问权限修饰符区别 理解clone对象 JavaSE语法 java有...

  • 面向对象

    面向过程与面向对象: 内存解析 对象数组的内存解析 匿名对象

  • JavaSE 面向对象(二)

    面向对象 2多态的存在有三个必要条件:要有继承,要有重写,父类引用指向子类对象Car c= new Bus();向...

  • javaSE - 004 - 面向对象

    面向对象的三大特征 1.封装2.继承3.多态 封装注意点: 1.封装就是将抽象的数据组装起来,构成class类. ...

网友评论

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

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