javaSE中抽象类和接口
一、抽象类
什么是抽象类???
包含抽象方法的类,什么是抽象方法呢?
抽象方法,就是方法没有具体实现的方法用abstract修饰
1.1、抽象类不能被实例化
抽象类和普通类的区别:
抽象类比普通类多了抽象方法
1.2、抽象类可以拥有和普通类一样的方法和成员
1.3、一个普通类继承了抽象类,那必须重写抽象方法
1.4、抽象类主要是用来继承的,一个抽象类A继承抽象类Shape,可以不用重写抽象方法
1.5、如果一个普通B类继承了抽象类A,抽象类A又继承了抽象类 Sphea,那普通B类就要重写抽象类A和抽象类 Sphea里的所有抽象方法
1.6、抽象类不能被final修饰,也不能修饰抽象方法,也不能是私有的
抽象类的作用:
抽象类存在的最大意义就是为了被继承.
抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法
使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成. 那么此时如果不小心误用成父类了,
使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题
二、接口
接口是抽象类的更进一步. 抽象类中还可以包含非抽象方法, 和字段. 而接口中包含的方法都是抽象方法, 字段只能包含静态常量
语法规则:(接口名一般使用大写的 I 开头)
interface 接口名{
}
interface IShape {
}
2.1、接口当中的普通方法,不能有具体的实现。非要实现,只能通过关键字default来修饰,这个方法。
2.2、接口当中,可以有static的方法。里面的所有的方法都是public的。
2.3、抽象方法,默认是public abstract的。
2.4、接口不能实例化对象*
2.5、类和接口之间的关系是通过implements实现了。
2.6、接口当中的成员变量,默认是public static final修饰的
2.7、当一个类实现一个接口之后,重写这个方法的时候,这个方法前面必须加上public .
2.8、一个类可以通过关键字extends继承一个抽象类或者普通类,但是只能继承一个类。同时,也可以通过implements扩展多个接口,中间用逗号隔开,如果继承的是抽象类那要重写抽象类的抽象方法,也要重写接口中的抽象方法
interface ISphea{
public static final int a3 = 10;
public static void app(){
System.out.println("");
}
void func2();
public abstract void func3();
}
interface ID{
void func4();
}
abstract class B{
abstract public void func5();
}
class A extends B implements ISphea,ID{
@Override
public void func2() {
System.out.println("hhh");
}
@Override
public void func3() {
System.out.println("重写接口的抽象方法");
}
@Override
public void func4() {
System.out.println(12);
}
@Override
public void func5() {
System.out.println("789");
}
}
2.9
接口和接口之间可以使用extends来操作他们的关系,此时,这里面意为:拓展。
一个接口B通过extends来拓展另一个接口C的功能。此时当一个类D通过implements实现这个接口B的时候,此时重写的方法不仅仅是B的抽象方法,还有他从C接口,拓展来的功能【方法】。
小结
接口的实例
class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
}
interface IFei{
void func();
}
interface IYou {
void func1();
}
//鸭子是动物的一种,不是所有的动物都会游泳,都会飞。。
//因为一个类不能继承多个类,但是可以实现多个接口,这样就能更好的抽象出鸭子这个对象
class Yazi extends Animal implements IFei,IYou {
public Yazi(String name){
super(name);
}
@Override
public void func() {
System.out.println("鸭子在飞");
}
@Override
public void func1() {
System.out.println("鸭子在游泳");
}
}
public class TestDome {
//这里就发生了动态绑定
public static void appFei(IFei iFei){
iFei.func();
}
public static void appYou(IYou iYou){
iYou.func1();
}
public static void main(String[] args) {
Yazi yazi = new Yazi("鸭子");
appFei(yazi);
appYou(yazi);
}
}
总结
抽象类和接口都是 Java 中多态的常见使用方式. 都需要重点掌握. 同时又要认清两者的区别(重要!!! 常见面试题).
核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不
能包含普通方法, 子类必须重写所有的抽象方法 。