简单说 一个接口里面一个方法是在控制台输出信息,两个类一个B一个C都实现了A的方法 但B打出来的是B,C打出来的是C.需要打出那个字的时候就用那个实例化这个接口 在逻辑层只需要调你接口就可以了. class Main() { public static void main(String age[]) { A aB=new B(); A aC=new C(); //需要那个的时候就去有那个类去实例化A接口 aB.print(); aC.print(); } }public interface A { public void print(); }public class B implements A { public void print() { System.out.println("B"); } }public class C implements A { public void print() { System.out.println("C"); } }
> 多继承的时候用接口非也!这个说法似是而非
_______________________________
愿闻其祥~~~~
________________________________________________
谢谢maquan指点,小弟对java不是很精通,感觉用接口可以实现多继承,于是如此说了,谢谢指正~~~
我问的可能不标准
但是我不知道怎么问
interface IB 包含hit()
class Person implement a,b
{
实现eat();
实现hit();
}
class Person1 implement a,b
{
实现eat();
实现hit();
}class Test
{
main(){
Person p = new Person(); //具体实现
system.out.println(p.eat());
system.out.println(p.hit());
IA ia= new Person(); //向上转型 当需要person1类中的方法时不需要改
变下边的代码 只该这个定义就行了
system.out.println(ia.eat());
system.out.println(ia.hit());//错误
IB ib= new Person(); //向上转型 当需要person1类中的方法时不需要改
变下边的代码 只该这个定义就行了
system.out.println(ia.eat());//错误
system.out.println(ia.hit());
}
}
MSDN上有篇文章是对.net中使用虚拟类和接口的比较文章, 可以看得出, 大部分情况下, MSDN更推荐用虚拟类.
一个接口里面一个方法是在控制台输出信息,两个类一个B一个C都实现了A的方法
但B打出来的是B,C打出来的是C.需要打出那个字的时候就用那个实例化这个接口
在逻辑层只需要调你接口就可以了.
class Main()
{
public static void main(String age[])
{
A aB=new B();
A aC=new C();
//需要那个的时候就去有那个类去实例化A接口
aB.print();
aC.print();
}
}public interface A
{
public void print();
}public class B implements A
{
public void print()
{
System.out.println("B");
}
}public class C implements A
{
public void print()
{
System.out.println("C");
}
}
比如,你是汽车引擎的标准制定者,你只需要规定尺寸,尾气的排放量等等指标,而不用管生产的过程。你这个标准对2方面有用,一是引擎厂商,二是汽车制造商。引擎厂商按你的标准生产引擎,而汽车制造商按你的标准给引擎留位置。如果这个世界上只有一个引擎厂商,只生产一种引擎,那么你这个标准制定了也是白制定,没用的~。可是世界总是没有那么理想,只要有钱赚,一堆厂家会来生产引擎,这时候你的标准的作用就凸现出来了!对于家用型汽车生产商,它们可以选择价格便宜、功率较小的。而赛车生产商,它们可以选择功率强劲,油耗大的。对于同一款产品,如果汽车生产商黑,它还可以在量产的中途改用更差的引擎,而其他地方不用改。======
换到程序的领域也是如此,你定义好一个接口,那么对2方面有用,一是实现这个接口的程序员,另一方面是需要用这个实现的人。
如果你保证用到这个实现的地方,永远不会被修改(不会象黑心厂商那样),那么这个接口就没什么用,还没有你直接用实现类简单。
============
可是世界总是没这么理想,特别是程序的世界里。
今天,你的实现是针对ORACLE的,你的代码中用到了跟ORACLE特性相关的内容。明天,你的客户可能跟你说:SORRY,ORACLE太贵了,你能不能帮我做成MYSQL的版本?
为了满足他的需求,你有2种选择:
1、在以前的实现类上直接做修改。
2、新做一个实现类,在用到这个实现类的地方改代码为新的实现类。
=============
如果你只有一个客户,也保证他不会再要求改回用ORACLE,第一种选择更为简单。可是如果不满足以上2个条件,那么第2种选择更为合适。
=======
现在我们以具体的代码来示范。
(1)假设不用接口,你在用到这个实现的时候,你会这么写代码:
OracleImpl impl=new OracleImpl();
如果你把这个实现给多个方法用,那么方法的定义可能是这样:
void useImpl(OracleImpl impl){}
-----
那么当你需要把OracleImpl改成MysqlImpl的时候,你要改3个地方。
(2)使用接口,你会这么写代码:
Interface impl=new OracleImpl();
如果你把这个实现给多个方法用,那么方法的定义可能是这样:
void useImpl(Interface impl){}
-----
那么当你需要把OracleImpl改成MysqlImpl的时候,你只需要改1个地方。假设用到的地方很多,是不是比(1)强很多?但这还是不够!因为如果你有多个实例,那么你需要多个new OracleImpl();,这也需要你改多个地方。
(3)使用工厂模式
工厂模式就是把实例的产生的代码集中到一个类中,用这个类来产生实例。假设你定义的静态方法:
public class ImplFactory{
public static Interface getImpl(){
return new OracleImpl();
}
}
在用到的地方,你会这么写代码:
Interface impl=ImplFactory.getImpl();
-----
这样,当你改成MysqlImpl的时候,你是不是只用改工厂类的一个地方?是的!可是这还不够,因为你毕竟还要改代码,有没有不改代码的方法呢?有!
=========
比如我们把需要产生的实现类的类名放到一个配置文件中,假定这样写:
Interface=OracleImpl
那么我们工厂类可以这样:
public class ImplFactory{
public static Interface getImpl(){
String implClassName=\\此处略去从文件读的代码
return (Interface)(Class.forName(implClassName).newInstance());
}
}
当你需要改实现类为MysqlImpl的时候,你一行代码都不用改!只改配置文件就好了。======================
这就是接口的魅力!
======================