一、抽象类
什么是抽象类
包含抽象方法的类叫做抽象类。如果一个类中含有一个或多个抽象方法,该类必须限定为抽象的。抽象类必须由 abstract关键字来限定这个类。定义一个抽象类
public abstract class Animal{
public abstract void bark();
}
抽象类和普通类的区别
- 抽象类并不是只能包含象方抽法,他也可以包含普通的成员方法和成员变量。
- 抽象类中的抽象方法只能用public或protected修饰。因为,抽象方法来到世间就是为了让子类继承重写的,而private的方法不能被子类继承,显然矛盾。
- 抽象类不能创建对象,即不能实例化。因为,抽象类中包含没有实现的抽象方法,是不完整的,所以不能用来创建对象。(有一种特殊情况,就是一个类中并没有抽象方法,但是类class有abstract修饰,被声明为抽象类,那么这个类也是抽象类,也不能实例化。)
class TestOne {
public static void main(String[] args) {
// 这里会报错,无法实例化类型Demo1
Demo1 demo1 = new Demo1(34);//报错
}
}
abstract class Demo1 {
private int age;
public Demo1(int age) {
this.age = age;
}
}
4 如果一个类继承于一个抽象类,那么子类必须实现父类的抽象方法。否则,子类继承的方法还是抽象方法,子类也变成了抽象类,要用abstract修饰。
在其他方面,抽象类和普通类并无区别。
public abstract class Animal { //抽象类中可以有非抽象方法,也可以有成员变量
private int a = 10;
public abstract void bark();
//如果没有此抽象方法,但是class前有absract修饰,也是抽象类,也不能实例化
public void say() { //普通成员方法
System.out.println("我是抽象类中的非抽象方法,此抽象类中的私有成员变量a= " + a);
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
public class Dog extends Animal{
public void bark() { //子类实现Animal的抽象方法
System.out.println("汪汪~汪汪~");
System.out.println("我是子类,不能直接调用父类的私有变量a :(");
System.out.println("我是子类,只有通过super.getA()调用父类的私有变量a:" + super.getA());
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.say(); //子类继承调用Animal的普通成员方法
dog.bark(); //子类调用已经实现过的方法
}
}
注:
抽象类方法
JDK 1.8以前,抽象类的方法默认访问权限为protected(可以是public和protected)
JDK 1.8时,抽象类的方法默认访问权限变为default(可以是public和protected或者不写)
二、接口
什么是接口
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,但基本没什么意义,在我的开发经验里还没有在实际项目中在接口声明变量的应用。
接口的实现语法
[public] interface InterfaceName {
public void method(); //抽象方法,默认就是abstract,所以直接这样写就好了
}
注意接口有关的关键点
1、接口方法 JDK 1.8以前,接口中的方法默认,也必须是public的(只能用public) JDK 1.8时,接口中的方法默认public的,也可以是default的(可以是public和default) JDK 1.9时,接口中的方法可以是private的(可以是public和default和private) 属性的访问控制修饰符 2、要让一个类遵循某组特定的接口需要使用implements关键字,具体格式如下:
class ClassName implements Interface1,Interface2,[....]{
}
可以看出,允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的
所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。
public class Test {
public static void main(String[] args) {
Computer c = new Computer();
c.plugin(new Phone());
c.plugin(new Print());
}
}
interface Usb{//定义接口
public void install();
public void work();
}
class Phone implements Usb{//实现usb接口
public void install() {
System.out.println("安装手机驱动程序。");
}
public void work() {
System.out.println("从电脑拷贝数据到手机上。");
}
}
class Print implements Usb{//实现usb接口
public void install() {
System.out.println("安装打印机驱动程序。");
}
public void work() {
System.out.println("打印一份文件。");
}
}
class Computer{//在电脑上应用Usb接口
public void plugin(Usb usb) {//接收usb接口实例
usb.install();//调用接口方法
usb.work();//调用接口方法
}
}
以下内容转自:https://blog.csdn.net/chengqiuming/article/details/70139323
三、接口和抽象类的相似性
1 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。
2 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
四、接口和抽象类的区别
1 接口里只能包含抽象方法,静态方法和默认方法,不能为普通方法提供方法实现,抽象类则完全可以包含普通方法。2 接口里只能定义静态常量,不能定义普通成员变量,抽象类里则既可以定义普通成员变量,也可以定义静态常量。
3 接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
4 接口里不能包含初始化块,但抽象类里完全可以包含初始化块。
5 一个类最多只能有一个直接父类,包括抽象类,但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承不足。