1、抽象类
在我们使用多态的方式进行实例化一个对象时,使用这个对象中子类重写了父类的方法时,调用的是被子类重写的方法,这时父类中的被重写的方法体就没有了作用,既然不需要这个方法体,那可不可以不写呢?答案是可以的,只要我们定义这个方法时在前面加上关键字abstract进行修饰这个方法就可以将该方法变成抽象方法,抽象方法是没有方法体的,只可以由继承他的子类重写该方法,而拥有抽象方法的类一定是一个抽象类(抽象类不一定要有抽象方法)。
1.1抽象类的特点
①抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
②抽象类不能直接实例化,只能通过多态的方式,通过子类对象实例化(抽象类实例化)
③抽象类的子类要么需要重写抽象类的所有抽象方法,要么也是一个抽象类
例:定义了一个抽象类Animal(有抽象方法),Cat和Dog类继承了Animal,并重写了Animal的抽象方法
public abstract class Animal {
abstract void shout();
}
public class Cat extends Animal{
@Override
void shout() {
System.out.println("猫会喵喵叫");
}
}
public class Dog extends Animal {
@Override
void shout() {
System.out.println("狗会汪汪叫");
}
}
public class Test01 {
public static void main(String[] args) {
Animal a1 = new Cat();
Animal a2 = new Dog();
a1.shout();// 输出:猫会喵喵叫
a2.shout();// 输出:狗会汪汪叫
}
}
1.2 抽象类的构造方法
抽象类不能直接被实例化,但也是有构造方法的,和普通的类一样,不写则默认是一个无参的构造方法,子类初始化是时的第一句也默认是其父类的无参构造方法,对父类进行初始化。
在如上代码中均采用了默认的无参构造方法初始化。
2、接口
以前各个手机品牌数据线丢不大相同,出门在外遇到手机没电的情况需要找人借数据线还需要找和自己手机品牌一样的,后来为了方便我们的使用,安卓类型手机都统一采用了Type C接口的数据线,这样我们无论什么安卓手机都可以是一样同一个充电器进行充电,而这个Type C接口就是一个安卓手机公共的规范接口。
就如同我们手机充电的数据线接口一样,我们的代码也需要一个公共的规范标准,只要符合规范标准,大家都可以通用。
2.1 接口的特点
①使用interface进行修饰,实现类使用implements进行修饰
②接口不能直接实例化,需要使用多态的形式,通过实现类进行实例化(接口多态)
③接口的实现类要么重写接口的所有方法,要么他也是一个抽象类
2.2 接口的成员变量的特点
成员变量:只能是常量,默认修饰符:public static final
构造方法:没有构造方法,接口没有具体的存在,主要是用来拓展功能的
成员方法:只能是抽象方法,默认修饰符:public abstract
如上例,使用接口实现:
public interface Animal {
void shout();
}
public class Cat implements Animal {
@Override
public void shout() {
System.out.println("猫会喵喵叫");
}
}
public class Dog implements Animal {
@Override
public void shout() {
System.out.println("狗会汪汪叫");
}
}
public class Test01 {
public static void main(String[] args) {
Animal a1 = new Cat();
Animal a2 = new Dog();
a1.shout();
a2.shout();
}
}
3、抽象类和接口的不同点
抽象类是一个类,还保留着类的特点,可以有构造方法、普通成员变量、静态方法,而接口没有;
抽象类的实例化需要通过子类,接口的实例化需要通过实现类
抽象类只支持单继承,不支持多继承,而一个实现类可以实现多个接口
在接口中只能做方法申明,而抽象类中即能做方法申明,也可以做方法实现
接口是对动作的抽象,抽象类是对根源的抽象,即:抽象类表示的是,这个对象是什么。而接口表示的是,这个对象能做什么。