Java为什么不支持多继承?
本文最后更新于 2637 天前,其中的信息可能已经有所发展或是发生改变。

Java为什么不支持多继承?这个问题其实真的挺简单。

我们可以先举一个多重继承错误的例子,我们定义一个动物(类)既是狗(父类1)也是猫(父类2),两个父类都有“叫”这个方法。那么当我们调用“叫”这个方法时,它就不知道是狗叫还是猫叫了,这就是多重继承的冲突。

package com.glj.demo1;

public class Cat {
	public void say(){
		System.out.println("this is Cat say!");
	}
}
------------------------------
package com.glj.demo1;

public class Dog {
	public void say(){
		System.out.println("this is dog say!");
	}
}
----------------------------------------------------
package com.glj.demo1;

public class CatAndDog extends Dog,Cat{
	public static void main(String[] args) {
		this.say();//这里是猫叫呢还是狗叫呢?
	}
}

所以,如果你需要弄一个既要有猫叫又要有狗叫的什么鬼动物来的话,那么只需要创造一个描述这类行为的接口,然后在自己的类里面实现这个行为的接口,最终就能实现所谓的行为来了….

因此,Java支持接口的多继承,不支持类的多继承,Java不支持类的多继承的一个原因是避免实现方法的版本冲突

所以需要实现多继承,那么就是下面的

多接口+组合=多继承

下面我们实现一个多继承的例子,即一个接口people类,里面有一个say方法和一个work的行为方法,再有一个Chinese接口类和American接口类去继承了people的接口,然后二者结婚生下了一个中美的混血儿..ChandAm类…

package com.glj.demo;

public interface People {
	public abstract void say();
    public abstract void work();
}
---------------------------------------
package com.glj.demo;

public interface American extends People{

	@Override
	public void say();

	@Override
	public void work();

}
---------------------------------------
package com.glj.demo;

public interface Chinese extends People{
	@Override
	public void say();

	@Override
	public void work();
}
---------------------------------------
package com.glj.demo;

public class ChandAm implements Chinese,American{

	@Override
	public void say() {
		// TODO Auto-generated method stub
		System.out.println("我是中美的混血儿");
	}

	@Override
	public void work() {
		// TODO Auto-generated method stub
		System.out.println("我会打太极");
	}

}
-----------------------------------------------
package com.glj.demo;

public class Test {
	
	public static void main(String[] args) {
		ChandAm cna = new ChandAm();
		cna.say();//我是中美的混血儿
		cna.work();//我会打太极
	}
}
所以,从上面的例子不难发现,Java其实是支持多继承的,具体为:
  • Java中的接口支持多继承(接口与接口之间为继承关系),因为接口不提供具体实现方式,只是一种规范,所以支持。
  • Java的类是支持多接口的实现。
  • Java的类是不支持多继承的,原因是Java是强类型语言,多继承会导致调用的不确定性,所以Java的类不支持。

评论

  1. 风与路人
    Windows Chrome 61.0.3163.100
    7 年前
    2018-2-22 22:44:42

    这个网站的代码高亮显示和图片的储存是如何做的啊,谢谢,请指教下

    • 博主
      风与路人
      Windows Chrome 55.0.2883.87
      7 年前
      2018-2-24 18:22:59

      代码是用Crayon Syntax Highlighter的插件,图片显示是用七牛存储的

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇