‘壹’ 谁能提供java中接口的实例讲解
接口(interface):
接口的定义:接口从本质上说是一种特殊的抽象类。
关键字interface。
在接口中,所有的方法为公开、抽象的方法:public abstract
在接口中,所有的属性都是公开、静态的常量:public static final
接口与接口之间可以多继承,用extends,多个之间用逗号隔开。
接口中没有构造方法,不能用“new 接口名”来实例化一个接口,但可以声明一个接口。
接口的实现:
关键字implements
一个类实现一个接口必须实现接口中所有的方法,否则其为抽象类,并且在实现类中的方法要加上public(不能省略)。
类中的默认修饰符:default。
接口中的默认修饰符:public。
一个类除了继承另一个类外(只能继承一个类),还可以实现多个接口(接口之间用逗号分隔)。
接口的作用:
间接实现多继承:用接口来实现多继承并不会增加类关系的复杂度。因为接口不是类,与类不在一个层次上,是在类的基础上进行再次抽象。
接口可以抽象出次要类型,分出主、次关系类型,符合看世界的一般方法。
接口隔离,与封装性有关。一个对象都有多个方面,可以只展示其中几个方面,其他的都隐藏。因此可以看为“更高层次的封装”,把 一个大接口做成若干个小接口。
通过接口制定标准(最重要的作用)
接口:制定标准。
接口的调用者:使用标准。
接口的实现类:实现标准。
解耦合作用:把使用标准和实现标准分开,使得标准的制定者和实现者解除偶合关系,具有极强的可移植性
例:sun公司提供一套访问数据库的接口(标准),java程序员访问数据库时针对数据库接口编程。接口由各个数据库厂商负责实现。
接口编程的原则
尽量针对接口编程(能用接口就尽量用接口)
接口隔离原则(用若干个小接口取代一个大接口)
注意:
接口中没有构造器,也没有main方法
‘贰’ JAVA里的接口谁能给我编写个例子解释下啊
昂, 在java里 基本都是面向接口编程开发, 为什么呢·,应为一个类只能继承一个类 ,却能实现多个接口,
首先 用起来方便,结构清晰
在j2ee中的接口也就是类,类与类之间的通信因为接口而变的简单易懂
举个简单的JDBC的例子吧,比如有个BaseDao接口,现在有MySQLDao实现了一个(我们可以把具体的实现类配在配置
文件中,再通过反射进行实例化),也就类似这样的:
BaseDao = (BaseDao)(Class.forName(Config.getDaoName()).newInstance());
其中Config.getDaoName()可以获得配置文件中的配置,比如是:com.bao..impl.MySQLDao。
之后,那些人开始要烧钱了,要改用Oracle了,这样我们只要按BaseDao的定义,再实现一个OracleDao就可以了,
再将配置文件中的配置改为:com.bao..impl.OralceDao就可以了,而在已经写好的代码中,我们可以一行不
改的进行了数据库移植,这个就是面向对象设计原则中的“开-闭原则”(对增加是开放的,对修改是封闭的)。但
这只是理论上的,现实中很难做到的。
‘叁’ 什么是面向接口编程及一个简单实例
面向接口编程是一个很高级的概念了以前的面向对象编程,以java为例子,主要的操作针对对象来进行,把要处理的问题简化分解成对象的方式来解决,对对象的使用主要是引用对象提供的方法后来的使用过程中,逐渐有人发现,当程序的内容不断扩大,程序的编写和完善需要更多的人员来合作完成的时候,面向对象的方式有些不便就很突出了,主要的就是类的继承和方法的重写,查询起来和引用起来很多不便。所以现在有面向接口编程的理念提出来,接口就是标准,接口就是规范,但是接口没有实现的方法,这样避免了很多类的继承的问题,特别在大型的程序的编写方面有广泛的应用。什么是面向接口编程及一个简单实例
‘肆’ java编写一个有关接口的程序
给你的也不是什么系统之类的.
也就是一个思想而已,想了一下用<设计模式之Factory>来回答你的问题.
///////////////////////////////////////////////////////////////
工厂模式定义:提供创建对象的接口.
为何使用?
工厂模式是我们最常用的模式了,着名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。
为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑实用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
我们以类Sample为例, 如果我们要创建Sample的实例对象:
Sample sample=new Sample();
可是,实际情况是,通常我们都要在创建sample实例时做点初始化的工作,比如赋值 查询数据库等。
首先,我们想到的是,可以使用Sample的构造函数,这样生成实例就写成:
Sample sample=new Sample(参数);
但是,如果创建sample实例时所做的初始化工作不是象赋值这样简单的事,可能是很长一段代码,如果也写入构造函数中,那你的代码很难看了(就需要Refactor重整)。
为什么说代码很难看,初学者可能没有这种感觉,我们分析如下,初始化工作如果是很长一段代码,说明要做的工作很多,将很多工作装入一个方法中,相当于将很多鸡蛋放在一个篮子里,是很危险的,这也是有背于Java面向对象的原则,面向对象的封装(Encapsulation)和分派(Delegation)告诉我们,尽量将长的代码分派“切割”成每段,将每段再“封装”起来(减少段和段之间偶合联系性),这样,就会将风险分散,以后如果需要修改,只要更改每段,不会再发生牵一动百的事情。
在本例中,首先,我们需要将创建实例的工作与使用实例的工作分开, 也就是说,让创建实例所需要的大量初始化工作从Sample的构造函数中分离出去。
这时我们就需要Factory工厂模式来生成对象了,不能再用上面简单new Sample(参数)。还有,如果Sample有个继承如MySample, 按照面向接口编程,我们需要将Sample抽象成一个接口.现在Sample是接口,有两个子类MySample 和HisSample .我们要实例化他们时,如下:
Sample mysample=new MySample();
Sample hissample=new HisSample();
随着项目的深入,Sample可能还会\"生出很多儿子出来\", 那么我们要对这些儿子一个个实例化,更糟糕的是,可能还要对以前的代码进行修改:加入后来生出儿子的实例.这在传统程序中是无法避免的.
但如果你一开始就有意识使用了工厂模式,这些麻烦就没有了.
工厂方法
你会建立一个专门生产Sample实例的工厂:
public class Factory{
public static Sample creator(int which){
//getClass 产生Sample 一般可使用动态类装载装入类。
if (which==1)
return new SampleA();
else if (which==2)
return new SampleB();
}
}
那么在你的程序中,如果要实例化Sample时.就使用
Sample sampleA=Factory.creator(1);
这样,在整个就不涉及到Sample的具体子类,达到封装效果,也就减少错误修改的机会,这个原理可以用很通俗的话来比喻:就是具体事情做得越多,越容易范错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,范错误可能性就越少.好象我们从编程序中也能悟出人生道理?呵呵.
使用工厂方法 要注意几个角色,首先你要定义产品接口,如上面的Sample,产品接口下有Sample接口的实现类,如SampleA,其次要有一个factory类,用来生成产品Sample,如下图,最右边是生产的对象Sample:
进一步稍微复杂一点,就是在工厂类上进行拓展,工厂类也有继承它的实现类concreteFactory了。
抽象工厂
工厂模式中有: 工厂方法(Factory Method) 抽象工厂(Abstract Factory).
这两个模式区别在于需要创建对象的复杂程度上。如果我们创建对象的方法变得复杂了,如上面工厂方法中是创建一个对象Sample,如果我们还有新的产品接口Sample2.
这里假设:Sample有两个concrete类SampleA和SamleB,而Sample2也有两个concrete类Sample2A和SampleB2
那么,我们就将上例中Factory变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现,下面就是将上例中的Factory拓展成抽象工厂:
public abstract class Factory{
public abstract Sample creator();
public abstract Sample2 creator(String name);
}
public class SimpleFactory extends Factory{
public Sample creator(){
.........
return new SampleA
}
public Sample2 creator(String name){
.........
return new Sample2A
}
}
public class BombFactory extends Factory{
public Sample creator(){
......
return new SampleB
}
public Sample2 creator(String name){
......
return new Sample2B
}
}
从上面看到两个工厂各自生产出一套Sample和Sample2,也许你会疑问,为什么我不可以使用两个工厂方法来分别生产Sample和Sample2?
抽象工厂还有另外一个关键要点,是因为 SimpleFactory内,生产Sample和生产Sample2的方法之间有一定联系,所以才要将这两个方法捆绑在一个类中,这个工厂类有其本身特征,也许制造过程是统一的,比如:制造工艺比较简单,所以名称叫SimpleFactory。
在实际应用中,工厂方法用得比较多一些,而且是和动态类装入器组合在一起应用.
....后面还有一些,但是我想这些应该可以解决你想知道的了.
‘伍’ java编程关于接口的程序
packagecom.shape;
publicinterfaceVolume{
doublePI=3.1415926;
//计算体积
publicdoublecalVolume();
//计算表面积
publicdoublecalArea();
}
packagecom.shape;
//圆柱体
{
privatedoubleRadius;
privatedoubleHeight;
publicCylinder(doubleRadius,doubleHeight){
this.Radius=Radius;
this.Height=Height;
}
publicdoublegetRadius(){
returnRadius;
}
publicvoidsetRadius(doubleradius){
Radius=radius;
}
publicdoublegetHeight(){
returnHeight;
}
publicvoidsetHeight(doubleheight){
Height=height;
}
@Override
publicdoublecalVolume(){
//TODOAuto-generatedmethodstub
returnPI*Radius*Radius*Height;
}
@Override
publicdoublecalArea(){
//TODOAuto-generatedmethodstub
returnPI*Radius*Radius*2+PI*Radius*Height*2;
}
}
packagecom.shape;
//圆锥
{
privatedoubleRadius;
privatedoubleHeight;
publicdoublegetRadius(){
returnRadius;
}
publicvoidsetRadius(doubleradius){
Radius=radius;
}
publicdoublegetHeight(){
returnHeight;
}
publicvoidsetHeight(doubleheight){
Height=height;
}
publicCone(doubleRadius,doubleHeight){
this.Radius=Radius;
this.Height=Height;
}
//圆锥体的母线的长
publicdoublegetConeLine(){
doubleLine=Radius*Radius+Height*Height;
returnMath.sqrt(Line);
}
@Override
publicdoublecalVolume(){
//TODOAuto-generatedmethodstub
returnPI*Radius*Radius*Height/3;
}
@Override
publicdoublecalArea(){
//TODOAuto-generatedmethodstub
returnPI*Radius*Radius+PI*Radius*getConeLine();
}
}
publicclassShapeTestDemo{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Cylindercy=newCylinder(3,4);
System.out.println(cy.calVolume());
System.out.println(cy.calArea());
Conecone=newCone(3,4);
System.out.println(cone.calVolume());
System.out.println(cone.getConeLine());
System.out.println(cone.calArea());
}
}
‘陆’ (Java)谁能给个“面向接口编程”的例子
很简单啊,我给你一个java类库里的接口怎样啊?是一个经常用到的MouseListener:
/*
* @(#)MouseListener.java 1.17 03/12/19
*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package java.awt.event;
import java.util.EventListener;
/**
* The listener interface for receiving "interesting" mouse events
* (press, release, click, enter, and exit) on a component.
* (To track mouse moves and mouse drags, use the
* <code>MouseMotionListener</code>.)
* <P>
* The class that is interested in processing a mouse event
* either implements this interface (and all the methods it
* contains) or extends the abstract <code>MouseAdapter</code> class
* (overriding only the methods of interest).
* <P>
* The listener object created from that class is then registered with a
* component using the component's <code>addMouseListener</code>
* method. A mouse event is generated when the mouse is pressed, released
* clicked (pressed and released). A mouse event is also generated when
* the mouse cursor enters or leaves a component. When a mouse event
* occurs, the relevant method in the listener object is invoked, and
* the <code>MouseEvent</code> is passed to it.
*
* @author Carl Quinn
* @version 1.17, 12/19/03
*
* @see MouseAdapter
* @see MouseEvent
* @see <a href="http://java.sun.com/docs/books/tutorial/post1.0/ui/mouselistener.html">Tutorial: Writing a Mouse Listener</a>
* @see <a href="http://www.awl.com/cp/javaseries/jcl1_2.html">Reference: The Java Class Libraries (update file)</a>
*
* @since 1.1
*/
public interface MouseListener extends EventListener {
/**
* Invoked when the mouse button has been clicked (pressed
* and released) on a component.
*/
public void mouseClicked(MouseEvent e);
/**
* Invoked when a mouse button has been pressed on a component.
*/
public void mousePressed(MouseEvent e);
/**
* Invoked when a mouse button has been released on a component.
*/
public void mouseReleased(MouseEvent e);
/**
* Invoked when the mouse enters a component.
*/
public void mouseEntered(MouseEvent e);
/**
* Invoked when the mouse exits a component.
*/
public void mouseExited(MouseEvent e);
}
接口与类的写法差不多,这个接口放在MouseListener.java(称为一个编辑单元)里.
‘柒’ java创建接口编程怎么写代码
interface Bike{
public void radio();
}
interface Car{
public void tv();
}
interface Dt{
public void music();
}
public class InterfaceDemo implements Bike,Car,Dt{
public void radio() {
System.out.println("可以听广播");
}
public void tv() {
System.out.println("可以看电视");
}
public void music() {
System.out.println("可以听音乐");
}
public static void main(String args[])
{
InterfaceDemo m=new InterfaceDemo();
m.radio();
m.tv();
m.music();
}
}
‘捌’ Java程序设计中举例说明面向接口编程的框架和编程要点。
面向对象里面的接口只是用来描述”我们的实现类应该具体什么样的功能而不必知道对方用什么方法做到这点”,具体实现这个功能那叫“实现类”。
例子也恰恰是
Spring
里面的每个
bean
都可以当成一个组件,假设我们需要使用加密组件把一个消息写入到磁盘或发送给网络的另一方。这里面的功能性要求仅仅是“我们需要加密,双方使用相同的加密方法或标准“。那么今天我们使用一个自认为强度较高的组件,但过了5年人们发现这个加密方法在电脑性能提高后有安全隐患,我们可以通过
Spring
配置把它替换另一个加密方法的组件,这些组件也是什么完全相同的接口声明。这样你的代码不需要修改。组件的提供者已经帮我们负责测试它的组件是完全符合功能说明的。
‘玖’ java中什么是针对接口编程请举个例子(求助大神啊)
通过接口来调用一个类及其方法,而不是直接建立类实体来调用类。
比如将来你要把这个被调用的类换成一个别的实现类时,你就不用去把调用过它的类一个个改掉了,因为它们调的是接口,接口没变,在配置里把接口的实现类换成新的类,就全部都替换掉了
这就是解耦,提高可维护性
interface 动物 {
void 叫();
}
class 狗 implements 动物 {
void 叫() {
System.out.println("汪");
}
}
class 猫 implements 动物 {
void 叫() {
System.out.println("喵");
}
}
class test{
private 动物 我的宠物;
public static void main() {
我的宠物.叫();
}
}
现在你可以把我的宠物随便换成狗类或猫类都行了,main方法不用改。
针对实现编程就是
new 狗();
狗.叫();
换了猫再改一次main方法