1.抽象类
当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但是有时候这些方法时无法确定的。
针对这种情况,Java提供了抽象方法来满足这种需求。
- 抽象方法必须使用abstract关键字来修饰,并且在定义方法时不需要实现方法体。
- 当一个类中包含了抽象方法,那么该类也必须使用abstract关键字来修饰,这种使用abstract关键字修饰的类就是抽象类。
抽象类以及抽象方法定义的基本语法如下。
//定义抽象类
[修饰符] abstract class 类名{
//定义抽象方法
[修饰符] abstract 方法返回值类型 方法名([参数列表]);
}
注意:
- 包含抽象方法的类必须定义为抽象类,但抽象类中可以不包含任何抽象方法。
- 抽象类是不可以被实例化的,因为抽象类中有可能包含抽象方法,抽象方法是没有方法体的,不可以被调用。如果想调用抽象类中定义的抽象方法,需要创建一个子类,在子类中实现抽象类中的抽象方法。
abstract class Animal{
public abstract void shout();
}
class Dog extends Animal{
@Override
public void shout() {
System.out.println("汪汪汪....");
}
}
public class test extends Object{
public static void main(String[] args) {
Dog dog = new Dog();
dog.shout();
}
}
注意: Java中一个类继承一个抽象类,必须实现抽象类中的抽象方法。非抽象方法可以不重写。
2.接口
如果一个抽象类中的所有方法都是抽象的,则可以将这个类定义为Java中的另一种形式——接口。
接口是一种特殊的抽象类,它不能包含普通方法,其内部的所有方法都是抽象方法,它将抽象进行得更为彻底。
在JDK8中,接口中除了有抽象方法外,还可以有默认方法和静态方法(也叫类方法),默认方法用default修饰,静态方法用static修饰,并且这两种方法都允许有方法体。
其基本格式如下:
[修饰符] interface 接口名 [extends 父接口1,父接口2....]{
[public] [static] [final] 常量类型 常量名=常量值;
[public] [abstract] 方法返回值类型 方法名([参数列表]);
[public] default 方法返回值类型 方法名([参数列表]){
//默认方法体
}
[public] static 方法返回值类型 方法名([参数列表]){
//默认方法体
}
}
在上述语法中,“[]”中的内容是可选的。“extends 父接口1,父接口2....”表示定义一个接口时,可以同时继承多个父接口,这也是解决了单继承的限制。
接口中可以包含三类方法:抽象方法,默认方法和静态方法。其中静态方法可以通过“接口名.方法名”的形式来调用,而抽象方法和默认方法只能调用,而抽象方法和默认方法只能通过接口实现类的实例对象来调用。因此需要定义一个接口的实现类,该类通过implements关键字实现当前接口,实现接口中的所有抽象方法。
2.1 类与接口的实现方法
定义接口的实现类语法格式如下:
[修饰符] class 类名 [extends 父类名] [implements 接口1,接口2...]{
...
}
interface Animal{
//定义全局常量
int num=10;
int id=1;
//定义抽象方法
public void shout();
//定义一个默认方法
default void getType(String type){
System.out.println("该动物属于:"+type);
}
//定义一个静态方法
static int getId(){
return Animal.id;
}
}
class Dog implements Animal{
@Override
public void shout() {
System.out.println("汪汪汪....");
}
}
public class test{
public static void main(String[] args) {
System.out.println(Animal.getId()); //通过接口名调用类方法
Dog dog = new Dog(); //创建dog类的实例对象
System.out.println(dog.num); //在实现类中获取接口全局常量
dog.shout();
dog.getType("犬科"); //调用接口默认方法
}
}
2.2 接口与接口之间的关系
interface Animal{
//定义全局常量
int num=10;
int id=1;
//定义抽象方法
public void shout();
//定义一个默认方法
default void getType(String type){
System.out.println("该动物属于:"+type);
}
//定义一个静态方法
static int getId(){
return Animal.id;
}
}
interface LandAnimal extends Animal{
void run();
}
class Dog implements LandAnimal{
@Override
public void shout() {
System.out.println("汪汪汪....");
}
@Override
public void run() {
System.out.println("狗在陆地上跑...");
}
}
public class test{
public static void main(String[] args) {
System.out.println(Animal.getId()); //通过接口名调用类方法
Dog dog = new Dog(); //创建dog类的实例对象
System.out.println(dog.num); //在实现类中获取接口全局常量
dog.shout();
dog.getType("犬科"); //调用接口默认方法
dog.run();
}
}