---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
接口是为了让继承类实现接口中定义的方法.
举个例子:可以定义类狗,猫.同时可以先定义一个动物的接口.
1、接口定义:
public interface interface_1{
public interface interface_1_1{
public interface interface_1_2{
public void interface_1_func(interface_1 i);
public void interface_1_func1(int i);
}
}
}
接口方法interface_1_func(interface_1 i)的参数又是本接口类型。
2、接口实现:
interface_1 interface_10;
interface_10 = new interface_1(){
public void interface_1_func(interface_1 i){
}
public void interface_1_func1(int i){
i = 1;
}
};
设Pet为接口,有一个接口方法: speak()//说话发声
类Cat 类Dog 都实现该Pet接口
静态类PetManager为宠物管理类。它有方法 public static Pet getPet(参数:声音类型){},访方法能生成(制造出)一个Dog或者Cat
其中Cat 对speak的实现为: public void speak(){ “喵一声”}
其中Dog 对speak的实现为: public void speak()(“汪一声”)
有个客户它想听一声猫叫,那么该客户就可以Cat c = new Cat(); c.speak();
有个客户它想听一声狗叫,那么该客户就可以 Dog d=new Dog(); d.speak();
可是很多情况下客户只想听个宠物叫一声,不管它是猫还是狗,只要能解解闷就行,那么就可以 :
Pet p; p= PetMager.getPet(); p.speak();
这时候前面的Cat c 和Dog d 就都不行了。因为 cat不能叫汪一声, dog不能叫喵一声; 随着时间变化,客户可能还想听牛叫,马叫,猪叫....
这个时候如果用写死的那个Cat 或Dog 客户端的代码就无法表现了。 如果要实现,就必须升级客户端的代码,如果这种产品己经卖了几千万份出去,那就会有几千万人排队来厂家门口升级他们的产品。
我们需要做到尽量让客户手上的产品少升级以方便用户。所以,我们不要太具体地指定 : Pet p;
至于p从哪里来,我们可以从公司的营销模式逻辑来调整,也就是getPet()方法。
以后,客户想听更多的声音,只要公司内部进行调整,把新产品加到目录就可以了。客户端不需做任何改变;客户想听什么声音都可以;
现在来实现PetManager的getPet():
public static Pet getPet(参数:声音类型){
if 猫: return new Cat();
if 狗: return new Dog();
if 猪: return new pig();
if 牛: .....
..............
}
在这种情况下 getPet()称之为Pet实例的工厂方法!它是工厂,由它来生产Pet。程序逻辑根据客户的需求来产生具体的宠物实例。客户不需要关心这个宠物到底是怎么产生的。
这样的程序称之为对客户透明性;
我们如果对工厂再进行一些高级拓展就可以向20多种设计模式发展,如抽象工厂、工厂的工厂等等....
现在总结: 在现实生活中,客户的需求是变化的,不确定的,所以我们需要灵活的机制来满足客户的需要。客户今天可能想要猫,明天可能想要狗,或者他只是想随便找个宠物来玩一玩。所以我们不能把写死了就是猫,改天他想要狗了我们只需把getPet方法里的逻辑改改就行了,而不需要去改客户的需求
当类与接口(或者是接口与接口)发生方法命名冲突的时候,此时必须使用内部类来实现。
这是唯一一种必须使用内部类的情况。
用接口不能完全地实现多继承,用接口配合内部类才能实现真正的多继承。
匿名内部类:
1.匿名内部类是一种特殊的局部内部类,它是通过匿名类实现接口。
2.不同的是他是用一种隐含的方式实现一个接口或继承一个类,而且他只需要一个对象
3.在继承这个类时,根本就没有打算添加任何方法。
4.匿名内部类大部分情况都是为了实现接口的回调。
内部接口:
在一个类中也可以定义内部接口
在接口中可以定义静态内部类,此时静态内部类位于接口的命名空间中。
在接口中还可以定义接口,这种接口默认也是public static 的,如Map.Entry就是这种接口
---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------