开发中有时必须从几个类中派生出一个子类,继承它们所有的属性和方 法。但是,Java不支持多重继承。接口,就可以得到多重继承的效果。解决了java类单继承的局限问题。接口的本质是契约,标准,规范。制定好后大家都 要遵守。
接口是由全局常量和公共的抽象方法组成的(JDK1.7以及之前的版本)。
接口和类是并列关系,或者可以理解为一种特殊的类。从本质上讲, 接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义 (JDK7.0及之前),而没有变量和方法的实现。
接口的定义格式:
public interface 接口名称{
全局常量;
抽象方法;’
}
实例1:
Interface A{
public static final String NAME=”齐老师”;
public abstract void print();
public abstract String getInfo();
}
实例2:
Interface A{
String NAME=”齐老师”;//相当于public static final String NAME=”齐老师”;
void print();//相当于public abstract void print();
String getInfo();//相当于public abstract String getInfo();
}
※注意:
用interface来定义。
在接口中如果不写public,则也是public访问权限。
在很多的java程序中,经常看到编写接口时省略了public ,也许有人认为它的访问权限是default,实际是这是错误的,不管写与不写,接口中的方法永远是public。
接口中没有构造器。
接口采用多继承机制。
接口的实现:
实例:
interface A{
public static final String NAME=”齐老师”;
public abstract void print();
public abstract String getInfo();
}
interface B{
public void say();
}
class X implements A,B{
//实现接口A中的print()方法
public void print(){
System.out.print(“名称:”+NAME);
}
//实现接口A中的getInfo方法
public String getInfo(){
return “Hello”;
}
//实现接口B中的say()方法
public void say(){
System.out.print(“Hello world”);
}
}
public class InterfaceDemo{
public static void main(String[] args){
X x= new X();
x.say();
x.print();
}
}
继承类且实现接口:
定义Java类的语法格式:先写extends,后写implements
一个类可以实现多个接口,接口也可以继承其它接口。
实现接口的类中必须提供接口中所有方法的具体实现内容,方可实 例化。否则,仍为抽象类。
与继承关系类似,接口与实现类之间存在多态性 。
格式:class 子类 extends 类 implements 接口A, 接口B,……{}
实例:
interface A{
public static final String NAME="齐老师";
public abstract void print();
public abstract String getInfo();
}
abstract class B{
public abstract void say();
}
// 类 继承 B抽象类,且实现 接口A
class X extends B implements A{
//实现接口A中的print()方法
public void print(){
System.out.println("名称:"+NAME);
}
//实现接口A中的getInfo()方法
public String getInfo(){
return "Hello";
}
//实现抽象类B中的sa()方法
public void say(){
System.out.println("Hello world");
}
}
public class InterfaceDemo1{
public static void main(String[] args){
X x= new X();
x.say();
x.print();
}
}
接口的其它应用方式
实例:创建接口A 的匿名实现类非匿名对象
package com.qwy;
public class TestInterface {
public static void main(String[] args) {
//创建接口A 的匿名实现类非匿名对象
A a= new A(){
public void a() {
System.out.println("TestInterface.main(...).new A() {...}.a()");
}
};
//调用a接口的对象
a.a();
}
}
interface A{
void a();
}
实例:创建了接口的匿名实现类的匿名对象
package com.qwy;
public class TestInterface {
public static void main(String[] args) {
Person person= new Person();
//创建了接口的匿名实现类的匿名对象
person.run(new A(){
@Override
public void a() {
System.out.println("TestInterface.main(...).new A() {...}.a()");
}
});
}
}
class Person{
void run(A a){
a.a();
};
}
interface A{
void a();
}
实例:接口的非匿名实现类的非匿名对象(常用)
package com.qwy;
public class TestInterface {
public static void main(String[] args) {
A person= new Person();
//创建了接口的非匿名实现类的非匿名对象
person.a();
}
}
class Person implements A{
@Override
public void a() {
System.out.println("Person.a()");
}
}
interface A{
void a();
}
这里没有遵循java中标识符定义规范,只是为了说明问题,大家见谅。