java中多重继承_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类中就会出现错误,无法编译。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值