软构分支–抽象与接口知识点总结与反思
文章目录
前言
软构课上老师带着我们了解了抽象类和接口相关的一些知识,经过一些自学,深入思考并总结以下关键点
一、抽象类知识点
- abstract修饰
- 有抽象方法的类一定是抽象类
- 抽象类不能被实例化(其他的东西,比如方法,成员什么的与普通类一样)
- 抽象类可以被继承(这也是抽象类的最大意义)
- 继承抽象类的普通类,其中的抽象类的方法必须被重写
- 抽象类可以继承抽象类,此时可以不被重写
- 抽象方法不能用private,static,final修饰
- 抽象类的作用相当于多了一层编译器的检验
二、接口知识点
- interface修饰
- 成员变量,默认是public static final修饰
- 成员方法,默认是 public static 修饰
- 成员方法,不能有具体实现,否则,要用default修饰(这也是jdk 8才有的)
- 可以有静态方法(static)
- 接口不能被实例化
- 类和接口的关系是implements
- 一个接口可以引用具体实现类,向上转型
- 接口当中不能有静态,实例代码块,构造方法
- 接口与接口的关系有extends
这里的两块知识点看起来一堆字,很啰嗦。但是这些都是提炼出来的重点内容,一定要理解掌握
三、重要接口举例
1.Comparable接口
要进行对象之间的比较,需要使用该接口
代码如下(示例):
(1)定义一个简单的学生类,并实现Comparable接口
class Student implements Comparable<Student>{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString(){
return"["+this.name+":"+this.age+"]";
}
@Override
public int compareTo(Object o){
return this.age-o.age;//按年龄升序排列
//降序
//o.age-this.age;
}
}
(2)在main函数中定义学生数组,并其排序
public static void main(String[args]){
Student[] students=new Student[]{
new Student("mary",19),
new Student("jack",8),
new Student("mark",20),
}
Arrays.sort(students);
System.out.println(Arrays.toString(students));
}
这样就可以完成按照年龄排序啦!
但是这样写有一个缺点,如果我们想按照其他的成员变量排序,比如姓名,就需要修改学生类,对类的侵入性太强
于是,改写,实现Comparator接口,如下
2.Comparator接口
代码如下(示例):
(1)学生类
class Student{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString(){
return"["+this.name+":"+this.age+"]";
}
}
(2)增加比较年龄的类(比较器)
class AgeComparator implements Comparator<Student>{
@Override
public int compare(Student o1,Student o2){
return o1.age-o2.age;
}
}
(3)增加比较姓名的类(比较器)
class NameComparator implements Comparator<Student>{
@Override
public int compare(Student o1,Student o2){
return o1.name.compareTo(o2.name);
}
}
(4)main函数
public static void main(String[args]){
Student[] students=new Student[]{
new Student("mary",19),
new Student("jack",8),
new Student("mark",20),
}
AgeComparator ageComparator=new AgeComparator();
int ret=ageComparator.compare(students[0],students[1]);
System.out.println(ret);//ret大于0,说明students[0]>students[1]
Arrays.sort(students,ageComparator);//按年龄升序排序
System.out.println(Arrays.toString(students));
}
类似的,我们可以根据成员变量写很多比较器
3.Cloneable接口与深浅拷贝
由此可见,是深拷贝还是浅拷贝不是看是不是用了Cloneable,而是看你具体的代码实现!
三、抽象类和接口的区别
核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法
总结
总结了抽象类和接口的一些内容,如有不正确的地方,欢迎在评论区留言~
任重而道远,继续前行