Java中实现多继承问题
Java中的类只能够进行单继承,不能实现多继承。
原因分析
原因:若一个类C同时继承类A和类B,而A和B中同时含有同名的方法d,当C类中调用父类中的方法d时,此时计算机不知道你要调用的是类A中的方法d还是类B中的方法d。(这是绝大多数Java教科书上的解释)
但笔者觉得完全可以用类似于接口中调用父接口的属性和方法的那样,通过"类名.属性名"的形式加以区分,如:
因此笔者更倾向于认为,Java的类不使用多继承的形式,更多的是因为Java团队想让开发者在开发过程中多使用super关键字调用父类的属性和方法,提高super关键字的使用频率,让程序显得更加严谨。
Java间接实现多继承的方法
方法一:使用接口
一个接口能够同时继承多个接口
例如:
interface FightAgainstLandlords{
int a = 0;
void fightAgainstLandlords();
void test();
}
interface HoeTheEarth{
int a=0;
void hoeTheEarth();
void test();
}
interface JiCheng extends FightAgainstLandlords,HoeTheEarth{
@Override
void test();
}
class DuoJiCheng2 implements JiCheng{
@Override
public void fightAgainstLandlords() {
System.out.println("Let's play the Fight Against Landlords.");
System.out.println(FightAgainstLandlords.a);
}
@Override
public void hoeTheEarth() {
System.out.println("Let's play the hoe the earth.");
}
@Override
public void test() {
System.out.println("Let's take a test.");
}
}
public class Duojicheng {
JiCheng jiCheng = new DuoJiCheng2();
DuoJiCheng2 duoJiCheng = (DuoJiCheng2) jiCheng;
@Test
public void Test() {
duoJiCheng.fightAgainstLandlords();
}
}
注意:一个接口同时继承两个接口时,如果要重写父接口的方法,且多个父接口有这个方法,则该方法在父接口中的参数列表必须保持一致。例如上面的test()方法,子接口和父接口中的该方法的参数列表必须保持一致(上述代码中均为void)。
接口重写父接口方法的作用:实现对象的多态性。
方法二:使用内部类
例如:
interface FightAgainstLandlords{
int a = 0;
void fightAgainstLandlords();
void test();
}
class Duojicheng2 {
FightAgainstLandlords fightAgainstLandlords = new FightAgainstLandlords() {
int b=50;
@Override
public void fightAgainstLandlords() {
System.out.println("Let's play the fight against landlords.");
}
@Override
public void test() {
System.out.println("Let's take a test.");
}
};
FightAgainstLandlords fightAgainstLandlords1 = new FightAgainstLandlords() {
int a=100;
@Override
public void fightAgainstLandlords() {
System.out.println("Let's play the hoe the earth.");
}
@Override
public void test() {
System.out.println("There're too much test.");
}
};
}
public class Duojicheng extends Duojicheng2{
@Test
public void test() {
fightAgainstLandlords.fightAgainstLandlords();
fightAgainstLandlords1.fightAgainstLandlords();
}
}
内部类的作用:
1.使代码更加简洁,增加代码的可读性和可维护性,如在类中直接使用”new 类名(){}“的形式。
2.如上面所示:间接实现多继承。