接口
一、接口的概述及其特点
1、接口的概述
接口类似于类,但是与类相比,有两个原则必须遵守,这两个原则也是区别接口和类的关键:
A.接口中的成员只能是公有、静态、常变量,即,必须(编译软件自动)拥有public、static和final联合属性关键字;
B.接口中的方法只能是公有、抽象方法,即,必须(编译软件自动)拥有public和abstract联合属性关键字。
**C.**代码:下面两段代码本质上是一样的
public interface Test1 {
int data = 20;//编译系统自动拥有
void show();
}
public interface Test2 {
public static final int data = 20;
public abstract void show();
}
二、接口的特点
A:接口用关键字interface表示 格式: interface 接口名 {}
B:类实现接口用implements表示 格式: class 类名 implements 接口名 {}
C:接口不能实例化
按照多态的方式来实例化。
D:接口的子类:实现接口的类,必须实现接口所规定的的抽象方法!否则,该类就是抽象类!
a:可以是抽象类。但是意义不大。
b:可以是具体类。要重写接口中的所有抽象方法。(推荐方案)
二、接口的成员特点
A:接口成员特点
a:成员变量:只能是常量,并且是静态的。
默认修饰符:public static final
建议:自己手动给出。
b:构造方法:接口没有构造方法。
c:成员方法:只能是抽象方法。
默认修饰符:public abstract
三、类与类,类与接口,接口与接口的关系
1.类与类:
继承关系,只能单继承(一个子类只能有一个父类,父类可以被多个子类继承),可以多层继承。
2.类与接口:
实现关系,可以单实现,也可以多实现。
并且还可以在继承一个类的同时实现多个接口。
3.接口与接口:
继承关系,可以单继承,也可以多继承。
四、抽象类和接口的区别
A:成员区别
a:抽象类:
成员变量:可以是变量,也可以是常量
构造方法:有
成员方法:可以是抽象,也可以是非抽象
b:接口:
成员变量:只可以是常量
成员方法:只可以是抽象
B:关系区别
a:类与类
继承,单继承
b:类与接口
实现,单实现,多实现
c:接口与接口
继承,单继承,多继承
C:设计理念区别
抽象类 被继承体现的是:”is a”的关系。 抽象类中定义的是该继承体系的共性功能。
接口 被实现体现的是:”like a”的关系。 接口中定义的是该继承体系的扩展功能。
五.例子
public abstract class Animal {
public String name;
public int age;
public abstract void eat();
public abstract void sleep();
}
public interface JumpInterface {
void jump();
}
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("吃饭");
}
@Override
public void sleep() {
System.out.println("睡觉");
}
}
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("吃饭");
}
@Override
public void sleep() {
System.out.println("睡觉");
}
}
public class Jiafei extends Cat implements JumpInteface {
@Override
public void eat() {
System.out.println("加菲猫吃猫粮");
}
@Override
public void sleep() {
System.out.println("加菲猫想睡就睡");
}
@Override
public void jump() {
System.out.println("加菲猫学会了跳高");
}
}
public class Fatorange extends Cat{
@Override
public void eat() {
System.out.println("猫吃小鱼干");
}
@Override
public void sleep() {
System.out.println("胖橘白天睡觉");
}
public void catchMouse(){
System.out.println("胖橘抓老鼠");
}
}
public class Wangcai extends Dog {
@Override
public void eat() {
System.out.println("旺财爱吃骨头");
}
@Override
public void sleep() {
System.out.println("旺财天天睡觉");
}
public void lookDoor(){
System.out.println("旺财看门");
}
}
import org.westos.demo.JumpInteface;
public class Bruse extends Dog implements JumpInteface {
@Override
public void eat() {
System.out.println("布鲁斯吃牛排");
}
@Override
public void sleep() {
System.out.println("布鲁斯睡沙发");
}
public void watchTV(){
System.out.println("看电视");
}
@Override
public void jump() {
System.out.println("布鲁斯学会了跳高");
}
}
public class MyTest {
public static void main(String[] args) {
/* A:
案例演示
动物类:姓名,年龄,吃饭,睡觉。
动物培训接口:跳高
猫继承动物类
狗继承动物类
部分猫继承猫类并实现跳高接口
部分狗继承狗类并实现跳高接口*/
Wangcai wc = new Wangcai();
Animal an = wc;
an.name = "旺财";
an.age = 20;
System.out.println(an.name);
System.out.println(an.age);
an.sleep();
an.eat();
((Wangcai) an).lookDoor();
Bruse bls = new Bruse();
an=bls;
an.name = "布鲁斯";
an.age = 58;
System.out.println(an.name);
System.out.println(an.age);
an.eat();
an.sleep();
JumpInteface jumpInteface= bls;
jumpInteface.jump();
Fatorange fo = new Fatorange();
Animal an = fo;
an.name = "胖橘";
an.age = 23;
System.out.println(an.name);
System.out.println(an.age);
an.sleep();
an.eat();
((Fatorange) an).catchMouse();
Jiafei jf = new Jiafei();
an=jf;
an.name = "加菲";
an.age = 33;
System.out.println(an.name);
System.out.println(an.age);
an.eat();
an.sleep();
JumpInteface jumpInteface = jf;
jumpInteface.jump();
}
}
以上的例子,不仅运用了类的继承、方法的重写和接口的继承,
还使用了如何用接口来实例化(多态实例化)。
希望大家把以上代码亲自敲一遍,深刻理解接口中的jump()方法,
将此方法与父类中的eat()和sleep()两个方法进行对比,
找到接口与类的不同点与相似点!