类同时继承父类和实现接口时易出现的问题(暂不考虑接口中可能存在的默认方法和静态方法)
一、使用接口的时候,需要注意:
- 接口是没有静态代码块或者构造方法的。
- 一个类的直接父类是唯一的,但是一个类可以同时实现多个接口。
格式:
public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB {
// 覆盖重写所有抽象方法
}
- 如果实现类所实现的多个接口当中,存在重名的抽象方法:
- 1.参数列表+返回值 都相同:实现类只要实现一次此方法即可
interface A{
void method();
}
interface B{
void method();
}
public class C implements A, B {
@Override
public void method() {
System.out.println("实现类只需重写一次同名抽象方法");
}
}
- 2.参数列表相同+返回值类型不同:实现类无法直接实现两个方法(IDE报错),因为不满足方法重载原则。
interface A{
int method();
}
interface B{
void method();
}
public class C implements A, B {
@Override
public int method() { //报错,因为不满足方法重载原则
return 0;
}
}
- 3.参数列表不相同:实现类可以分别实现两个方法,可以方法重载
interface A{
void method(int b);
}
interface B{
void method();
}
public class C implements A, B {
@Override
public void method(int b) {
}
@Override
public void method() {
}
}
二、父类与接口中存在同名方法
- 1、若子类没有重写该方法,则默认会优先调用父类中的方法,不会报错。
interface A{
void method();
}
class B{
public void method(){
System.out.println("父类B中的方法被调用!");
}
}
class C extends B implements A {
}
public class Test{
public static void main(String[] args) {
C c = new C();
c.method();
}
}
此处需注意:
父类中与接口同名的方法必须是public修饰的(与接口中方法默认的修饰符相同),此时相当于子类继承的父类方法实现(重写)了接口的抽象方法,而重写的方法权限修饰符需要>=被重写方法的权限修饰符。示例:
interface A{
void method();
}
class B{
void method(){
System.out.println("父类B中的方法被调用!");
}
}
class C extends B implements A { //会报错,提示需要实现接口抽象方法
}
- 2、若子类重写了该方法,则相当于同时重写了父类以及接口中的方法。调用的是子类重写后的方法
interface A{
void method();
}
class B{
public void method(){
System.out.println("父类B中的方法被调用!");
}
}
class C extends B implements A {
@Override
public void method() {
System.out.println("子类中的方法被调用!");
}
public static void main(String[] args) {
C c = new C();
c.method();
}
}
打印结果:
子类中的方法被调用!