您的位置:首页 > 编程语言 > Java开发

java接口interface

2016-11-23 17:33 218 查看
代码

package Interface;

public class InterfaceDemo {
public static void main(String[] args) {
//System.out.println(IAbility.number);
//System.out.println(IAbility.number++);
//The final field IAbility.number cannot be assigned赋值

Person person=new Person();
IAbility iability1=new Child();
IAbility iability2=new Dog();

person.feed(iability1);
person.feed(iability2);
if(iability1 instanceof Child){
Child children = (Child)iability1;
children.hhh();
}

Dog dog = new Dog();
Child child = new Child();
person.feed(dog);
person.feed(child);

}
}

class Person{
/*
public void feed(Child child){
child.eat();
}

public void feed(Dog dog){
dog.eat();
}*/
//interface
public void feed(IAbility ability){
ability.eat();//dongtai bangding
}
}

interface IAbility{
//public static final int number = 1;//int  number = 1;default number is public static final
/*public abstract*//* void show();*///void show();default is public abstract
public abstract void eat();
}
class Child implements IAbility{
@Override
public void eat(){
System.out.println("eat rice");
}
public void hhh(){
System.out.println("nihao");
}
}

class Dog implements IAbility{
@Override
public void eat(){
System.out.println("eat bone");
}
}


interface Action{
int number = 1;//public static final int number = 1;
/*两个意思是一样的*/
public void eat();/*public abstract void eat();*/
}
/*为什么用到interface,因为child和dog类并没有特定的父类,而他们的方法可以通过接口实现*/


1.子类在选择抽象类还是接口,是抽象类是一种is-a,而接口是like-a

2.子类可以有多个接口(extends),但只有一个父类(普通类或抽象类)(implements)

以下 是来自一个大佬的对abstract class和interface深入理解

大佬的理解

/*目的:安全门*/
1.
abstract class Door {
abstract void open();
abstract void close();
abstract void alarm();
}
class AlarmDoor extends Door {
void open() { … }
void close() { … }
void alarm() { … }
}
2.interface Door {
void open();
void close();
void alarm();
}
class AlarmDoor implements Door {
void open() { … }
void close() { … }
void alarm() { … }
}
这种方法违反了面向对象设计中的一个核心原则ISP(Interface Segregation Priciple),在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变(比如:修改alarm方法的参数)而改变,反之依然。
//---------------------------------------------------------
//以下是正确的
/*既然open、close和alarm属于两个不同的概念,根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有:这两个概念都使用abstract class方式定义;两个概念都使用interface方式定义;一个概念使用abstract class方式定义,另一个概念使用interface方式定义。
显然,由于Java语言不支持多重继承,所以两个概念都使用abstract class方式定义是不可行的。后面两种方式都是可行的,但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。我们一一来分析、说明。
如果两个概念都使用interface方式来定义,那么就反映出两个问题:1、我们可能没有理解清楚问题领域,AlarmDoor在概念本质上到底是Door还是报警器?2、如果我们对于问题领域的理解没有问题,比如:我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的,那么我们在实现时就没有能够正确的揭示我们的设计意图,因为在这两个概念的定义上(均使用interface方式定义)反映不出上述含义。
如果我们对于问题领域的理解是:AlarmDoor在概念本质上是Door,同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢?前面已经说过,abstract class在Java语言中表示一种继承关系,而继承关系在本质上是"is a"关系。所以对于Door这个概念,我们应该使用abstarct class方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行为,所以报警概念可以通过interface方式定义。如下所示:*/
abstract class Door {
abstract void open();
abstract void close();
}
interface Alarm {
void alarm();
}
class AlarmDoor extends Door implements Alarm {
void open() { … }
void close() { … }
void alarm() { … }
}
/*这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。其实abstract class表示的是"is a"关系,interface表示的是"like a"关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的,比如:如果我们认为AlarmDoor在概念本质上是报警器,同时又具有Door的功能,那么上述的定义方式就要反过来了。*/


abstract class和interface是Java语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。这其实也是语言的一种的惯用法,希望读者朋友能够细细体会。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java