
在java中,接口和类是并列的两个结构
JDK7以前:只能定义全局常量和抽象方法
JDK8以后:除了定义全局常量和抽象方法,还可以定义静态方法,默认方法(略)
在Java开发中,接口通过让类去实现(implements)
如果实现类覆盖了接口中所有的方法,则此实现类就可以实例化,否则此实现类仍为一个抽象类
package Interface;
public class InterfaceTest {
public static void main(String[] args) {
System.out.println(Flyable.MAX_SPEED);
plane p = new plane();
p.fly();
}
}
interface Flyable{
// 全局常量
public static final int MAX_SPEED = 7900; // 第一宇宙速度
int MIN_SPEED = 1; // public static final 书写时可以省略,但他也是全局常量
// 抽象方法
public abstract void fly();
// 省略了 public abstract
void stop();
}
class plane implements Flyable{
@Override
public void fly() {
System.out.println("飞机通过引擎起飞");
}
@Override
public void stop() {
System.out.println("驾驶员减速停止");
}
}
格式:
class AA extends BB implements CC,DD,EE
package Interface;
public class InterfaceTest {
public static void main(String[] args) {
System.out.println(Flyable.MAX_SPEED);
plane p = new plane();
p.fly();
}
}
interface Flyable{
// 全局常量
public static final int MAX_SPEED = 7900; // 第一宇宙速度
int MIN_SPEED = 1; // public static final 书写时可以省略,但他也是全局常量
// 抽象方法
public abstract void fly();
// 省略了 public abstract
void stop();
}
interface Attackable{
void attack();
}
class Bullet extends Object implements Flyable,Attackable{
@Override
public void attack() {
System.out.println("子弹攻击");
}
@Override
public void fly() {
System.out.println("子弹飞");
}
@Override
public void stop() {
System.out.println("子弹停");
}
}
interface AA{
void method1();
}
interface BB{
void method2();
}
interface CC extends AA,BB{
}
以不变应万变,不变就是规范
package Interface;
public class USBTest {
public static void main(String[] args) {
Computer com = new Computer();
// 1.创建接口的非匿名对象
Flash falsh = new Flash();
com.transferData(falsh); // 接口的多态性
// 2.创建接口的非匿名实现类的匿名对象
com.transferData(new Printer());
// 3.创建了匿名实现类的非匿名对象
USB phone = new USB(){
@Override
public void start() {
System.out.println("匿名实现类开始");
}
@Override
public void stop() {
System.out.println("匿名实现类结束");
}
};
com.transferData(phone);
// 4.创建了接口的匿名实现类的匿名对象
com.transferData(new USB(){
@Override
public void start() {
System.out.println("匿名实现类开始");
}
@Override
public void stop() {
System.out.println("匿名实现类结束");
}
});
}
}
interface USB{
// 定义了长宽高 ,最大最小传播速度等
void start();
void stop();
}
class Computer{
public void transferData(USB usb){
usb.start();
System.out.println("具体的传输细节");
usb.stop();
}
}
class Flash implements USB{
@Override
public void start() {
System.out.println("U盘开启工作");
}
@Override
public void stop() {
System.out.println("U盘结束工作");
}
}
class Printer implements USB{
@Override
public void start() {
System.out.println("打印机开始工作");
}
@Override
public void stop() {
System.out.println("打印机结束工作");
}
}
package Interface;
public class NetworkTest {
public static void main(String[] args) {
Server server = new Server();
ProxyServer proxyServer = new ProxyServer(server);
proxyServer.browse();
}
}
interface Nerwork{
public void browse();
}
// 被代理类
class Server implements Nerwork{
@Override
public void browse() {
System.out.println("真实的服务器访问网络");
}
}
// 代理类
class ProxyServer implements Nerwork{
private Nerwork work;
public ProxyServer(Nerwork work){
this.work = work;
}
public void check(){
System.out.println("联网之前的检查工作");
}
@Override
public void browse() {
check();
work.browse();
}
}
还可以定义静态方法和默认方法
如果子类中重写了,但想调用接口的被重写的方法,如下
CompareA(接口名).super.方法名
CompareA 文件
package Interface;
public interface CompareA {
public static void method1(){
System.out.println("CompareA.北京");
}
public default void method2(){
System.out.println("CompareA.上海");
}
}
SubClassTest 文件
package Interface;
public class SubClassTest {
public static void main(String[] args) {
SubClass s = new SubClass();
CompareA.method1();//接口中定义的静态方法,只能接口来调
s.method2(); //通过实现类的对象,可以调用接口中的默认方法
}
}
class SubClass implements CompareA{
public void method2(){
System.out.println("重写method2");
}
}