1,java中只能利用接口达到多实现而已,跟多继承相仿
白碱滩网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、响应式网站建设等网站项目制作,到程序开发,运营维护。创新互联公司公司2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司。
2,java中唯一可以实现多继承的
就是接口与接口之间了。
先说继承
比如
class
fu1
{
void
show(){}
}
class
fu2
{
void
show(){}
}
class
zi
extends
fu1,fu2
{
void
show(){}
}
这时候
创建zi引用
调用show方法
java
虚拟机
就不知道该调用父类的哪个show方法了
同理
在接口中
class
fu1
{
void
show();
}
class
fu2
{
void
show();
}
class
zi
extends
fu1,fu2
{
void
show(){}
}
接口的fu1
和
f2
的show方法都是abstract的
抽象的
是没有方法体的
所以只有子类的show方法是有方法体的
所以接口
可以多实现
也就是变量的多继承
所以也可以推出
接口与接口之间也是可以多继承的
就算接口a
的父类接口
b和c都有同一个方法show()
但是他们都是抽象方法
a继承他们
也是抽象的
这个不就可以继承了吗?
由实现的例子就可以推出来
,接口确实是可以多继承的。
java中没有多继承(就是不能继承多个父类),只有多重继承。。比如:\x0d\x0aclass A{\x0d\x0a}\x0d\x0a\x0d\x0aclass B extends A{\x0d\x0a}\x0d\x0a\x0d\x0aclass C extends B {\x0d\x0a}\x0d\x0a可以实现多个接口,比如:\x0d\x0ainterface A{\x0d\x0a}\x0d\x0a\x0d\x0ainterface B{\x0d\x0a\x0d\x0a}\x0d\x0a\x0d\x0aclass C implements A, B\x0d\x0a{\x0d\x0a}
接口(interface) 接口被用来建立类与类之间关联的标准 Java code public interface ITest{ public void test(); } public class TestImpl implements ITest{ public void test(){ System out println( test ); } }
抽象类(abstract class) 只要类中有一个抽象方法 此类就被标记为抽象类 实际上抽象类除了被继承之外没有任何意义
区别 接口是公开(public)的 里面不能有私有的方法或变量 是用于让别人使用的 实现接口的一定要实现接口里定义的所有方法 而抽象类是可以有私有方法或私有变量的 实现抽象类可以有选择地重写需要用到的方法 但是必须实现里面所有的抽象方法 抽象类在 Java 语言中表示的是一种继承关系 一个类只能使用一次继承关系 但是 一个类却可以实现多个interface(java中实现多重继承的方法之一) 抽象类中可以有自己的数据成员 也可以有非abstarct的成员方法 而在接口中 只能够有静态的不能被修改的数据成员(也就是必须是 static final的 不过在 interface中一般不定义数据成员) 而且所有的成员方法都是抽象的 抽象类和接口所反映出的设计理念不同 其实abstract class表示的是 is a 关系 interface表示的是 like a 关系 (组合是 has a 关系) 接口中定义的变量默认是public static final 型 且必须给其初值 所以实现类中不能重新定义 也不能改变其值 抽象类中的变量默认是 friendly 型 其值可以在子类中重新定义 也可以重新赋值
一般的应用里 最顶级的是接口 然后是抽象类实现接口 最后才到具体类实现 不是很建议具体类直接实现接口的 还有一种设计模式是面向接口编程 而非面向实现编程
其实接口是抽象类的延伸 可以将它看做是纯粹的抽象类 就是说接口比抽象类还抽象 还有设计接口的目的就是为了实现C++中的多重继承 不过java团队设计的一样更有趣的东西来实现这个功能 那就是内部类(inner class)
内部类(inner class) Java code public class OuterClass{//外部类 private class InnerClass{}//内部类 }
一 定义 放在一个类的内部的类我们就叫内部类 二 作用 内部类可以很好的实现隐藏 也就是封装性 一般的非内部类 是不允许有 private 与protected权限的 但内部类可以 内部类拥有外围类的所有元素的访问权限 可是实现多重继承(这个特点非常重要 个人认为它是内部类存在的最大理由之一) 可以避免修改接口而实现同一个类中两种同名方法的调用 三 多重继承的实现
类一 Java code public class Example {
public String getName() { return luffyke ; } }
类二 Java code public class Example {
public int getAge() { return ; } }
类三
Java code public class MainExample {
public class Test extends Example { public String getName() { return super getName(); } }
public class Test extends Example { public int getAge() { return super getAge(); } }
public String showName() { return new Test () getName(); }
public int showAge() { return new Test () getAge(); }
public static void main(String args[]) { MainExample example = new MainExample(); System out println( 姓名: + example showName()); System out println( 年龄: + example showAge()); } }
lishixinzhi/Article/program/Java/hx/201311/26594
使用内部类让Java实现 多继承
众所周知 Java没有像c++那样支持多继承 但是我们可以使用接口或内部类来模拟实现多继承
我们使用内部类来实现一个继承自消费者 又继承自生产者的派生类
实际上Java之所以设计出内部类这个概念 一方面是为了更好的封装性 另一方面就是借助内部类模拟实现多继承
首先我们定义一个消费者抽象基类
view plainprint?
/** * Consumer Class *@author androidyue *Last Modified 上午 */ public abstract class Consumer { protected float buyPrice protected abstract void buyGoods() }
以下是生产者抽象基类
view plainprint?
/** * Producer Class *@author androidyue *Last Modified 上午 */ public abstract class Producer { protected float cost protected abstract void produce() }
使用内部类实现 多继承 的派生子类
view plainprint?
/** *Java实现 多继承
*@author androidyue *Last Modified 上午 */ public class InnerClassDemo extends Producer { private ConsumerBuyer buyer
public void desribeMySelf(){ System out println( 使用Java模拟多继承 ) this produce() this buyer=new ConsumerBuyer() this buyer buyGoods()
}
@Override protected void produce() { st= f System out println( 我是生产者 我以每件 +st+ RMB的成本生产一件产品 然后以 元价格对外出售 ) }
class ConsumerBuyer extends Consumer{
@Override protected void buyGoods() { this buyPrice= f System out println( 我是消费者 我以 +this buyPrice+ RMB 买了一件售价 元的商品 不信吧 因为我也是生产者!^_^ )
}
}
}
在程序入口调用
view plainprint?
/** * the entrance of application *@author androidyue *Last Modified 上午 */ public class AppMain { public static void main(String[] args){ InnerClassDemo demo=new InnerClassDemo() demo desribeMySelf() }
lishixinzhi/Article/program/Java/hx/201311/25912