JAVA基础笔记
多态
所谓多态,就是指一个引用变量在不同的情况下的多种表现状态。也可以理解为,多态是指通过指向父类的引用变量,来调用在不同子类中实现的方法。
多态的使用:
1.一般用于继承体系下,子类重写父类的某个方法,调用时根据具体的子类实现去调用子类的方法
2.向上转型:把子类对象直接赋给父类引用叫向上转型
// 使用多态方法创建对象:
// 能调用父类中的方法,子类重写了父类的方法,但不能调用子类特有的方法
Pet dog2 = new Dog(); //类型转换,向上转型
泛型
泛型可以在很多地方进行定义,分为以下几类
泛型类
使用场景:当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类
泛型方法
方法中形参类型不确定时
- 可以使用类名后面定义的泛型
- 在方法申明上定义自己的泛型
泛型接口
如何使用一个泛型接口?
- 实现类给出具体类型
- 实现类延续泛型,创建对象时再确定
Arrays
此类是一个操作数组的工具类,常见方法包括把数组拼接成一个字符串;二分查找法查找元素;拷贝数组;填充数组;按照默认或指定方法进行数组排序
数组排序:
public static void main(String[] args) {
Integer[] arr = {1, 3, 4, 2, 7, 8};
//第二个参数是一个接口,所以我们在调用方法的时候需要传递这个接口的实现类对象,作为排序规则
//注意只能给引用数据类型的数组进行排序
//o1-o2升序排列,o2-o1降序排列,详细原理上网查
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
System.out.println(Arrays.toString(arr));
}
匿名内部类
调用一个方法的时候,如果方法的形参是一个接口,那么我们要传递这个接口的实现类对象
public class test2 {
public static void main(String[] args) {
method(new Swim() {
@Override
public void swimming() {
System.out.println("swim");
}
});
}
public static void method(Swim s){
s.swimming();
}
interface Swim{
public abstract void swimming();
};
}
- 实现或继承了Swim类(也可以是接口)
- 重写了Swim类的方法
- 创建了这个匿名类的对象
Lambda表达式
函数式编程是一种思想特点,忽略面向对象的复杂语法,强调做什么,而不是谁去做
Lambda表达式是jdk8以后的一种新语法形式,Lambda表达式是一个匿名函数,可以使代码更简洁和灵活
() ->{
}
()对应着方法的形参,->为固定形式,{}对应着方法的方法体
注意点:
- Lambda表达式可以用来简化匿名内部类的书写
- Lambda表达式只能简化函数式接口的匿名内部类的书写
- 函数式接口:有且仅有一个抽象方法的接口叫做函数式接口,接口上方可以加@Functionallnterface注解
public class test2 {
public static void main(String[] args) {
Integer[] arr = {1, 3, 4, 2, 7, 8};
//第二个参数是一个接口,所以我们在调用方法的时候需要传递这个接口的实现类对象,作为排序规则
//注意只能给引用数据类型的数组进行排序
//o1-o2升序排列,o2-o1降序排列,详细原理上网查
//lambda表达式
Arrays.sort(arr, (Integer o1, Integer o2) -> {
return o1 - o2;
}
);
System.out.println(Arrays.toString(arr));
}
}
集合进阶
Java集合框架主要包括两种类型的容器,一种是单列集合(Collection),存储一个元素集合,另一种是双列集合(图,Map),存储键/值对映射。Collection接口又有三种子类型List,Set和Queue,再下面是一些抽象类,最后是具体实现类
List系列集合:添加的元素是有序(存和取的顺序是一样的),可重复,有索引
Set系列集合:添加的元素是无序的(存和取的顺序可能是不一样的),不重复,无索引
Collection:Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的
Collection遍历
迭代器遍历
Collection<String> col = new ArrayList<>();
col.add("aaa");
col.add("bbb");
Iterator<String> it = col.iterator();
//判断当前指向的位置是否有元素
while (it.hasNext()){
String str = it.next(); //获取当前指向的元素并移动指针
System.out.println(str);
}
增强for遍历
for (String s : coll) {
System.out.println(s);
}
可以使用集合.for的方式快捷完成书写
Lambda表达式遍历
HashMap
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。
HashMap 是无序的,即不会记录插入的顺序。
@Test
public void testHashMap(){
HashMap<String, Integer> m1 = new HashMap<>(); //键值对,前为键后为值
m1.put("a",1);
m1.put("b",2);
System.out.println(m1.get("a"));
}
ArrayList
ArrayList<E> objectName =new ArrayList<>(); // 初始化,E为泛型,及存储数据的类型
Junit单元测试
步骤:
1.定义一个测试类(测试用例)
2.定义测试方法:可以独立运行
3.给方法加@Test
4.导入Junit依赖环境
一般使用断言(Assert)来处理结果
异常处理
数据流
Java正则表达式
注:字符类中如果只匹配单个字符,[]可省略
()表示分组 例如a(bc):表示出现a或出现bc