一、抽象类
常规类是完善的功能类,它可以实例化对象使用,但是抽象类并不能使用new操作符创建它的实例。
通常,如果某个父类只是知道其子类包含怎样的方法,但是并不关心也并不知道该如何实现方法时我们会利用抽象类;或者,我们可以理解成我们为子类制作一个模板,子类必须具有的一些方法。
在抽象类内,常规类拥有的它同样都可以有,区别就是在于它具有抽象方法。对于抽象类,abstract是它的关键字,如果类内具有抽象方法,就应该为它添加关键字使它成为抽象类。
关于抽象方法,我们仅仅是声明了具有这个方法,但是并不具体实现,所以抽象方法并没有方法体,以分号结束。因此,在其子类中就必须重写这些抽象方法去具体实现。
代码小例:
public abstract class Student {
//可以拥有普通方法与变量
public int age;
public void name() {
System.out.println(age);
}
//抽象方法同样有abstract关键字,以分号结束,并不具备方法体。
public abstract void school();
}
public class University extends Student {
public static void main(String[] args) {
Student stu = new University();
stu.age = 20;
stu.name();
stu.school();
}
//必须重写的父类抽象方法
@Override
public void school() {
System.out.println("I am from GDUFS.");
}
}
注意:
1、即使子类的父类是具体的,这个子类也可以是抽象的。
2、如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类
3、抽象方法的访问修饰符必须是public或者protected,这样才能被继承,缺省时默认为public。
3、抽象类不能用new操作符从一个抽象类创建一个实例,但是可以用作一种数据类型。
public class University extends Student {
public static void main(String[] args) {
Student[] stu2= new Student[2];
for(int i=0;i<stu2.length;i++) {
stu2[i] = new University();
stu2[i].age = 10 * (i+1);
stu2[i].name();
}
}
//必须重写的父类抽象方法
@Override
public void school() {
System.out.println("I am from GDUFS.");
}
}
二、接口
接口是一种与类非常相似的结构,它只包含常量和抽象方法。在java中,接口被看作是一个特殊的类,使用接口或多或少有点像使用抽象类,所以,接口与抽象类一样不能使用new操作符创建接口的实例。接口的出现解决了java单继承的缺点,接口可以继承多个接口。接口的关键字为interface。
注意:接口中的抽象方法的访问修饰符只能是public。
接口就是被用来继承或者实现的,类与接口的关系叫做接口继承,因为接口继承和类继承本质上是一样的,所以我们统统都简称为继承。但是类继承中我们使用的关键字是extends,而接口继承中,我们使用的关键字是implements。
public class Test implements Test_interface{
}
那么在使用接口后,同样要重写接口中的抽象方法。(这一点和抽象类相似)同时,我们可以继承父类同时使用接口,此时extends关键字一定是在implements关键字之前的。
public class Test extends Person implements Test_interface {
}
接口继承多接口的写法:
//接口继承多个接口
public abstract interface Test_interface2 extends Test_interface,Mammal{
}
子类继承多接接口的写法:
public class University implements Person,Student {
}
小总结:抽象类与接口有一定的相似性,但是抽象类属于类,只能单继承,而接口可以实现多继承,这一用法解决了Java单继承的缺点。一般来说,抽象类和接口的使用一定是被继承的,只是抽象类可以含有常规类的所有特点,而接口只能是抽象方法和常量。