【Java】抽象类和接口的使用与区别
1.抽象类
通过abstract修饰的类称为抽象类
//抽象类 public abstract class Anmail { public void shout(){ //普通方法 } //抽象方法 abstract void body(); }
特点:
抽象类不可以实例化
抽象类可以有构造方法
抽象类和普通类的区别是抽象类可以有抽象方法,普通类没有抽象方法,抽象类可以有抽象方法,除此之外,抽象类当中的内容和普通类一样
抽象类不可以使用Final来修饰的,因为被Final修饰的类为最终类,最终类不可以被继承
抽象方法:
使用abstract定义的方法称为抽象方法,抽象方法没有方法体
特点:
抽象方法必须被子类实现,有一种情况除外,其子类也为抽象类的时候
如果在子类的继承线路当中,只要有一个子类实现了抽象方法,那么后面的子类则无需再实现该抽象方法,即使实现了,那也是重写
抽象方法不可以被Final修饰成为最终方法,最终方法无法被重写
定义抽象类
//抽象类 abstract class Animal1 { //抽象方法 abstract void shout(); //抽象方法 abstract void body(); }
实现子类继承抽象类
/** * 定义小狗类继承动物类的shout方法 * */ class Dog extends Animal1 { @Override void shout() { System.out.println("小狗汪汪叫~.~"); } @Override void body() { System.out.println("这是狗身体 "); } }
测试抽象类实现:
/*
* 定义一个测试类
* 一键运行,搞定抽象类
*/
public class Test {
public static void main(String[] args) {
//实例化Dog类
Dog dog = new Dog();
//实现狗叫
dog.shout();
//实现狗的身体
dog.body();
System.out.println("很简单吧,抽象类 is just so so");
}
}
2.接口
通过interface定义的类称为接口。
//定义动物类接口 public interface Animal { /* * 接口中的常量都是静态常量, * 一般省略public static final, * 只写int ID = 1;即可 */ public static final int ID = 1; /* * 接口里面的方法默认都是public abstract修饰,这两修饰符可以不用写 */ public abstract void shout(); void run(); }
实现接口所有的抽象方法
/** * 定义小狗类实现动物类的shout方法和run方法 * */ class Dog implements Animal { @Override public void shout() { System.out.println("小狗在咆哮。。。"); } @Override public void run() { System.out.println("小狗在草地上奔跑!"); } }
测试实现的小狗类:
/* * 定义一个测试类 * 一键运行,搞定接口 */ public class Test { public static void main(String[] args) { //实例化Dog类 Dog dog = new Dog(); //实现狗叫 dog.shout(); //实现小狗跑步 dog.run(); System.out.println("很简单吧,接口实现 so easy"); } }
特点:
接口中的方法都是抽象的,不能实例化,也没有构造方法
当一个类实现接口时,如果这个类是抽象类,则实现接口中的部分方法即可,否则需要实现接口中的所有方法
接口中默认所有的方法都是抽象方法 ,默认所有的属性都是静态常量
一个类通过implements关键字实现接口时,可以实现多个接口,被实现的多个接口之间要用逗号隔开
一个接口可以通过extends关键字继承多个接口,接口之间用逗号隔开
一个类在继承另一个类的同时还可以实现接口,此时extends关键字必须位于implements关键字之前(先继承,再实现)
接口和接口之间是继承,且可以多继承
3.抽象类和接口的区别
.抽象类只能单继承,而接口可以多实现,接口就是为了解决只能单继承的局限而诞生的。
.抽象类可以有抽象方法,也可以有普通方法,接口里面只能存在抽象方法
.抽象类可以实例化,可以有构造方法,但是接口不能实例化,也没有构造方法
.接口能继承接口也能通过子类实现抽象方法