java接口学习例子

你应该知道接口是一种契约,它与实现方式无关

但是类,即使是抽象类,你都能自定义成员变量,而成员变量往往就与实现方式有关。

这一点的实际意义不大。

但是有一点,类会暴露太多不必要,甚至不能暴露的东西,你看一下java.util中,大部分的数据结构,都被设计成了接口
-抽象类-最后实际类

例如Collection
-List
     L
-AbstractCollection
       L
-AbstractList
         L
-ArrayList

但是有一个,由于历史原因,被设计成了类,比如Stack 
extends Vector,
你应该知道Stack的数据访问模式,就只能是LIFO,但是Vector是一个List,可以随机访问,可以任意增减。

结果Stack s 
= new Stack();

不光能够pop
/push/peer还能add,get,set,remove

如果你用一个接口IStack 里面只有pop
/push/peer方法,然后仍然通过继承Vector的方式实现,

IStack s 
= new MyStack();

此时,就无法add,get,set,remove

举个生动一点的例子

public interface BritishSpy {
  
public String speak(); //英国间谍讲英语
}


public interface GermanSpy {
  
public String sprechen(); //德国间谍讲德语
}


public class DoubleAgent implements BritishSpy, GermanSpy {
  
public String speak() return "Hello"; }
  
public String sprechen() return "Gutentag"; }
}


public class Agency {
  
public static void toMI5(BritishSpy spy) {
    
//军情5处当然只能说英语,做英国间谍
    spy.speak();
    
//spy.sprechen();不可见
  }


  
public static void inGermany(GermanSpy spy) {
    
//spy.speak();不可见
    spy.sprechen();
  }


  
public static void main(String[] args) {
    DoubleAgent da 
= new DoubleAgent();
    BritishSpy es 
= (BritishSpy) da;
    GermanSpy gs 
= (GermanSpy) da;
    toMI5(da); 
//MI5也不知道他是一个双重间谍,只知道他是BritishSpy
    toMI5(es); //更安全
    
//toMI5(gs); 不可能
    inGermany(da); //在德国还是安全的,德国人不知道他的双重间谍身份,只知道他是GermanSpy
    inGermany(gs); 
    
//inGermany(es); 不可能
  }

}


假设你只用class,因为不能多重继承,所以,speak()
/sprechen()比然声明在同一个class里面


public abstract class DoubleAgent extends Spy/**(略...)*/ {
  
public abstract String speak();
  
public abstract String sprechen();
}


public class PoorDoubleAgent {
  
public String speak() return "Hello"; }
  
public String sprechen() return "Gutentag"; }
}


晚了,不管你PoorDoubleAgent a 
= new PoorDoubleAgent();还是DoubleAgent a = new PoorDoubleAgent();,全世界都知道他是一个双重间谍,他到哪里都必死无疑
前面举了一个关于“安全性”方面的例子

接口只暴露给对方(比如Agent的军情5处方法)它所需要的足够信息,其他无关的,甚至有害的信息不会暴露给对方。因为,我传给你的是接口类型,我除了是这个接口(和这个接口的父接口,inteface A 
extends B, C)的实例外,你顶多知道我是一个Object(不是int:P),其他的姓甚名谁,哪里住址,父母安好,兄妹几何都与你无关,我们只需要关心我们签订的合同(接口)

再举一个有关灵活性方面的例子

假设某公司已经有一个更新过N代的,逻辑复杂无比
public class A extends B /** where b extends c, c extends d and so on... */ {
  
public void init() {...}
  
public void release() {...}
  
public String doXXX() {...}
  
public String doYYY() {...}
}


而这个A又被很多类继承或使用,doXXX
/doYYY 方法已经无法更改

假设现在这个公司要参加某个标准化组织,而这个组织要求所有提供这样的方法

String getXXX(); String getYYY();

加入用接口标准化组织只要规定成员们都实现
public interface IBusiness {
  String getXXX(); 
  String getYYY();
}

而这个公司只需要稍微改写一点点即可
public class A extends B /** where b extends c, c extends d and so on... */ 
  
implements IBusiness {
  
public String getXXX() return doXXX(); }
  
public String getYYY() return doYYY(); }

//保留
  public void init() {...}
  
public void release() {...}
  
public String doXXX() {...}
  
public String doYYY() {...}
}


这样既满足了标准化的要求,又满足了无需修改原来继承A或者使用A的无数个class(有些可能在用户那里,不可能更改)

假如不用接口,你有两个选择:数典忘祖或者自绝于人

数典忘祖:
你的新A必须继承标准化组织的Business,原来a,b, c d...里面的代码全部得重新组织到这个新的A里面,与此同时,那些调用或者继承A的class难保不需要重写

自绝于人
原来的就让它去,谁也别再提它了,我们以后就用新的NewA,结果,你的新客户倒是满足了标准化,你的老客户可就 :
< :@ :$,而且以后需要维护A和NewA
定义接口:
interface Fight{
    
void fight();
}


肥肥和瘦瘦去实现这个接口:
class FatFat implements Fight{
    
public void fight(){
        System.out.println(
"FatFat 打人很痛!");
    }

}


class ThinThin implements Fight{
    
public void fight(){
        System.out.println(
"ThinThin 打人一点都不痛!!哈哈。");
    }

}


然后你可能会这另一个类中使用到FatFat和ThinThin的对象,然后都去执行fight,但是你可能不到运行时就不会知道是具体的那个类的对象,这是你就感谢他们都实现了Fight接口,你可以向上转型,然后通过运行时的多态产生你想要的行为。

Fight a
=new FatFat();
Fight b
=new ThinThin();
a.fight();
b.fight();
这样就会执行不同的动作。

或者如果你有一个方法
f(Fight i)
{
   i.fight();
}


如果c是实现了Fight接口的其中一个类,那么你就可以这样使用这个方法:
f(c);
你不需要知道c究竟是什么对象(不管是FatFat还是ThinThin),你都可以得到你想要的fight动作。


 
<think>好的,我现在需要帮用户找到Java中实现接口示例代码。首先,我要回忆一下用户提供的引用内容,看看里面有没有相关的例子。引用3提到了一个LearningJava类实现了SlamDunk、Crossover、Shot接口,看起来是一个示例。另外引用5也提到了ShapeInterface接口和Rectangle、Triangle类的实现。这些都是可能的示例。 接下来,用户需要的是具体的代码示例,所以我要确保给出的代码符合Java语法,并且正确展示接口的定义和实现。根据引用2,接口用于描述抽象,支持多继承,所以示例中可能需要展示多个接口的实现。 用户可能不太清楚接口和抽象类的区别,所以在解释的时候需要提到这一点,比如接口中的变量默认是public static final,而抽象类可以有非final变量。这也是引用2中提到的内容。 然后,我需要检查是否有其他引用内容相关。引用1提到List接口的实现类,比如ArrayList,但用户可能更需要自定义接口的实现,而不是Java内置接口。所以主要参考引用3和5的示例。 现在,我需要构造一个简单明了的示例。比如定义一个Shape接口,然后让Circle和Rectangle类实现它。接口中可以包含方法声明,如calculateArea()和display(),然后在实现类中具体实现这些方法。 另外,引用3中的示例用了多个接口,比如SlamDunk,这可能展示一个类实现多个接口的情况,这也是Java接口的优势之一。所以可以考虑在示例中包含多个接口的实现,比如Movable和Drawable接口,然后由Player类同时实现它们。 需要确保代码正确,比如接口方法在实现类中被正确重写,使用implements关键字,以及方法的可见性为public。同时,可以提到接口的默认方法和静态方法,这是Java 8后的特性,但可能对用户来说稍微高级,不过可以简要说明以展示更多功能。 最后,根据用户的问题生成相关的问题,比如接口与抽象类的区别、多个接口的实现等,这样可以帮助用户进一步学习。这些问题需要基于引用内容,比如引用2中提到的接口与抽象类的区别,所以相关问题可以包括这个点。 总结步骤: 1. 定义一个接口,如Shape,包含方法声明。 2. 创建实现类Circle和Rectangle,实现这些方法。 3. 展示多接口实现的例子,如Movable和Drawable。 4. 提供主类示例,演示如何使用接口实现多态。 5. 解释接口的特性和注意事项,如变量默认public static final。 6. 生成相关问题,引导用户深入学习。 需要确保代码格式正确,使用中文注释,并且符合用户要求的系统级指令,如数学公式的正确使用,但这个问题中可能不太涉及数学内容,所以主要关注代码和解释的结构。同时,检查引用是否正确,比如引用3和5的相关内容是否被正确引用到示例中。</think>### Java 接口实现示例代码 #### 基础接口定义 ```java // 定义接口 interface Shape { double calculateArea(); // 抽象方法 default void display() { // 默认方法(Java 8+) System.out.println("图形信息"); } static String getType() { // 静态方法(Java 8+) return "几何图形"; } } ``` #### 实现接口的类 ```java // 实现类1 class Circle implements Shape { private double radius; public Circle(double radius) { this.radius = radius; } @Override public double calculateArea() { return Math.PI * radius * radius; // 圆面积公式$S=πr^2$ } } // 实现类2 class Rectangle implements Shape { private double width; private double height; public Rectangle(double w, double h) { this.width = w; this.height = h; } @Override public double calculateArea() { return width * height; // 矩形面积公式$S=ab$ } } ``` #### 多接口实现示例 ```java // 定义第二个接口 interface Movable { void move(int deltaX, int deltaY); } // 实现多接口 class DynamicShape implements Shape, Movable { private double x, y; @Override public double calculateArea() { return 0; } @Override public void move(int dx, int dy) { x += dx; y += dy; } } ``` #### 使用示例 ```java public class Main { public static void main(String[] args) { Shape circle = new Circle(5.0); System.out.println("圆面积: " + circle.calculateArea()); // 输出$78.5398...$ Shape[] shapes = new Shape[]{ new Circle(3), new Rectangle(4,5) }; for (Shape s : shapes) { System.out.println(s.calculateArea()); // 多态调用 } } } ``` ### 关键特性说明 1. **接口方法** - 必须实现所有抽象方法(除默认方法) - 默认方法(`default`)可直接继承[^2] - 静态方法通过接口名调用(如`Shape.getType()`) 2. **变量特性** 接口中定义的变量默认为`public static final`,例如: ```java interface Config { int MAX_SIZE = 100; // 等同于public static final int MAX_SIZE = 100 } ``` 3. **多继承支持** 类可以实现多个接口,如`class A implements B, C`[^3]
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值