1、接口:
(1)句定义格式:接口使用关键:interface表示
interface 接口名{}
(2)接口是如何实现的呢?
接口不能直接实例化
那么接口如何去表示呢?
这里需要另外一个关键字供其他类实现该接口:implements
使用多态的形式进行实现,由具体的子类进行实例化,其实这是多态的一种,叫做接口多态。
(3)也可以用一个抽象类去实现
现在我们将猫狗案例加入钻火圈的功能改写。
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();
}
class Cat extends Animal{
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("🐱吃🐟");
}
}
//定义一个钻火圈的接口
interface ZuanHuoQuan{
void zuanHuo();
}
class TrainCat extends Cat implements ZuanHuoQuan{
@Override
public void zuanHuo() {
System.out.println("猫钻火圈");
}
}
public class InterfaceDemo1 {
public static void main(String[] args) {
//定义出了一个会钻火圈的猫
Cat c = new TrainCat();
TrainCat tc = (TrainCat) c;
tc.zuanHuo();
}
}
2、 接口中成员的特点:
(1)成员变量:
只能是常量,并且是静态的
JVM在真正运行之前会自动补齐修饰符:public static final
建议:在学习阶段手动补齐,在开发阶段,省略不写。
(2)构造方法:
接口中没有构造方法。
(3)成员方法:
接口中的方法只能是抽象方法,没有方法体,连大括号都没有
JVM在真正运行之前会自动补齐修饰符:public abstract
建议:在学习阶段手动补齐,在开发阶段,省略不写。
(4)注意:
a、当一个具体的类实现接口的时候,必须实现接口中所有的抽象方法
b、当一个抽象类实现接口的时候,可以选择不实现接口中的方法,也可以选择性的实现
c、接口与接口之间什么关系呢?
interface Inter{
public static final int a = 10;
// Inter(){}
//java: 接口抽象方法不能带有主体
// public void fun(){
// System.out.println("玩游戏");
// }
public abstract void fun();
public abstract void fun2();
}
//虽然接口中没有构造方法,但是多态初始化的时候会先初始化父类再初始化子类
//这里其实继承了一个父类
//java中所有的类都有一个父类叫做Object
//每一个class都有Object作为父类
//那么所有继承Object类的子类都拥有了父类Object类中的方法
class Demo extends Object implements Inter{
@Override
public void fun() {
System.out.println("Demo类中实现玩游戏方法");
}
@Override
public void fun2() {
System.out.println("Demo类中实现玩游戏方法2");
}
}
abstract class Demo2 implements Inter{
@Override
public void fun() {
System.out.println("抽象类中实现接口抽象方法");
}
}
public class InterfaceDemo2 {
public static void main(String[] args) {
Inter i = new Demo();
System.out.println(i.a);
// java: 无法为最终变量a分配值
// i.a = 100;
System.out.println(Inter.a);
i.fun();
}
}
3、类与类,类与接口,接口与接口的关系
类与类:
存在继承关系,只能进行单继承,不可以进行多继承,但是可以是多层继承
类与接口:
实现关系,可以是单实现,也可以是一次性实现多个接口,也可以在继承一个类的同时,实现多个接口
接口与接口:
存在的是继承关系,可以进行单继承,也可以进行多继承
interface Inter2{}
interface Inter3{}
interface Inter4 extends Inter2,Inter3{}
class Demo3 extends Object implements Inter2,Inter3{}
public class InterfaceDemo3 {
}
4、猫狗案例:加入跳高的功能
分析:
猫:
属性:姓名,年龄
行为:吃饭,睡觉
狗:
属性:姓名,年龄
行为:吃饭,睡觉
由于猫和狗存在共性,所以我们提取出来到一个新的类中
动物:(抽象类)
属性:姓名,年龄
行为:吃饭(),睡觉()
猫:继承自动物
狗:继承自动物
由于跳高是一个额外的功能,不是动物特有的,所以我们利用接口的方式去定义
接口:
跳高
部分的猫:实现接口
部分的狗:实现接口
abstract class Animal4{
private String name;
private int age;
public Animal4() {
}
public Animal4(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 abstract void sleep();
}
class Cat4 extends Animal4{
public Cat4() {
}
public Cat4(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("猫吃🐟");
}
@Override
public void sleep() {
System.out.println("猫蜷着睡");
}
}
class Dog4 extends Animal4{
public Dog4() {
}
public Dog4(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("狗吃肉");
}
@Override
public void sleep() {
System.out.println("狗侧着睡");
}
}
interface Jump{
public abstract void jump();
}
//定义部分的会跳高的猫
class JumpCat extends Cat4 implements Jump{
public JumpCat() {
}
public JumpCat(String name, int age) {
super(name, age);
}
@Override
public void jump() {
System.out.println("猫跳高");
}
}
//定义会跳高的狗
class JumpDog extends Dog4 implements Jump{
public JumpDog() {
}
public JumpDog(String name, int age) {
super(name, age);
}
@Override
public void jump() {
System.out.println("狗跳高");
}
}
public class InterfaceDemo4 {
public static void main(String[] args) {
//创建一个不会跳高的狗
Animal4 a1 = new Dog4("小白",2);
a1.eat();
a1.sleep();
//创建一个会跳高的狗
//抽象多态
Dog4 d1 = new JumpDog("大白",3);
d1.eat();
d1.sleep();
((JumpDog) d1).jump();
//接口多态
Jump j1 = new JumpDog("小黑",4);
j1.jump();
}
}
5、老师和学生案例,加入抽烟的额外功能
分析:
老师:
属性:姓名,年龄
行为:吃饭,睡觉
学生:
属性:姓名,年龄
行为:吃饭,睡觉
由于老师和学生有着共性内容,提取出来一个抽象类
人:(抽象类)
属性:姓名,年龄
行为:吃饭(),睡觉()
由于不是所有的老师和学生都抽烟,只有部分的老师和学生会
所以,我们将抽烟定义为一个接口
部分的老师:实现抽烟接口
部分的学生:实现抽烟的接口
//抽烟的接口
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);
}
@Override
public void eat() {
System.out.println("老师喝粥");
}
}
class Student extends Person{
public Student() {
}
public Student(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("学生吃牛肉");
}
}
class SmokeTeacher extends Teacher implements Smoking{
public SmokeTeacher() {
}
public SmokeTeacher(String name, int age) {
super(name, age);
}
@Override
public void smoke() {
System.out.println("老师抽烟");
}
}
class SmokeStudent extends Student implements Smoking{
public SmokeStudent() {
}
public SmokeStudent(String name, int age) {
super(name, age);
}
@Override
public void smoke() {
System.out.println("学生抽烟");
}
}
public class InterfaceDemo5 {
public static void main(String[] args) {
//创建一个不抽烟的学生对象
Person p1 = new Student("阿杰",18);
p1.eat();
p1.sleep();
//ClassCastException
// ((SmokeStudent)p1).smoke();
//创建一个抽烟的学生对象
Person p2 = new SmokeStudent("阿豪",17);
p2.eat();
p2.sleep();
((SmokeStudent) p2).smoke();
}
}
6、教练和运动员案例(学生分析然后讲解)
乒乓球运动员和篮球运动员。
乒乓球教练和篮球教练。
为了出国交流,跟乒乓球相关的人员都需要学习英语。
请用所学知识:
分析,这个案例中有哪些抽象类,哪些接口,哪些具体类。
分析:
由于这个题较为复杂,我们在使用IDEA写代码的时候可以归一归类。
通常情况下,常见会4层:
bean: 一般存放的是将来要new的实体类
controller: 一般是数据的入口类
dao: 具体对数据做操作的地方,放在dao层,这一层一般情况下,都是对数据库做操作的
service: 一般在这里面放的是接口,和实现类。
具体代码如下:
(1)bean中代码:
Person:
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 void show() {
System.out.println("姓名:" + name + ",年龄:" + age);
}
}
CoachMan:
public abstract class CoachMan extends Person{
public CoachMan() {
}
public CoachMan(String name, int age) {
super(name, age);
}
}
SportMan:
public abstract class SportMan extends Person{
public SportMan() {
}
public SportMan(String name, int age) {
super(name, age);
}
}
BasketballCoachMan:
public class BasketballCoachMan extends CoachMan{
public BasketballCoachMan() {
}
public BasketballCoachMan(String name, int age) {
super(name, age);
}
}
BasketballMan:
public class BasketballMan extends SportMan{
public BasketballMan() {
}
public BasketballMan(String name, int age) {
super(name, age);
}
}
(2)service中的代码:
PingPang接口:
public interface PingPang {
public abstract void studyEnglish();
}
PingPangSportManImpl:
import com.shujia.wjj.day12.ketang.interfacedemo.sportdemo.bean.SportMan;
public class PingPangSportManImpl extends SportMan implements PingPang {
public PingPangSportManImpl() {
}
public PingPangSportManImpl(String name, int age) {
super(name, age);
}
@Override
public void studyEnglish() {
System.out.println("乒乓球运动员学习英语");
}
}
PingPangCoachManImpl:
import com.shujia.wjj.day12.ketang.interfacedemo.sportdemo.bean.CoachMan;
public class PingPangCoachManImpl extends CoachMan implements PingPang {
public PingPangCoachManImpl() {
}
public PingPangCoachManImpl(String name, int age) {
super(name, age);
}
@Override
public void studyEnglish() {
System.out.println("乒乓球教练学习英语");
}
}
(3)controller中的代码:
SportManDemo测试类:
import com.shujia.wjj.day12.ketang.interfacedemo.sportdemo.bean.BasketballMan;
import com.shujia.wjj.day12.ketang.interfacedemo.sportdemo.bean.SportMan;
import com.shujia.wjj.day12.ketang.interfacedemo.sportdemo.service.PingPangSportManImpl;
//测试类,测试写的案例
public class SportManDemo {
public static void main(String[] args) {
//创建一个乒乓球运动员对象
SportMan sm = new PingPangSportManImpl("阿豪",18);
sm.show();
((PingPangSportManImpl)sm).studyEnglish();
//创建一个篮球运动员
SportMan sm2 = new BasketballMan("阿杰",19);
sm2.show();
// ((BasketballMan)sm2).studyEnglish();
}
}