java 中的 抽象方法 抽象类 和 接口有啥瓜葛
文章目录
什么是java中的抽象方法
抽象方法是一种特殊的方法:
它只有声明,而没有具体的实现
例如:
abstract void eat();
上面定义了一个方法 eat() ,有修饰关键词 abstract ,而且只有方法签名,没有方法的具体实现,
这就是一个java中的 抽象方法.
我们可以看到关键词 abstract 前面再没有任何修饰关键词 [ public , protected 或者 private ]
为什么不能有修饰关键词,我们留到下面再讲.
什么是java中的抽象类
一个类含有抽象方法,则称这个类为抽象类
抽象类必须由关键词 abstract 修饰;
我们来看一个抽象类的示例:
abstract class Person {
abstract void eat();
}
包含抽象方法 eat() ,并且类前面有关键词 abstract 修饰,所以上面的类就是一个抽象类.
这里可能有疑问,抽象类必须要包含抽象方法吗?如果没有抽象方法呢?
abstract class Person {
}
这也是一个抽象方法,但是这种空的抽象类有什么意义呢?
因为抽象方法只是一个方法签名,没有具体方法实现,所以这种抽象类必须由子类继承才有存在的意义,不能直接创建类的实例;
因为继承,其中的抽象方法会被子类重写;
所以没有实现继承的抽象类是没有意义的,没有定义任何抽象方法的抽象类更没有意义.
因为抽象类必须要实现继承,所以类前面缺省的访问修饰符默认 public 不能是 private ,可以不写直接省略(缺省 public)
什么是java 中的接口
接口是一种特殊的抽象类;
接口中没有变量,只有public static final修饰的静态常量,三个修饰符可以省略;
接口中所有的方法都是抽象方法,且默认就是public权限;
java中使用 interface 来声明接口:
interface Person {
void eat();
String getName();
}
接口中的方法全部只有定义而没有被实现;
所有方法默认都是 public abstract 的.
一个类使用 implements 关键词来实现接口
class Child implements Person {
private String name;
public Child(String name) {
this.name = name;
}
@Override
public void eat() {
System.out.println(this.name + " 用勺子吃饭");
}
@Override
public String getName() {
return this.name;
}
}
类和接口的继承
Java类的继承是单一继承,一个类只能继承一个父类;
Java类却可以实现多个接口;
为什么不能继承多个父类?
假如多个父类同时存在签名相同的方法,那多继承后,子类到底该实现哪一个父类的同名方法呢?
为什么可以实现多个接口?
接口中全都是抽象方法,只有签名没有方法实现,所以就算有同名的抽象方法,子类重写该方法,实现自己的方法内容即可,完全不受影响.