百度是这么说的:
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
两种含义:
一,Java接口,Java语言中存在的结构,有特定的语法和结构;
二,一个类所具有的方法的特征集合,是一种逻辑上的抽象。前者叫做“Java接口”,后者叫做“接口”。
用代码来解释什么叫接口, 需要建很多才能解释清楚了, 简单整理了一下
首先定义几个接口
public interface I_cpu { public void yunsuan(); public String getPinpai(); } public interface I_display { public void xianshi(); public String getPinpai(); } public interface I_longx extends I_cpu, I_display { public void cunchu(); public String yingpan = null; public String yingpan(); }
上面定义了三个接口, 用组装电脑来简单举个例子, 在写接口的时候要注意以下几点(非常重要)
1, 接口中只需要写方法或者属性, 方法不需要写方法体, 只需要写个public void yunsuan();这玩意就行了, 方法体在后面实体类里面写
2, 接口中定义的方法, 只能使用public和abstract来修饰, 不能使用private或是protect
3, 接口中可以定义属性, 但是定义的属性会默认有这几个关键字——Public, Final, Abstract
4, 接口中定义的属性,必须初始化, 就是必须赋初始值
5, 如果一个类引用了两个或者多个接口, 必须包含所引用接口的所有属性和方法
下面是定义的三个类, 这三个类分别是继承了接口; 继承了两个接口, 继承了一个接口, 但是这个接口又继承了两个接口:
public class Intel implements I_cpu { @Override public void yunsuan() { // TODO Auto-generated method stub System.out.println("Intel正在运算..."); } @Override public String getPinpai() { return "Intel"; } } public class AMD_Display implements I_cpu, I_display { @Override public void xianshi() { System.out.println("显示图形图像"); } @Override public void yunsuan() { System.out.println("带显卡的CPU正在运算..."); } @Override public String getPinpai() { return "CPU&DISPLAY"; } } public class Longxin implements I_longx { @Override public void yunsuan() { System.out.println("龙芯正在运算..."); } @Override public String getPinpai() { return "龙芯"; } @Override public void xianshi() { System.out.println("show picture"); } @Override public void cunchu() { System.out.println("save data"); } @Override public String yingpan() { return "冠捷硬盘"; } }
这样再写一个实现类, 就可以使用这些类和接口了
public class Run { //实现通过接口定义的方法 public static void main(String[] args) { //组装第一台电脑 Computer c1 = new Computer(); Intel cpu = new Intel(); c1.setCpu(cpu); //直接实例化赋值的叫匿名对象 c1.setDisplay(new Display()); c1.run(); System.out.println(); //组装第二台电脑 Computer c2 = new Computer(); c2.setCpu(new AMD()); c2.setDisplay(new Display()); c2.run(); System.out.println(); //组装第三台电脑 Computer c3 = new Computer(); c3.setAd(new AMD_Display()); c3.setLx(new Longxin()); c3.Run(); } }
抽象类和抽象方法
在定义类的过程中难免会遇到一种情况, 一个类里面有一个方法没法实现, 但是这个方法又不能舍弃, 这时候就可以使用抽象方法(abstract)
public abstract class Longxin implements I_longx { ...... public abstract void xianshi(); ...... }
注意: 在一个类里面, 如果有一个方法变成了抽象方法, 那么这个类也必须定义成抽象类(即加上关键字abstract)
这个抽象类再使用的时候就要用另一个类来继承它, 在另一个类里面定义这个抽象方法的方法体
public class Longxin2 extends Longxin { @Override public void xianshi() { System.out.println("Longxin2的xianshi方法"); } }
实现类中的代码改成这样, 重新实例化Longxin类, 就可以正常调用方法了
Computer c3 = new Computer(); Longxin lx = new Longxin2(); c3.setLx(lx); c3.Run();