目录
1.接口概述
接口就是一种公共的规范标准,只要符合规范标准,大家都可以使用。
Java中的接口更多的体现在对行为的抽象。
2.接口的特点
接口用关键字interface修饰
- public interface 接口名{}
类实现接口用implements表示
- public class 类名 implements 接口名{}
接口不能实例化
- 参照多态的方式,通过实现类 对象实例化,这叫做接口多态。
- 多态的形式:具体类多态,抽象类多态,接口多态。
多态的前提:
- 有继承或实现关系;
- 有方法重写;
- 有父类/接口引用指向子类/实现类对象。
接口的实现类
- 要么重写接口中的所有抽象方法(实现类完成接口伟业)。
- 要么定义为抽象类(实现不能完成接口伟业,交给下一个实现类完成)。
Jumpping.java
public interface Jumpping {
public abstract void jump();
}
Cat.java
public class Cat implements Jumpping {
@Override
public void jump() {
System.out.println("猫可以跳高了");
}
}
Dog.java
public abstract class Dog implements Jumpping{
}
JumppingDemo.java
public class JumppingDemo {
public static void main(String[] args) {
// Jumpping j=new Jumpping();
Jumpping j = new Cat();
j.jump();//猫可以跳高了
}
}
3.接口的成员特点
成员变量
- 只能是常量
- 默认修饰符:public static final
构造方法
- 接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在的。
- 一个类如果没有父类,默认继承自Object类。
成员方法
- 只能是抽象方法
- 默认修饰符:public abstract
- 关于接口中的方法,JDK8和JDK9中有一些新特性,后面再讲解
Inter.java
package com.ydh_02;
public interface Inter {
public int num=10;
public final int num2=20;
int num3=30;//public static final int num3=30;
// public Inter(){}
// public void show(){}
public abstract void method();
void show();//public abstract void show();
}
InterImpl.java
package com.ydh_02;
/*
public class InterImpl extends Object implements Inter{
public InterImpl(){
super();
}
}
*/
public class InterImpl implements Inter{
public InterImpl(){
super();
}
@Override
public void method() {
System.out.println("method");
}
@Override
public void show() {
System.out.println("show");
}
}
InterfaceDemo.java
package com.ydh_02;
public class InterfaceDemo {
public static void main(String[] args) {
Inter i=new InterImpl();
// i.num=30;
System.out.println(i.num);//10
// i.num2=30;
System.out.println(i.num2);//20
System.out.println(Inter.num3);
i.method();//method
i.show();//show
}
}
4.案例:猫和狗(接口版)
Jumpping.java
package com.ydh_03;
public interface Jumpping {
public abstract void jump();
}
Animal.java
package com.ydh_03;
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();
}
Cat.java
package com.ydh_03;
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("猫可以跳高了");
}
}
Dog.java
package com.ydh_03;
public class Dog extends Animal implements Jumpping{
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("狗吃骨头");
}
@Override
public void jump() {
System.out.println("狗可以跳高了");
}
}
AnimalDemo.java
package com.ydh_03;
public class AnimalDemo {
public static void main(String[] args) {
//创建对象,调用方法
/*
Jumpping j=new Cat();
j.jump();
Animal a=new Cat();
a.setName("加菲");
a.setAge(5);
System.out.println(a.getName()+","+a.getAge());
a.eat();
*/
//实际开发中,我们这样写,因为Cat类中的方法最全面
Cat c=new Cat();
c.setName("加菲");
c.setAge(5);
System.out.println(c.getName()+","+c.getAge());
c.eat();
c.jump();
//猫类的带参创建对象,狗类的创建对象以及调用方法就不演示了
}
}
5.类和接口的关系
类和类的关系
- 继承关系,只能单继承,但是可以多层继承
类和接口的关系
- 实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
接口和接口的关系
- 继承关系,可以单继承,也可以多继承
6.抽象类和接口的区别
成员区别
抽象类 变量,常量;有构造方法;有抽象方法也有非抽象方法
接口 常量;抽象方法
关系区别
类与类 继承,单继承
类与接口 实现,可以单实现,也可以多实现
接口与接口 继承,单继承,多继承
设计理念区别
抽象类 对类抽象,包括属性、行为
接口 对行为抽象,主要是行为
7.案例:运动员和教练
SpeakEnglish.java
package com.ydh_04;
//说英语的接口
public interface SpeakEnglish {
public abstract void speak();
}
Person.java
package com.ydh_04;
//抽象人类
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();
}
Player.java
package com.ydh_04;
//抽象运动员类
public abstract class Player extends Person{
public Player() {
}
public Player(String name, int age) {
super(name, age);
}
public abstract void study();
}
Coach.java
package com.ydh_04;
//抽象教练类
public abstract class Coach extends Person{
public Coach() {
}
public Coach(String name, int age) {
super(name, age);
}
public abstract void teach();
}
BasketballPlayer.java
package com.ydh_04;
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("篮球运动员吃牛肉,喝牛奶");
}
}
PingPangPlayer.java
package com.ydh_04;
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("乒乓球运动员说英语");
}
}
BasketballCoach.java
package com.ydh_04;
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("篮球教练吃羊肉,喝羊奶");
}
}
PingPangCoach.java
package com.ydh_04;
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("乒乓球教练说英语");
}
}
PersonDemo.java
package com.ydh_04;
/*
测试类
*/
public class PersonDemo {
public static void main(String[] args) {
//创建对象,调用方法
BasketballPlayer bp=new BasketballPlayer();
bp.setName("姚明");
bp.setAge(35);
System.out.println(bp.getName()+","+bp.getAge());
bp.eat();
bp.study();
System.out.println("--------");
PingPangPlayer ppp=new PingPangPlayer("王浩",30);
System.out.println(ppp.getName()+","+ppp.getAge());
ppp.eat();
ppp.study();
ppp.speak();
//乒乓球教练类和篮球教练类就不再演示了
}
}
8.形参和返回值
类名作为形参和返回值
- 方法的形参是类名,其实需要的是该类的对象
- 方法的返回值是类名,其实返回的是该类的对象
Cat.java
package com.ydh_01;
public class Cat {
public void eat(){
System.out.println("猫吃鱼");
}
}
CatOperator.java
package com.ydh_01;
public class CatOperator {
public void useCat(Cat c){//Cat c=new Cat();
c.eat();
}
public Cat getCat(){
Cat c=new Cat();
return c;
}
}
CatDemo.java
package com.ydh_01;
public class CatDemo {
public static void main(String[] args) {
//创建操作类对象,并调用方法
CatOperator co=new CatOperator();
Cat c=new Cat();
co.useCat(c);//猫吃鱼
Cat c2=co.getCat();//Cat c2=new Cat();
c2.eat();//猫吃鱼
}
}
抽象类名作为形参和返回值
- 方法的形参是抽象类名,其实需要的是该抽象类的子类对象
- 方法的返回值是抽象类名,其实返回的是该抽象类的子类对象
Animal.java
package com.ydh_02;
public abstract class Animal {
public abstract void eat();
}
Cat.java
package com.ydh_02;
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
AnimalOperator.java
package com.ydh_02;
public class AnimalOperator {
public void useAnimal(Animal a){//Animal a=new Cat();
a.eat();
}
public Animal getAnimal(){
Animal a=new Cat();
return a;
}
}
AnimalDemo.java
package com.ydh_02;
public class AnimalDemo {
public static void main(String[] args) {
//创建操作类对象,并调用方法
AnimalOperator ao=new AnimalOperator();
Animal a=new Cat();
ao.useAnimal(a);//猫吃鱼
Animal a2=ao.getAnimal();//Animal a2=new Cat();
a2.eat();//猫吃鱼
}
}
接口名作为形参和返回值
- 方法的形参是接口名,其实需要的是该接口的实现类对象
- 方法的返回值是接口名,其实返回的是该接口的实现类对象
Jumpping.java
package com.ydh_03;
public interface Jumpping {
void eat();
}
Cat.java
package com.ydh_03;
public class Cat implements Jumpping{
@Override
public void eat() {
System.out.println("猫可以跳高了");
}
}
JumppingOperator.java
package com.ydh_03;
public class JumppingOperator {
public void useJumpping(Jumpping j){//Jumpping j=new Cat()
j.eat();
}
public Jumpping getJumpping(){
Jumpping j=new Cat();
return j;
}
}
JumppingDemo.java
package com.ydh_03;
public class JumppingDemo {
public static void main(String[] args) {
//创建操作类对象,并调用方法
JumppingOperator jo=new JumppingOperator();
Jumpping j=new Cat();
jo.useJumpping(j);//猫可以跳高了
Jumpping j2 = jo.getJumpping();//Jumpping j2=new Cat();
j2.eat();//猫可以跳高了
}
}