java中的多重继承

“一个x是一个a和一个b以及一个c”

对于这句话的理解,在java代码中可以这样写:

interface AInterface {
public void aMethod();
}

interface BInterface {
public void bMethod();
}

class FatherClass {
public void cMethod() {
System.out.println("cMehtod");
}
}

public class TestInterfaces extends FatherClass implements AInterface, BInterface {
@Override
public void aMethod() {
System.out.println("aMehtod");
}

@Override
public void bMethod() {
System.out.println("bMehtod");
}

@Override
public void cMethod() {
super.cMethod();
System.out.println("sub cMehtod");
}

public static void main(String[] args) {
TestInterfaces ti = new TestInterfaces();
AInterface aClass = (AInterface)ti;
aClass.aMethod();
//aClass.bMethod(); error
//aClass.cMethod(); error

BInterface bClass = (BInterface)ti;
//bClass.aMethod(); error
bClass.bMethod();
//bClass.cMethod(); error

FatherClass fc = (FatherClass)ti;
//fc.aMethod(); error
//fc.bMethod(); error
fc.cMethod();
}
}


在main方法中可以看出,TestInfterfaces类可以向上转型为AInterface或者BInterface或者FatherClass,但是向上转型后,其它接口实现方法或者父类的覆载方法都无法调用了,这也恰好说明了向上转型的特性!

如果TestInfterfaces类继承的多个接口中有重复的方法定义,那么在TestInfterfaces类中只需实现一次即可。在做向上转型,也会同时拥有该方法的实现。

interface AInterface {
public void aMethod();
public void print();
}

interface BInterface {
public void bMethod();
public void print();
}

class FatherClass {
public void cMethod() {
System.out.println("cMehtod");
}
}

public class TestInterfaces extends FatherClass implements AInterface, BInterface {
@Override
public void aMethod() {
System.out.println("aMehtod");
}

@Override
public void bMethod() {
System.out.println("bMehtod");
}

@Override
public void print() {
System.out.println("print method");
}

@Override
public void cMethod() {
super.cMethod();
System.out.println("sub cMehtod");
}

public static void main(String[] args) {
TestInterfaces ti = new TestInterfaces();
AInterface aClass = (AInterface)ti;
aClass.aMethod();
//aClass.bMethod(); error
//aClass.cMethod(); error
aClass.print(); //right

BInterface bClass = (BInterface)ti;
//bClass.aMethod(); error
bClass.bMethod();
//bClass.cMethod(); error
bClass.print(); //right

FatherClass fc = (FatherClass)ti;
//fc.aMethod(); error
//fc.bMethod(); error
fc.cMethod();
//fc.print(); error
}
}

如果重载父类的方法在继承的接口中有定义,即

interface BInterface {
public void bMethod();
public void print();
}

class FatherClass {
public void cMethod() {
System.out.println("cMehtod");
}

public void print() {
System.out.println("FatherClass print");
}
}

那么在TestInfterfaces类中,可以不覆载print方法

public class TestInterfaces extends FatherClass implements AInterface, BInterface {
@Override
public void aMethod() {
System.out.println("aMehtod");
}

@Override
public void bMethod() {
System.out.println("bMehtod");
}

// @Override
// public void print() {
// System.out.println("print method");
// }

@Override
public void cMethod() {
super.cMethod();
System.out.println("sub cMehtod");
}

public static void main(String[] args) {
TestInterfaces ti = new TestInterfaces();
AInterface aClass = (AInterface)ti;
aClass.aMethod();
//aClass.bMethod(); error
//aClass.cMethod(); error

BInterface bClass = (BInterface)ti;
//bClass.aMethod(); error
bClass.bMethod();
//bClass.cMethod(); error
bClass.print(); //right

FatherClass fc = (FatherClass)ti;
//fc.aMethod(); error
//fc.bMethod(); error
fc.cMethod();
fc.print();
}
}

虽然没有显示提供print方法的定义,但编译正确。原因是print方法在FatherClass类中继承而来,自动提供了print方法的定义。

如果重载父类中的一个方法名与继承的接口中定义的一个方法名相同,但返回值类型不同,即

interface BInterface {
public void bMethod();
public int print();
}

class FatherClass {
public void cMethod() {
System.out.println("cMehtod");
}

public void print() {
System.out.println("FatherClass print");
}
}

那么在TestInfterfaces类中就会出现错误,无法编译。

因此,在多重继承中,尽量避免上述情况!






原文地址:https://www.cnblogs.com/linxyz/p/2397082.html