abstract
定义抽象类。抽象类是普通类的超集,只是比普通类多了一些抽象方法([0…N])而已。普通类有的,抽象类都有。abstract
定义抽象方法。抽象方法没有方法体{}
,只有方法声明。eg:
在 Java中,没有方法体的方法一定是抽象方法 (X)native方法
也没有方法体,该方法不是抽象方法。本地方法是由C++实现的方法,Java只负责调用,方法体实现是C++代码。 Sharp sharp=new sharp();//错误
Sharp sharp=new Cycle();//正确,可以直接new一个子类对象
default
权限。抽象类是普通类的超集
抽象类中仍然能够定义构造方法和普通方法,且仍然能够满足对象的实例化流程,先调用抽象类的构造方法而后调用子类的构造方法。
抽象类存在意义
抽象类就是在普通类的基础上进一步提取,只是比普通类多了一些抽象方法而已,抽象方法的存在要求子类必须进行方法重写,从而保证多态的正确执行!
interface
定义接口。接口中99%都是抽象方法。I
开头表示接口的命名。implement
实现接口,子类若是普通类,则必须覆写接口中所有的抽象方法。Impl
结尾,表示是接口的实现子类。接口是更加纯粹的抽象类,只有全局常量和抽象方法,没有构造方法,没有普通方法,因此,接口无法实例化对象,只能通过子类向上转型被接口引用接收。
接口的子类允许多实现,一个类可以使用implement
实现多个父接口!(避免了抽象类的单继承局限性)
接口的子类不是is a
关系,一个子类可以同时满足多个标准或具备多种能力。
eg:手机类既满足5G标准,又满足USB标准,因此,手机这个类既实现5G接口,又要实现USB接口,可以实现多个接口。
因为接口中只有全局变量和抽象方法,因此在接口中,以下关键字全部可以省略不写。阿里编码规约明确表示,接口中只保留核心关键字,可以省略的坚决不写!只有接口有此规则!!!
public abstract
修饰常量:static final
子类若同时继承一个抽象类,实现多个接口。请先使用extends
继承一个类,而后使用implements
实现多个接口。
IRun
、ISwim
、IFly
接口extends
继承多个父接口,但是接口不能使用extends
继承类!接口存在多继承default
定义。JDK内置的对象比较接口 java.lang.Comparable
接口,自定义的类型要想让其具备可比较的能力,(1)实现java.lang.Comparable接口,(2)覆写compareTo方法。
public int compareTo(Object o)
{
return 0;
}
返回值类型int表示,当前对象和传入对象o作比较,根据返回值判断当前对象和传入对象o之间的大小关系。
(1) >0 的数,当前对象 > 传入对象
(2) <0 的数,当前对象 < 传入对象
(3) =0 的数,当前对象==传入对象
public class Student implements Comparable{
private String name;
private int score;
//覆写Object类的compareTo方法
public int compareTo(Object o)
{
//1.先判断边界条件:传入的o是否为空;传入的o是否为Student类型对象
if(o==NULL||o instanceof Student)
{
//2.此时没有可比性,抛出异常
throw new IllegalArgumentException("参数非法!");
}
//3. 说明o合法且为Student类型的引用,向下转型将其还原为Student类型
Student stu=(Student)o;
return this.score-stu.score;
}
}
测试
public static void main(String[] args)
{
Student stu1=new Student("张三",95);
Student stu1=new Student("张三",95);
//此时的this指针指向stu1去和stu2比较
System.out.println(stu1.compareTo(stu2));
}
当Student类实现了Comparable接口,JDK的Array.sort就是按照compareTo方法的返回值进行大小排序。
//参数对象是Comparable接口数组,只要传入的对象实现了Comparable接口,自然就是Comparable子类
public static void sort(Comparable[] array)
{
//外层循环表示所走趟数
for(int i=0;i<array.length-1;i++)
{
boolean isSwaped=false;
//内层循环进行一次,有序数组元素+1,将当前无序数组的最大值放在了数组末尾
for(int j=0;j<array.length-1-i;j++)
{
if(array[j].compareTo(array[j+1])>0)
{
Comparable temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
isSwaped=true;
}
}
//发现任意一次内层循环中,没有任何与元素交换,则整个数组已经有序
if(!isSwaped)
{
break;
}
}
}