接口的含义
在Java语言中,接口有两种意思:
●一是指概念性的接口,即指类对外提供的所有服务。类的所有能被其他程序访问的方法构成了类的接口。
●二是指用interface关键字定义的实实在在的接口,也称为接口类型。它用于明确地描述系统对外提供的所有服务,它能够更加清晰地把系统的实现细节与接口分离。
接口的声明
- 接口类型,它与抽象类表面.上有些相似,接口类型与抽象类都不能被实例化。
- 类实现接口的关键字为implements。
接口的语法规则
(1)接口中的成员变量默认都是public、static、final类型的,必须被显式初始化。并且接口中只能包含public、static、final类型的成员变量。
public interface A{
int v1; //编译出错,v1变量被看作静态常量,必须被显式初始化
protected int v2=0; //编译出错,v2变量必须是public类型
int v3=3; //合法,v3变量默认为public、static、final类型,此处public可不用写
}
(2)允许在接口中定义抽象方法,默认方法和静态方法。默认方法用default关键字来声明,拥有默认的实现。
(3)接口中的方法默认是public类型的,并且必须是public类型的。
(4)接口之间也可以继承
(5)一个类只能继承一个直接的父类,但能实现多个接口。
public class MyApplet extends JApplet implements Runnable, MouseListener{ …}
比较抽象类与接口
共同点:
都不能被实例化
都可以包含抽象方法,以及包含具体实现的方法
在语义上,都位于系统的抽象层,需要其他类来进一步提供实现细节。
区别:
接口中的成员变量和方法只能是public类型的,而抽象类中的成员变量和方法可以处于各种访问级别。抽象类比接口包含了更多的实现细节
接口中的成员变量只能是public、static和final类型的,而在抽象类中可以定义各种类型的实例变量和静态变量。
一个类只能继承一个直接的父类,这个父类有可能是抽象类;但一个类可以实现多个接口。
在语义上,接口表示更高层次的抽象,声明系统对外提供的服务。而抽象类则是各种具体类型的抽象。
instanceof操作符
instanceof操作符用于判断一个引用类型所引用的对象是否是一个类的实例。
instanceof操作符左边的操作元是一个引用类型,右边的操作元是一个类名或接口名。形式如下:
Fish fish=new Fish();
System.out.println(fish instanceof XXX); //XXX表示一个类名或接口名
广泛地讲,一个类的实例包括类本身的实例,以及所有直接或间接的子类的实例,因此当“XXX”是以下值时,instanceof表达式的值为true:
Fish类。
Fish类的直接或间接父类。
Fish类实现的接口。
操作符“==”与对象的equals()方法
==
当操作符“==”两边都是引用类型变量时,这两个引用变量必须都引用同一个对象,结果才为true。
Food fish1=new Fish();
Food fish2=new Fish();
Food fish3=fish1;
System.out.println(fish1 ==fish2); //打印false
System.out.println(fish1==fish3); //打印true
equals()
- equals()方法是在Object类中定义的方法,它的声明格式如下: public boolean equals(Object obj)
- Object类的equals()方法的比较规则为:当参数obj引用的对象与当前对象为同一个对象,就返回true,否则返回false:
public boolean equals(Object obj){
if(this==obj)return true;
else return false;
}
Food fish1=new Fish();
Food fish2=new Fish();
Food fish3=fish1;
System.out.println(fish1.equals(fish2)); //打印false
System.out.println(fish1.equals(fish3)); //打印true
3. 在JDK中有一些类覆盖了Object类的equals()方法,它们的比较规则为:如果两个对象的类型一致,并且内容一致,则返回true。这些类包括:java.io.File、java.util.Date、java.lang.String、包装类(如java.lang.Integer和java.lang.Double类等)。
String str1=new String("Hello");
String str2=new String("Hello");
System.out.println(str1==str2); //打印false
System.out.println(str1.equals(str2)); //打印true