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
网友评论