面向对象编程,接口和抽象类的区别
面向对象编程中,接口和抽象类都是用来定义规范的概念,但它们之间有一些区别: 1. 接口是一些方法的集合,没有任何实现代码,所有方法都是抽象的。接口定义了一个对象应该具有哪些功能,但并不关心这些功能的实现。接口可以通过实现它的类来实现功能。 2. 抽象类是一个类,可以包含抽象方法和具体方法,但不能被实例化。抽象类定义了一个对象应该有哪些特征和行为,但是没有提供它们的具体实现。它可以通过子类来继承和实现抽象方法。 3. 类可以实现多个接口,但只能继承一个抽象类。 4. 还有一个关键的区别是,接口定义的方法必须公开,而抽象类的方法可以是公开或受保护的。 总的来说,接口与抽象类都是定义规范的方式,但它们强调的侧重点不同,接口强调某个对象应该具有哪些功能,而抽象类则强调某个对象应该具有哪些特征和行为。
面向对象编程,为啥要引用抽象类
抽象类存在的意义在于它提供了一种机制,可以定义一些方法的签名(即方法的名称、参数类型和返回类型),而不需要提供实现。这些未实现的方法被称为抽象方法。 通过定义抽象类和抽象方法,我们可以实现代码重用和多态性。具体来说,子类可以继承抽象类,并实现其中的抽象方法,从而获得相应的功能。这样,我们可以通过子类对象调用抽象父类中相同的方法,但得到不同的结果。这就是多态性的一种体现。 此外,抽象类还可以充当接口的作用。接口是一种特殊的抽象类,它只包含抽象方法和常量,没有实例变量。实现某个接口的类必须实现接口中的所有方法。通过定义接口或实现接口,我们可以实现模块化和角色分离,从而提高代码的可维护性和可重用性。 因此,在面向对象编程中,抽象类是非常重要的概念,它可以帮助我们实现多态性、接口和代码重用等功能
子类继承父类和实现的接口有相同的方法名
如果一个Java类既继承了一个具有run方法的类,又实现了一个具有run方法的接口,那么它必须重写run方法,以明确要执行哪个方法。
如果子类实现的接口和父类都具有相同的方法名和参数列表,则在子类中直接重写该方法即可。子类重写的方法会覆盖父类的方法,而这样做不会影响接口的实现。
如果子类继承的父类中已经实现了run方法,而子类又同时实现了包含run方法的接口,此时子类需要Override run方法,并且在Override的run方法中调用super.run()语句来显式地调用父类的run方法。这样就可以保证父类run方法中的逻辑会被执行,同时还可以实现接口中run方法的相关逻辑。
以下是一个简单的例子:
interface MyInterface {
void run();
}
class MyThread extends Thread implements MyInterface {
@Override
public void run() {
System.out.println("MyThread's run method");
}
}
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
}
在这个例子中,MyThread
继承了Thread
类并实现了MyInterface
接口,同时两者都有run()
方法。然而,由于Thread
类中的run()
方法已经被重写了,所以MyThread
类中的run()
方法将会调用Thread
类中的run()
方法。如果我们想要调用MyInterface
中的run()
方法,可以通过多态实现。
interface MyInterface {
void run();
}
class MyThread extends Thread implements MyInterface {
@Override
public void run() {
System.out.println("MyThread's run method");
}
}
public class Main {
public static void main(String[] args) {
MyInterface myThread = new MyThread();
myThread.run(); // 调用MyInterface中的run方法
}
}
在这个例子中,我们将MyThread
对象转换为MyInterface
类型并调用了run()
方法。由于MyThread
对象实现了MyInterface
接口,我们可以使用多态来调用MyInterface
中的run()
方法。