抽象类与接口是J--a中两个重要的概念,都用于实现多态性和代码重用。在本文中,将会介绍这两个概念的特点以及如何使用它们来实现继承父类同时实现接口,还有接口的多继承。
老规矩,思维导图我已经整理好放在文末,需要自取哈
抽象类
J--a中的抽象类是一种不能直接实例化的类,只能被其他类继承。抽象类通常包含一些抽象方法,这些方法没有具体实现,需要在子类中实现。抽象类中还可以包含具有具体实现的普通方法。
抽象类的定义方式:
public abstract class A----l
{ public abstract void eat(); // 抽象方法
public void sleep()
{
System.out.println("A----l is sleeping");
}
}
上述代码定义了一个抽象类A----l
,其中包含了一个抽象方法eat()
,以及一个具有具体实现的方法sleep()
。
当我们创建一个继承自抽象类的子类时,必须实现所有抽象方法。例如:
public class Dog extends A----l {
@Override
public void eat() {
System.out.println("Dog is eating");
}
}
上述代码定义了一个继承自A----l
的子类Dog
,并实现了eat()
方法。因为eat()
方法在父类中是抽象的,所以子类必须实现。
接口
J--a中的接口是一种包含抽象方法和常量的类型。接口没有具体的实现,只定义了方法的签名。类可以实现一个或多个接口,从而获得接口中定义的方法。
接口的定义方式:
public inte---ce A----l {
void eat(); // 抽象方法
void sleep();
}
上述代码定义了一个接口A----l
,其中包含了两个抽象方法eat()
和sleep()
。
当我们创建一个实现了某个接口的类时,必须实现所有接口中定义的方法。例如:
public class Dog implements A----l {
@Override
public void eat() {
System.out.println("Dog is eating");
}
@Override
public void sleep() {
System.out.println("Dog is sleeping");
}
}
上述代码定义了一个实现了A----l
接口的类Dog
,并实现了接口中定义的两个方法。
继承父类同时实现接口
J--a中的类可以同时继承一个父类并实现一个或多个接口。这使得类可以获得父类和接口中定义的属性和方法。例如:
public class Husky extends Dog implements A----l {
@Override
public void sleep() {
System.out.println("Husky is sleeping");
}
}
上述代码定义了一个同时继承自Dog
类和实现了A----l
接口的子类Husky
。子类需要实现所有接口中定义的方法,同时也可以覆盖父类中的方法。
接口的多继承
J--a中的接口可以通过extends
关键字实现多继承。当一个接口继承自另外一个或多个接口时,它会包含所有被继承接口中定义的方法和常量。例如:
public inte---ce Mammal extends A----l {
void run();
}
public class Dog implements Mammal {
@Override
public void eat() {
System.out.println("Dog is eating");
}
@Override
public void sleep() {
System.out.println("Dog is sleeping");
}
@Override
public void run() {
System.out.println("Dog is running");
}
}
上述代码定义了一个接口Mammal
,继承自A----l
接口,并添加了一个新的抽象方法run()
。Dog
类实现了Mammal
接口,因此必须实现eat()
、sleep()
和run()
三个方法。
在使用接口时需要注意,如果一个类同时实现了两个具有相同方法名的接口,那么子类必须覆盖这个方法并实现自己的逻辑。