个人主页→VON
收录专栏→java从入门到起飞
抽象类→抽象类和抽象方法
目录
一、初识接口
特点和用途
示例:
Animal类
Dog类
Frog类
Rabbit类
Swim接口
text测试类
结果展示:
二、接口的细节
接口中的成员特点:
成员特点与接口的关系:
接口的作用:
接口和类之间的关系 :
三、接口和抽象类的综合案例
思路图:
案例全套代码:
Coach类:
LQcoach类:
LQsport类:
People类:
PPcoach类:
PPsport类:
Speak接口:
Sports接口:
Text测试类:
结果展示:
一、初识接口
在Java中,接口(Interface)是一种抽象类型,它定义了一组方法(没有方法体)的规范,但没有实现这些方法的具体细节。接口可以看作是一种约定,它规定了类应该如何进行行为定义,而不关心具体的实现细节。
特点和用途
-
方法声明:接口中的方法默认是抽象的,不需要使用
abstract
关键字显式声明。 -
不能包含具体方法:在Java 8之前,接口只能包含抽象方法。从Java 8开始,接口可以包含默认方法(使用
default
关键字修饰的具体方法)和静态方法(使用static
关键字修饰的静态方法)。 -
常量声明:接口可以包含常量,这些常量默认是
public static final
类型的。 -
多继承:Java中的类只能单继承,但接口可以实现多继承,一个类可以实现多个接口。
-
实现:实现接口的类必须实现接口中定义的所有方法,否则这些类必须声明为抽象类。
示例:
Animal类
package com.von.day15;
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();
}
Dog类
package com.von.day15;
public class Dog extends Animal implements Swim{
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("狗吃骨头");
}
@Override
public void swim(){
System.out.println("狗在游泳");
}
}
Frog类
package com.von.day15;
public class Frog extends Animal implements Swim{
public Frog() {
}
public Frog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("青蛙吃虫子");
}
@Override
public void swim() {
System.out.println("青蛙游泳");
}
}
Rabbit类
package com.von.day15;
public class Rabbit extends Animal{
public Rabbit() {
}
public Rabbit(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("兔子再吃胡萝卜");
}
}
Swim接口
package com.von.day15;
public interface Swim {
public void swim();
}
text测试类
package com.von.day15;
public class text {
public static void main(String[] args) {
Frog f=new Frog();//青蛙
System.out.println(f.getName()+","+f.getAge());
f.eat();
f.swim();
Rabbit r=new Rabbit();//兔子
System.out.println(r.getName()+","+r.getAge());
r.eat();
Dog d=new Dog();//狗
System.out.println(d.getName()+","+d.getAge());
d.eat();
d.swim();
}
}
结果展示:
因为没有传入参数,所以为null和0.
二、接口的细节
成员特点(字段和方法)是接口定义的一部分,它们规定了实现该接口的类应该具备的属性和行为。接口通过定义这些成员特点,强制实现类提供对应的功能实现,从而实现了代码的约束和多态性。
接口中的成员特点:
- 字段:接口中的字段默认是
public static final
的,也就是常量。它们必须被初始化为一个常量值。 - 方法:接口中的方法默认是
public abstract
的抽象方法,不包含方法体。实现接口的类必须实现这些方法。 - 默认方法和静态方法:从Java 8开始,接口可以包含默认方法(使用
default
关键字修饰)和静态方法(使用static
关键字修饰),它们可以提供接口的默认实现或者与接口相关的功能性方法。
成员特点与接口的关系:
- 字段:接口中的字段可以被实现接口的类继承和访问,因为它们是
public static final
的。通过接口名访问这些字段。 - 方法:接口中定义的方法必须被实现接口的类实现,因此接口定义了类应该具备的行为。
- 默认方法和静态方法:实现类可以选择重写默认方法,也可以直接继承和使用接口中定义的默认实现和静态方法。
接口的作用:
- 提供了一种协议或者契约,规定了类应该实现的方法。
- 允许多继承,一个类可以实现多个接口,从而获得多态性和灵活性。
- 可以通过接口实现解耦,将类的实现和接口定义分离,提高代码的可维护性和扩展性。
接口和类之间的关系 :
- 类与类的关系:继承关系,只能单继承,不能多继承,但是可以多层继承。
- 类与接口的关系:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。
- 接口与接口的关系:继承关系,可以单继承也可以多继承。
三、接口和抽象类的综合案例
思路图:
案例全套代码:
Coach类:
package com.von.day15a;
public abstract class Coach extends People{
public Coach() {
}
public Coach(String name, int age) {
super(name, age);
}
public abstract void teach();
}
LQcoach类:
package com.von.day15a;
public class LQcoach extends Coach{
public LQcoach() {
}
public LQcoach(String name, int age) {
super(name, age);
}
@Override
public void teach(){
System.out.println("教篮球");
}
}
LQsport类:
package com.von.day15a;
public class LQsport extends Sports{
public LQsport() {
}
public LQsport(String name, int age) {
super(name, age);
}
@Override
public void learn() {
System.out.println("学篮球");
}
}
People类:
package com.von.day15a;
public class People {
private String name;
private int age;
public People() {
}
public People(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;
}
}
PPcoach类:
package com.von.day15a;
public class PPcoach extends Coach implements Speak{
public PPcoach() {
}
public PPcoach(String name, int age) {
super(name, age);
}
@Override
public void teach() {
System.out.println("教乒乓球");
}
@Override
public void sprakEnglish() {
System.out.println("说英语");
}
}
PPsport类:
package com.von.day15a;
public class PPsport extends Sports implements Speak{
public PPsport() {
}
public PPsport(String name, int age) {
super(name, age);
}
@Override
public void sprakEnglish() {
System.out.println("说英语");
}
@Override
public void learn() {
System.out.println("学乒乓球");
}
}
Speak接口:
package com.von.day15a;
public interface Speak {
public void sprakEnglish();
}
Sports接口:
package com.von.day15a;
public abstract class Sports extends People{
public Sports() {
}
public Sports(String name, int age) {
super(name, age);
}
public abstract void learn();
}
Text测试类:
package com.von.day15a;
public class Text {
public static void main(String[] args) {
PPsport pPsport=new PPsport("乒乓球运动员",18);//乒乓球运动员
System.out.println(pPsport.getName()+","+pPsport.getAge());
pPsport.sprakEnglish();
pPsport.learn();
PPcoach pPcoach=new PPcoach("乒乓球教练",30);//乒乓球教练
System.out.println(pPcoach.getName()+","+pPcoach.getAge());
pPcoach.teach();
pPcoach.sprakEnglish();
LQsport lQsport=new LQsport("篮球运动员",19);//篮球运动员
System.out.println(lQsport.getName()+","+lQsport.getAge());
lQsport.learn();
LQcoach lQcoach=new LQcoach("篮球教练",32);//篮球教练
System.out.println(lQcoach.getName()+","+lQcoach.getAge());
lQcoach.teach();
}
}