目录
3)final abstract能否同时出现?private abstract能否同时出现?
1)接口中只有public权限,接口中只有全局常量和抽象方法
2)接口的多实现:接口没单继承限制,一个子类可以同时实现多个接口
三、接口(interface)和抽象类(abstract)的区别
一、抽象类
接面向对象编程三大特性—封装、继承和多态_林纾y的博客-优快云博客
1.概念
抽象类是普通类的超集(普通类有的抽象类都有),只是比普通类多了一些(0~N)抽象方法,抽象类abstract修饰。现实生活中,抽象类很多(无法映射到具体的对象的类),如人类,动物类...
抽象方法:
父类当中的方法,被他的子类们重写,子类的各自实现又不一样。那么父类的方法声明和方法体,只有声明还有意义,而方法体内容则没有存在的意义。我们把这种没有方法体内容的方法称为抽象方法。Java语言规定,如果一个类包含了抽象的方法。那么该类就是一个抽象类。
抽象方法:只有声明、没有方法体{}的方法
public abstract void print();//抽象方法 public void print(){}//普通方法
抽象类:包含抽象方法的类
修饰符 abstract class ClassName { public abstract void print(); }
2.abstract关键字
在java中,使用abstract表示抽象类和抽象方法,抽象方法所在类一定是抽象类。
使用abstract关键字修饰成员方法,该方法就成了抽象方法:
修饰符 abstract 返回值类型 方法名(参数列表);
public abstract void run();
public abstract void eat();
public abstract void jump();
public abstract void print();
3.抽象类三个原则
1)抽象类无法直接实例化对象,得通过向上转型实例化
Sharp sharp=new Sharp();//❌
A a=new B();//✔✔
子类继承抽象类,必须覆写抽象类中的所有抽象方法(前提:子类是普通类),当子类也是抽象类,可以选择不覆写抽象方法。
public abstract class Triangle extends Sharp{//子类Triangle也是抽象类
}
2)抽象类仍然可以有构造方法,普通方法等
普通类有的,抽象类也有,子类仍然遵循对象的实例化流程(先调用父类构造方法)
3)final abstract能否同时出现?private abstract能否同时出现?
final修饰的类不能有子类,而abstract修饰的类必有子类,矛盾,不可。private修饰的方法是当前类内部可见,说明子类没法覆写,abstract修饰的抽象方法必须被覆写,矛盾,不可
4.抽象类意义
抽象类最大意义就是强制要求子类(子类是普通类时)必须覆写抽象方法,保证多态正确运行
5.抽象类的局限
1)子类继承抽象类,仍然满足is a原则(继承原则)
2)抽象类仍然是类,是单继承局限,一个类(子类)只能继承一个抽象类(父类)
所以,也就有了更混合的结构:接口
二、接口
1.概念
接口就是比“抽象类"还“抽象”的“抽象类”, 可以更加规范的对子类进行约束。全面地专业地实现了规范和具体实现的分离。接口是完全面向规范的,规定了一批类具有的公共方法规范,接口就是一个契约、协议。
从接口的实现者角度看,接口定义了可以向外部提供的服务。
从接口的调用者角度看,接口定义了实现者能提供哪些服务。
接口和实现类不是父子关系,是实现规则的关系。比如:我定义一个接口Runnable , Car实现它就能在地上跑, Train实现它也能在地上跑,飞机实现它也能在地上跑。就是说,如果它是交通工具,就定能跑,但是一定要实现Runnable接口。
2.定义接口—interface关键字
1)Java中使用interface关键字定义接口,接口中只有全局常量和抽象方法(JDK8之前,JDK8扩展了default方法)
2)子类使用implements实现接口
3)一般接口命名使用大写I开头和类做区分,子类实现接口可以使用impl结尾,表示是接口的子类
1)定义
格式:
[访问修饰符号] interface 接口name [extends 父接口1,父接口2] {
常量定义:
方法定义:
}
//interface定义了一个IMessage接口
public interface IMessage {
//全局常量-⭐在 Java 接口中声明的变量其实都是常量,接口中的变量声明,将隐式地声明为 public、static 和 final,即常量,所以接口中定义的变量必须初始化
public static final int NUM=100;
//抽象方法-⭐方法的声明不需要其他修饰符,在接口中声明的方法&#x