Java学习之抽象类与接口

本文介绍了Java中的抽象类和接口的关键概念,包括抽象类不能实例化、必须被继承以及接口的默认方法、静态方法等特性。通过Comparable和Comparator接口的示例,展示了如何实现对象比较和排序。同时,讨论了Cloneable接口与深浅拷贝的区别,并总结了抽象类与接口的核心差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

软构分支–抽象与接口知识点总结与反思



前言

软构课上老师带着我们了解了抽象类和接口相关的一些知识,经过一些自学,深入思考并总结以下关键点


一、抽象类知识点

  1. abstract修饰
  2. 有抽象方法的类一定是抽象类
  3. 抽象类不能被实例化(其他的东西,比如方法,成员什么的与普通类一样)
  4. 抽象类可以被继承(这也是抽象类的最大意义)
  5. 继承抽象类的普通类,其中的抽象类的方法必须被重写
  6. 抽象类可以继承抽象类,此时可以不被重写
  7. 抽象方法不能用private,static,final修饰
  8. 抽象类的作用相当于多了一层编译器的检验

二、接口知识点

  1. interface修饰
  2. 成员变量,默认是public static final修饰
  3. 成员方法,默认是 public static 修饰
  4. 成员方法,不能有具体实现,否则,要用default修饰(这也是jdk 8才有的)
  5. 可以有静态方法(static)
  6. 接口不能被实例化
  7. 类和接口的关系是implements
  8. 一个接口可以引用具体实现类,向上转型
  9. 接口当中不能有静态,实例代码块,构造方法
  10. 接口与接口的关系有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,而是看你具体的代码实现!

三、抽象类和接口的区别

核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法

总结

总结了抽象类和接口的一些内容,如有不正确的地方,欢迎在评论区留言~
任重而道远,继续前行

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值