「java接口高级」java接口技术

博主:adminadmin 2023-03-20 15:04:06 707

今天给各位分享java接口高级的知识,其中也会对java接口技术进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

JAVA中的接口是干嘛用的,,

好的面向对象编程要求类设计人员隐藏那些不需要类的使用人员了解的信息。对于 Java 编程语言,这样的访问可以通过使用关键字 private, protected, 和 public来控制。这些关键字控制类内部的变量和方法是否可见,但是不好的类设计导致太多的可见信息和方法没有被很好的封装。

封装的一种方式是通过使用接口(Interface)实现的。接口提供一种途径,使类隐藏其处理的特定事物的细节,仅对外公布它必须支持的属性。对于编程所涉及的,你可以修改类的实现,而不修改它的调用,因为属性本身没有改变,修改的仅仅是类的实现。

一个接口被经常用得到的地方是Collection Framework。这个框架定义了一组非常重要的接口,它们是由一组多个类实现的。通过仅仅研究主要的接口,你可以有效的掌握整个框架,因为特别的实现类一般不影响设计的整体。

例如,List接口定义了一个有序的元素集合。可用地实现包括ArrayList和LinkedList,它们都实现了List接口。当你的程序需要处理List时,不必考虑它是ArrayList还是LinkedList,只要知道所选用的类的属性即可。这个属性就是接口。

通过实现类的接口,并且在类设计时仅对外公布接口,你就有效的封装了类的定义,这样后台实现的变动将对系统其它部分的影响最小。

以ArrayList和LinkedList为例。将ArrayList看作一个可增长的数组对象(指是存储对象,而不是原始数据)。当类实现了List的全部接口时,它的特性在特定条件下是可以优化的。

例如,如果你的程序是要队列表中的数据进行频繁的随机访问,(例如,显示第3,12,2,和25项数据)ArrayList类提供对列表中每一个数据快速查询。快速查询是以在列表中间添加和删除数据的速度为代价的。如果后一种行为是你需要的,那么LinkedList类是一个好的选择。它提供快速的顺序访问、添加和删除,但是,代价是慢速随机查询。

在处理ArrayList和LinkedList时,有两种方式创建对象:

List cityList = new ArrayList() ;

LinkedList peopleList = new LinkedList() ;

两个代码段都是正确的,但是这两行代码之间存在的显著的差别。第一行表示我们要创建一个ArrayList,但是我们只需要把它作为一个List来访问。第二行正好相反。是,LinkedList项目被创建了,ArrayList也一样。但是,声明部分说明它只能作为LinkedList来访问,这就数它的最大区别。

理解接口真正变的重要是在这两行代码的用户确定“查询项目n”比在位置m处删除(或添加)项目更为重要时。

PeopleList变量被声明为LinkedList类型。这不是它本身的问题,因为你研究的更深层次的内容,你将发现peopleList在任何地方都被作为LinkedList对象处理。在你对peopleList使用LinkedList特有的方法的同时,如果你想把它作为ArrayList来处理,将会出现问题。

List peopleList = new ArrayList() ;

通过学习仅使用接口来处理任何对象,你将发现在设计完成之后修改实现,你需要修改的仅仅是声明部分,除此之外,没有任何代码改动。这就是接口的绝妙之处。因为类的最初声明是LinkedList,当类型变为List时意味着象addFirst或addLast这样的方法是无效的,因为新的peopleList的类型是List,它没有这些方法。

这种基于接口设计的代码,就像Collection Framework所向大家承诺的那样,任何人编写的代码是以循环构造方式进行的,而无需知道使用的是哪个Collection。创建的类是被限制为提供接口的完全实现。除此之外,新代码将不能被编译。

作为实例,下面的程序创建一组集合。每个集合提供一个系统定义的Iterator这样集合的每个元素可以被访问。这个iterator将被传递到帮助例程,在这里集合的独立元素将被打印。

import java.util.*;

public class Interfaces {

public static void main(String args[]) {

Properties props = System.getProperties();

Set keySet = props.keySet();

dumpIterator(keySet.iterator());

List list = Arrays.asList(args);

dumpIterator(list.iterator());

}

private static void dumpIterator(Iterator itor) {

// System.out.println(itor.getClass().getName());

while (itor.hasNext()) {

System.out.println(" " + itor.next());

}

System.out.println("----");

}

}

类Iterator的类型是unknown,这正是接口的绝妙之处,而不是问题。真正的事实是iterator方法返回的是一个真实的Iterator对象。然而,dumpIterator通常提供接口的完全实现。

如果你去掉dumpIterator中的println行的注释,你将发现真实的iterator类名,对Properties是Hashtable.Enumerator而List是AbstractList.Itr。这个事实不必知道,也不会对你的程序有任何帮助。真正重要的是List和Properties的iterator方法所返回的任何对象,必须实现java.util.Iterator:hasNext, next和remove方法。没有这三种方法中任何两种,dumpIterator方法将永远不能工作。

Java中抽象类和接口哪个高级?

差不太多,通常用接口比用抽象类要多得多,因为抽象类归根到底还是类,他只能单一继承,而接口是可以同时实现多个的

JAVA 接口问题

设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方法里的逻辑改改就行了,而不需要去改客户的需求

接口和抽像类是java面向对象的精华部分,一定要弄明白!否则java就白学了!

而且在编程时尽量做到以下原则:

1。面向抽像编程,少用具体;

2。多用类的接口编程,少用类的继承! 大陆的书把类的继承讲很大的篇幅,给人一种很深的误解,可能认为继承是最重要的;

另外再讲一个例子:

1。假设电影是一个接口(电影是抽象的名词);

2。客户想看最新的电影(需要一个具体的电影名)

3.《色戒》,《赤壁》是具体的影片,实现了电影这个接口,都可以被影院放出来;

4。电影院的服务宗旨是:放影片(抽象)!绝不能说成宗旨是放《色戒》(具体)否则下次电影院就放不出赤壁了也没有客户愿意来看电影了。

java接口高级的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java接口技术、java接口高级的信息别忘了在本站进行查找喔。