一、JDK1.8前的接口
1.狭义的定义:interface(关键字) 接口名 {}
2.广义的定义:接口就相当于定义了,一个规则,我们要想使用这个接口,就必须遵守这个规则
注:定义的是jdk1.8以前的规则
1).接口中只能声明抽象方法
2).如果你声明一个方法,没有写abstract,系统会默认帮你加上--abstract
3).接口没有构造方法,不能直接实例化对象
4).接口中定义的成员变量,默认的修饰词是 public static finall是常量,并且直接用接口名去调用
使用接口的关键字,implements(实现)---实现这个接口
注:接口的实现类,都有后缀的Impl
3.
1)类和类的关系
类和类 继承关系 只能单继承,可以多层继承
2)类和接口的关系
类和接口 实现的关系 可以单实现,也可以多实现(接口可以有很多个)
3)接口和接口的关系
是继承关系,可以单继承,也可以多继承
例题
动物:吃,叫
猫:猫吃鱼,喵喵
跳高猫
训练动物:训练跳高
训练猫:会跳高的猫
4)代码
例题1:
public class Demo02 {
public static void main(String[] args) {
}
}
abstract class Animal{
public abstract void eat() ;
public abstract void speak();
}
interface InterB{
public abstract void fun1();
}
interface InterC{
public abstract void fun2();
}
class InterImpl implements InterD{
@Override
public void fun1() {
}
@Override
public void fun2() {
}
@Override
public void fun3() {
}
}
interface InterD extends InterB,InterC{
public abstract void fun3();
}
interface CatJumpInter {
public abstract void jump();
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
@Override
public void speak() {
System.out.println("猫叫 喵喵喵");
}
}
class JumpCat extends Cat implements CatJumpInter{
@Override
public void jump() {
System.out.println("拿棒子 怼屁股跳高");
}
}
例题2
package com.lanou3g.test;
需求:经过国际主板研究协会讨论
最终要求 主板生产商 要按规则生产可插卡的主板
所有的卡都要有 开始和停止的方法
设计完成 生产 大力牌主板
public class Demo03 {
public static void main(String[] args) {
MainBoardInter mainBoardInter = new DLMainBoardInter ();
DLMainBoardInter dlMainBoardInter = (DLMainBoardInter)mainBoardInter;
dlMainBoardInter.run();
Card card = new NetCard();
dlMainBoardInter.addCard(card);
dlMainBoardInter.addCard(new NetCard());
}
}
interface MainBoardInter {
public abstract void addCard(Card card);
}
class DLMainBoardInter implements MainBoardInter{
@Override
public void addCard(Card card) {
card.start();
card.stop();
}
public void run() {
System.out.println("主板启动");
}
}
abstract class Card{
public abstract void start();
public abstract void stop();
}
class SayCard extends Card{
@Override
public void start() {
}
@Override
public void stop() {
}
}
class NetCard extends Card{
@Override
public void start() {
System.out.println("开始上网");
}
@Override
public void stop() {
System.out.println("中断上网");
}
}
二、JDK1.8后的接口
package com.lanou3g.test;
JDK1.8后 接口的新特性(暂时没有什么应用场景)
接口中可以声明
1.抽象方法
2.静态方法
使用 static 关键词修饰的方法
3.默认方法
使用default关键词
分析思路:
* 1.明确写法
* 2.明确如何在接口和实现类中调用
* 3.明确如何在对象中去调用
* 4.最后总结要注意什么
抽象类和接口的区别
* 1.成员变量
* 抽象类:可以是变量也可以是常量
* 接口: 只能是常量
* 2.成员方法
* 抽象类: 可以是抽象方法,也可以是普通的成员方法
* 接口:只能是抽象方法 静态方法 默认发方法
* 3.构造方法(抽象类和接口都不能实例化对象)
*抽象类:可以有构造方法 可以被继承
*接口:没有构造方法 只能被实现
代码:
public class Demo04 {
public static void main(String[] args) {
InterX.staticFun();
InterX interX = new InterXImpl();
interX.defaultFun();
System.out.println();
InterXImpl impl = (InterXImpl)interX;
impl.fun();
System.out.println();
InterX.staticFun();
InterXImpl.staticFun();
}
}
interface InterX{
public abstract void print();
public static void staticFun() {
System.out.println("我是接口中的静态方法 staticFun");
}
public default void defaultFun() {
System.out.println("我是接口的默认方法 defaultFun");
}
}
class InterXImpl implements InterX{
@Override
public void print() {
System.out.println("我是实现类中的抽象方法");
}
@Override
public void defaultFun() {
InterX.super.defaultFun();
System.out.println("我是实现类中 重写接口里的默认方法");
}
public void fun() {
InterX.super.defaultFun();
System.out.println("我是实现类中的特有的方法 fun");
}
public static void staticFun() {
System.out.println("我是实现类中的静态方法 staticFun");
}
}
三、 模板设计模式(设计思想)
通过例题理解:例题1
需求:
* 学习类 来蓝鸥学习 报名缴费
* 选择学习进行学科学习(JAVA H5 VR)
* 毕业找工作
public class Demo05 {
public static void main(String[] args) {
FenJian fenJian = new FenJian();
fenJian.lanOuStudy();
System.out.println();
Study study = new FenJian();
study.lanOuStudy();
}
}
abstract class Study
{
public void lanOuStudy() {
System.out.println("报名缴费");
chooseSubject();
System.out.println("毕业找工作");
}
public abstract void chooseSubject();
}
class FenJian extends Study{
@Override
public void chooseSubject() {
System.out.println("选择JAVA学科");
}
}
例题2:
package com.lanou3g.test;
* 需求:
* 计算一个程序的 运行时间
public class Demo06 {
public static void main(String[] args) {
GetTime getTime = new Test();
getTime.getTime();
}
}
abstract class GetTime{
public void getTime() {
long start = System.currentTimeMillis();
fun();
long stop = System.currentTimeMillis();
System.out.println((stop - start)+"毫秒");
}
public abstract void fun();
}
class Test extends GetTime{
@Override
public void fun() {
for(int i = 0;i<40000;i++) {
System.out.println(i);
}
}
}