目录
1. 抽象类
为什么会有抽象方法呢?一些没有实际工作的方法,就可以把它设计为抽象方法 ,抽象类中包含抽象方法。
抽象类存在的最大意义就是可以被继承。因此不能搭配final 使用(final 修饰常量,表示不能被继承,修饰方法,表示不能被继承,修饰类表示该类不能有子类)
抽象类不可以被实例化,如果类的外部想使用该抽象类的子类 ,就可以让子类重写抽象类中的抽象方法。(但是普通方法也可以被继承,此时就感觉没有必要使用抽象类。实际上使用抽象类就相当于多了层保障:在普通方法中,该工作应该由子类来做,父类不需要完成,如果此时调用错成父类了,使用普通类编译器不会报错,但是父类是抽象类就会在实例化的时候提示错误,及时修改)
abstract class A { //抽象类
public void fun () {
System,out.println("普通方法");
}
abstract public void print(); //抽象方法
}
💫 在方法前加上abstract ,就变成一个抽象方法,抽象方法没有方法体,只有函数声明。
💫 对于类来说,前面加上abstract 表示抽象chou
普通类有的功能抽象类 都有,并且抽象类是普通类的超集,抽象类只是比普通类多了抽象方法而已。
💫 抽象类不能直接实例化。A a = new A();
💫 抽象方法 不能用private 修饰,必须是public 和 protected。 如果是private权限,则不能被子类继承,子类无法实现该方法。abstract private void draw();
💫 抽象类必须有子类,使用extends 继承,一个子类只能继承一个抽象类。
💫 子类必须覆写抽象类中的所有抽象方法,如果子类也为抽象方法,就可以不用覆写父类的抽象方法。
💫 抽象类当中不一定有抽象方法,但含有抽象方法的类定为抽象类。
2. 接口
接口是抽象类的进一步,抽象类中可以包含普通方法、抽象方法 和 字段,而接口中包含的方法都是抽象方法,字段只能包含静态常量。
public interface 接口名称 {
int i = 1;
public abstract void method();
void print();
}
💫 使用interface 来定义接口
💫 接口中可以包含变量和方法,变量被隐式指定为 public static final ,方法被隐式指定为public abstract
💫 一个类可以同时实现多个接口,一个类只能继承一个类。一个类如果同时继承类,又实现接口,先extends一个类,再implements 多个接口。也间接解决了Java中不能多继承的问题。
💫 子类实现接口,必须实现接口中的所有抽象方法。
💫 接口中的权限默认全是public,因此可以忽略public
💫 接口中的方法一定是抽象方法,只能包含抽象方法,因此可以忽略abstract。对字段来说,接口中只能包含静态常量可以忽略 final static
💫 接口不能单独被实例化
💫 接口创建时,接口的命名一般以大写字母 I 开头。
interface IMessage {
public static final String i = "hello";
public sbatract void fun();
}
简化为:
interface IMessage {
String i = "hello";
void fun();
}
Java中只支持单继承,利用接口就可以解决多继承问题。
动物类:
class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
}
interface IFlying {
void fly();
}
interface IRunning {
void run();
}
interface ISwimming {
void swim();
}
猫🐱:
class Cat extends Animal implements IRunning {
public Cat(String name) {
super(name);
}
@Override
public void run() {
System.out.println(this.name + "正在用四条腿跑");
}
}
鱼🐟:
class Fish extends Animal implements ISwimming {
public Fish(String name) {
super(name);
}
@Override
public void swim() {
System.out.println(this.name + "正在用尾巴游泳");
}
}
青蛙🐸:
class Frog extends Animal implements IRunning, ISwimming {
public Frog(String name) {
super(name);
}
@Override
public void run() {
System.out.println(this.name + "正在往前跳");
}
@Override
public void swim() {
System.out.println(this.name + "正在蹬腿游泳");
}
}
鸭子🦆:
class Duck extends Animal implements IRunning, ISwimming, IFlying {
public Duck(String name) {
super(name);
}
@Override
public void fly() {
System.out.println(this.name + "正在用翅膀飞");
}
@Override
public void run() {
System.out.println(this.name + "正在用两条腿跑");
}
@Override
public void swim() {
System.out.println(this.name + "正在漂在水上");
}
}
3. 总结
区别 | 抽象类(abstract) | 接口(interface) | |
1 | 组成 | 普通类、抽象方法 | 抽象方法、全局常量 |
2 | 权限 | 任何一种 | public |
3 | 子类使用 | extends | implements |
4 | 关系 | 一个抽象类可以实现多个接口 | 接口不能继承抽象类,但接口可以用extends关键字继承多个父接口 |
5 | 子类限制 | 单继承 | 多继承 |