1. 接口的引入
- 回顾猫狗案例,它们仅仅提供一些基本功能。 比如:猫钻火圈,狗跳高等功能,不是动物本身就具备的,是在后面的培养中训练出来的,这种额外的功能,java提供了接口表示。
2. 接口的特点
-
A. 接口用关键字interface修饰
interface 接口名 {}
-
B. 类实现接口用implements修饰
class 类名 implements 接口名 {}
-
C. 接口不能实例化
-
D. 接口的实现类
a : 是一个抽象类。
b : 是一个具体类,这个类必须重写接口中的所有抽象方法。
3. 接口的成员特点
-
接口名 + Impl这种格式是接口的实现类格式
class InterImpl implements Inter { }
-
A. 成员变量 : 只能是常量,并且是静态的。
默认修饰符:public static final 建议自己手动给出
-
B. 构造方法 :没有构造方法,因为主要是扩展功能的,而没有具体存在。
-
C. 成员方法 :只能是抽象的
默认修饰符:public abstract 建议自己手动给出
4. 类与类,类与接口,接口与接口的关系
-
A. 类与类
继承关系,只能单继承,可以多层继承
-
B. 类与接口
实现关系,可以单实现,也可以多实现。
还可以在继承一个类的同时,实现多个接口 -
C. 接口与接口
继承关系,可以单继承,也可以多继承
interface Father {
public abstract void show();
}
interface Mother {
public abstract void show2();
}
interface Sister extends Father,Mother {
}
//class Son implements Father,Mother // 多实现
class Son extends Object implements Father,Mother {
public void show() {
System.out.println("show son");
}
public void show2() {
System.out.println("show2 son");
}
}
class InterfaceDemo3 {
public static void main(String[] args) {
Father f = new Son();
f.show();
//f.show2(); // 报错
Mother m = new Son();
// m.show(); // 报错
m.show2();
}
}
5. 抽象类和接口的区别
-
A. 成员区别
a. 抽象类:
成员变量:可以变量,也可以常量
构造方法:有
成员方法:可以抽象,也可以非抽象b. 接口:
成员变量:只可以常量
成员方法:只可以抽象 -
B. 关系区别
a. 类与类:继承,单继承
b. 类与接口:实现,单实现,多实现
c. 接口与接口:继承,单继承,多继承
-
C. 设计理念区别
a. 抽象类被继承体现的是:" is a " 的关系。抽象类中定义的是该继承体系的共性功能。比如所有人都有姓名、年龄;都会吃饭、睡觉;但不一定都抽烟、喝酒。
b. 接口被实现体现的是:" like a " 的关系。接口中定义的是该继承体系的扩展功能。而上述的抽烟、喝酒功能,我们就用接口来实现。
6. 猫狗案例加入跳高功能
interface Jumpping {
public abstract void jump();
}
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();
public void sleep() {
System.out.println("困了都得睡觉");
}
}
class Cat extends Animal {
public Cat(){}
public Cat(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("猫吃鱼");
}
}
class Dog extends Animal {
public Dog(){}
public Dog(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("狗啃骨");
}
}
class JumpCat extends Cat implements Jumpping {
public JumpCat() {}
public JumpCat(String name,int age) {
super(name,age);
}
public void jump() {
System.out.println("跳高猫");
}
}
class JumpDog extends Dog implements Jumpping {
public JumpDog() {}
public JumpDog(String name,int age) {
super(name,age);
}
public void jump() {
System.out.println("跳高狗");
}
}
class InterfaceTest {
public static void main(String[] args) {
JumpCat jc = new JumpCat();
jc.setName("哆啦A梦");
jc.setAge(3);
System.out.println(jc.getName()+"---"+jc.getAge());
jc.eat();
jc.sleep();
jc.jump();
System.out.println("-----------------");
JumpCat jc2 = new JumpCat("大力肥猫",2);
System.out.println(jc2.getName()+"---"+jc2.getAge());
jc2.eat();
jc2.sleep();
jc2.jump();
}
}
7. 老师学生案例加入抽烟功能
interface Smoking {
public abstract void smoke();
}
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();
public void sleep() {
System.out.println("是人都得睡觉");
}
}
class Teacher extends Person {
public Teacher() {}
public Teacher(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("老师大吃红烧肉");
}
}
class Student extends Person {
public Student() {}
public Student(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("学生狂撸羊肉串");
}
}
class SmokingTeacher extends Teacher implements Smoking {
public SmokingTeacher() {}
public SmokingTeacher(String name,int age) {
super(name,age);
}
public void smoke() {
System.out.println("抽烟的老逼灯");
}
}
class SmokingStudent extends Student implements Smoking {
public SmokingStudent() {}
public SmokingStudent(String name,int age) {
super(name,age);
}
public void smoke() {
System.out.println("抽烟的小B崽");
}
}
class InterfaceTest2 {
public static void main(String[] args) {
SmokingStudent ss = new SmokingStudent();
ss.setName("徐康健");
ss.setAge(28);
System.out.println(ss.getName()+"---"+ss.getAge());
ss.eat();
ss.sleep();
ss.smoke();
System.out.println("-------------------");
// SmokingStudent ss2 = new SmokingStudent("德子",30);
SmokingTeacher st = new SmokingTeacher("德子",30);
System.out.println(st.getName()+"---"+st.getAge());
st.eat();
st.sleep();
st.smoke();
}
}
8. 运动员和教练案例
- 分析
- 代码实现
interface SpeakEnglish {
public abstract void speak();
}
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 void sleep() {
System.out.println("是人困了都得睡觉");
}
public abstract void eat();
}
abstract class Player extends Person {
public Player() {}
public Player(String name,int age) {
super(name,age);
}
public abstract void study();
}
abstract class Coach extends Person {
public Coach() {}
public Coach(String name,int age) {
super(name,age);
}
public abstract void teach();
}
class PingPangPlayer extends Player implements SpeakEnglish {
public PingPangPlayer(){}
public PingPangPlayer(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("乒乓球运动员在乒乓桌上吃火锅");
}
public void study() {
System.out.println("乒乓球运动员练习打乒乓球");
}
@Override
public void speak() {
System.out.println("乒乓球运动员讲英语");
}
// public void speak() {
// System.out.println("乒乓球运动员讲英语");
// }
}
class BasketballPlayer extends Player {
public BasketballPlayer(){}
public BasketballPlayer(String name,int age) {
super(name,age);
}
// public void eat() {
// System.out.println("不重写会报错哦亲");
// }
public void study() {
System.out.println("篮球运动员打全场");
}
@Override
public void eat() {
System.out.println("篮球运动员吃炸鸡");
}
}
class PingPangCoach extends Coach implements SpeakEnglish {
public PingPangCoach(){}
public PingPangCoach(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("刘国梁在乒乓球桌子上吃汉堡");
}
public void teach() {
System.out.println("刘国梁教队员打乒乓球");
}
public void speak() {
System.out.println("刘国梁面壁练口语");
}
}
class BasketballCoach extends Coach {
public BasketballCoach(){}
public BasketballCoach(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("李春江吃内蒙大肉串");
}
public void teach() {
System.out.println("李春江教你骂SB");
}
}
class InterfaceDemo {
public static void main(String[] args) {
PingPangPlayer ppp = new PingPangPlayer();
ppp.setName("马云");
ppp.setAge(36);
System.out.println(ppp.getName()+"---"+ppp.getAge());
ppp.eat();
ppp.sleep();
ppp.study();
ppp.speak();
System.out.println("----------------");
ppp = new PingPangPlayer("马化腾", 26);
System.out.println(ppp.getName()+"---"+ppp.getAge());
ppp.eat();
ppp.sleep();
ppp.study();
ppp.speak();
System.out.println("----------------");
BasketballPlayer bp = new BasketballPlayer();
bp.setName("姚明");
bp.setAge(39);
System.out.println(bp.getName()+"---"+bp.getAge());
bp.eat();
bp.sleep();
bp.study();
//bp.speak(); // 没有该方法
System.out.println("----------------");
PingPangCoach ppc = new PingPangCoach("刘玉栋", 66);
System.out.println(ppc.getName()+"---"+ppc.getAge());
ppc.eat();
ppc.sleep();
ppc.teach();
ppc.speak();
System.out.println("----------------");
BasketballCoach bbc = new BasketballCoach();
bbc.setAge(16);
bbc.setName("菲董的飞狗");
System.out.println(bbc.getName() + "------" + bbc.getAge());
bbc.sleep();
bbc.eat();
bbc.teach();
}
}