接口概述
接口就是一种公共的规范标准 ,只要符合规范标准,大家都可以通用
Java中的接口更多的体现在
接口的特点
接口用关键字interface修饰
类实现接口用implements表示
public class 类名 implements接口名{}
接口不能实例化
接口如何实现实例化:参照多态的方式,通过实现类对象实例化,这叫接口多态
多态的形式:具体类多态,抽象类多态,接口多态
多态的前提:有继承或者实现关系;有方法重写;有父(类/接口)引用指向(子/实现)类对象
接口的实现类
代码
1 2 3 4 5 6 7 8 package unit_15jiekou.test1;public interface Jumpping { public abstract void jump () ;
1 2 3 4 5 6 7 8 9 10 11 package unit_15jiekou.test1;public class Cat implements Jumpping { @Override public void jump () { System.out.println("猫可以跳了" ); } }
1 2 3 4 5 6 package unit_15jiekou.test1;public abstract class Dog implements Jumpping {}
1 2 3 4 5 6 7 8 9 10 11 12 13 package unit_15jiekou.test1;public class JumppingDemo { public static void main (String[] args) { Jumpping j = new Cat(); j.jump(); } }
接口的成员特点
成员变量
只能是常量
默认修饰符:public static final
构造方法
接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在
一个类如果没有父类,默认继承自Object类
成员方法
只能是抽象方法
默认修饰符:public abstract
关于接口中的方法,JDK8和JDK9中有一些新特性,后面在讲解
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 package unit_15jiekou.test2;public class InterfaceDemo { public static void main (String[] args) { Inter i = new InterImpl(); System.out.println(i.num); System.out.println(i.num2); System.out.println(Inter.num); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package unit_15jiekou.test2;public interface Inter { public int num = 10 ; public final int num2 = 20 ; int num3 = 30 ; public abstract void method () ; void show () ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package unit_15jiekou.test2; public class InterImpl extends Object implements Inter { public InterImpl () { super (); } @Override public void method () { System.out.println("重写方法" ); } @Override public void show () { System.out.println("show方法" ); } }
案例:猫和狗
需求:对猫和狗进行训练,他们就可以跳高了,这里加入了跳高功能。请采用抽象类和接口类来实现猫狗案例并在测试类中进行测试
思路:
定义接口(Jumpping)
定义抽象动物类(Animal)
成员变量:姓名,年龄;
构造方法:无参,带参;
成员方法:get/set方法,吃饭();
定义具体猫类(Cat),继承动物类,实现跳高接口
构造方法:无参,带参;
成员方法:重写吃饭(){…},重写跳高方法(){…}
定义具体狗类(Dog),继承动物类,实现跳高接口
构造方法:无参,带参;
成员方法:重写吃饭(){…},重写跳高方法(){}
定义测试类(AnimalDemo),写代码测试
代码
1 2 3 4 5 6 7 package unit_15jiekou.test3anli;public interface Jumpping { public abstract void Jump () ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 package unit_15jiekou.test3anli;public abstract class Animal { private String name; private int age; public Animal () { } public Animal (String name, int age) { this .name = name; this .age = age; } public String getName () { return name; } public void setName (String name) { this .name = name; } public int getAge () { return age; } public void setAge (int age) { this .age = age; } public abstract void eat () ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package unit_15jiekou.test3anli;public class Cat extends Animal implements Jumpping { public Cat () { } public Cat (String name, int age) { super (name, age); } @Override public void eat () { System.out.println("猫吃鱼" ); } @Override public void Jump () { System.out.println("猫可以跳了" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 package unit_15jiekou.test3anli;public class AnimalDemo { public static void main (String[] args) { Jumpping j = new Cat(); j.Jump(); System.out.println("--------------" ); Animal a = new Cat(); a.setName("巧克力" ); a.setAge(5 ); System.out.println(a.getName()+"," +a.getAge()); a.eat(); a = new Cat("巧克力" ,5 ); System.out.println(a.getName()+"," +a.getAge()); a.eat(); System.out.println("--------------" ); Cat c = new Cat(); c.setName("巧克力" ); c.setAge(5 ); System.out.println(c.getName()+"," +c.getAge()); c.eat(); c.Jump(); } }
类和接口的关系
类和类的关系
类和接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
接口和接口的关系
1 2 3 4 5 pubic class InterImpl extends Object implements Inter1 ,Inter2 ,Inter3 { }
1 2 3 4 5 public interface Inter3 extends Inter1 ,Inter2 {}
抽象类和接口的区别
成员区别
抽象类:变量,常量;有构造方法;由抽象方法,也有非抽象方法
接口:常量;抽象方法
关系区别
类与类:继承,单继承
类与接口:实现,可以单实现,也可以多实现
接口与接口:继承,单继承,多继承
设计理念区别
抽象类:对类抽象,包括属性,行为
接口:对行为抽象,主要是行为
门和警报的例子
门都能开和关,有的门能报警,如果设计
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public interface Alram { void alarm () ; } public abstract class Door { public abstract void open () ; public abstract void close () ; } public class AlarmDoor extends Door implements Alarm { public void open () { } public void close () { } public void alarm () { } }
再次强调,抽象类是对事物的抽象,而接口是对行为的抽象
案例:运动员和教练
需求:我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。为了出关交流,跟乒乓球相关的人员都需要学习英语。请用所学知识分析,这个案例中有哪些具体类,那些抽象类,那些接口,并用代码实现
分析:从具体到抽象
实现:从抽象到具体
使用:使用的是具体的类的对象
思路:
定义说英语接口
定义抽象人类
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:get/set方法,吃饭();
定义抽象教练类,继承人类
定义抽象运动员类,继承人类
定义具体篮球教练类,继承教练类
构造方法:无参,带参
成员方法:重写吃饭(){…},重写教(){…}
定义具体乒乓球教练类,继承教练类,实现说英语接口
构造方法:无参,带参
成员方法:重写吃饭(){…},重写教(){…},重写说英语(){…}
定义具体篮球运动员类,继承远动员类
构造方法:无参,带参
成员方法:重写吃饭(){…},重写学习(){…}
定义具体乒乓球运动员类,继承运动员类,实现说英语接口
构造方法:无参,带参
成员方法:重写吃饭(){…},重写学习(){…},重写说英语(){…}
定义测试类,写代码测试
代码
1 2 3 4 5 6 7 package unit_15jiekou.test4anli;public interface SpeakEnglish { public abstract void speak () ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 package unit_15jiekou.test4anli;public abstract class Person { private String name; private int age; public Person () { } public Person (String name, int age) { this .name = name; this .age = age; } public String getName () { return name; } public void setName (String name) { this .name = name; } public int getAge () { return age; } public void setAge (int age) { this .age = age; } public abstract void eat () ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 package unit_15jiekou.test4anli;public abstract class Coach extends Person { public Coach () { } public Coach (String name, int age) { super (name, age); } public abstract void teach () ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 package unit_15jiekou.test4anli;public abstract class Player extends Person { public Player () { } public Player (String name, int age) { super (name, age); } public abstract void study () ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package unit_15jiekou.test4anli;public class BasketballCoach extends Coach { public BasketballCoach () { } public BasketballCoach (String name, int age) { super (name, age); } @Override public void teach () { System.out.println("篮球教练教篮球" ); } @Override public void eat () { System.out.println("篮球教练吃篮球" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package unit_15jiekou.test4anli;public class PingPangCoach extends Coach implements SpeakEnglish { public PingPangCoach () { } public PingPangCoach (String name, int age) { super (name, age); } @Override public void teach () { System.out.println("乒乓球教练教乒乓球" ); } @Override public void eat () { System.out.println("乒乓球教练吃乒乓球" ); } @Override public void speak () { System.out.println("乒乓球教练说英语" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package unit_15jiekou.test4anli;public class BasketballPlayer extends Player { public BasketballPlayer () { } public BasketballPlayer (String name, int age) { super (name, age); } @Override public void study () { System.out.println("篮球运动员学篮球" ); } @Override public void eat () { System.out.println("篮球运动员吃小篮球" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package unit_15jiekou.test4anli;public class PingPangPlayer extends Player implements SpeakEnglish { public PingPangPlayer () { } public PingPangPlayer (String name, int age) { super (name, age); } @Override public void study () { System.out.println("乒乓球运动员学乒乓球" ); } @Override public void eat () { System.out.println("乒乓球运动员吃小乒乓球" ); } @Override public void speak () { System.out.println("乒乓球运动员说英语" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package unit_15jiekou.test4anli;public class PersonDemo { public static void main (String[] args) { PingPangPlayer ppp = new PingPangPlayer(); ppp.setName("马龙" ); ppp.setAge(40 ); System.out.println(ppp.getName()+"," +ppp.getAge()); PingPangPlayer ppp1 = new PingPangPlayer("樊振东" ,20 ); System.out.println(ppp1.getName()+"," +ppp1.getAge()); ppp.eat(); ppp.study(); ppp.speak(); System.out.println("------------------" ); BasketballPlayer bp = new BasketballPlayer(); bp.setName("詹姆斯" ); bp.setAge(50 ); System.out.println(bp.getName()+"," +bp.getAge()); bp.eat(); bp.study(); } }