Java入门 第十节(二)接口

接口

1. 什么是接口 ?

  1. 接口并不是类,但是可以把它看做 抽象类 的延伸,是一个纯粹的抽象类
  2. 接口属于一个规范,一旦定义不要轻易改动。
    • 电脑各种各样的接口 。
  3. java不允许,类多继承, 所以如果要实现多个类的功能,则可以通过实现多个接口.
	class Fu{
		eat(){}
	}
	
	class Fu2{
		drink(){}
	}
	
	// 想使用 eat(); 和 drink();
	class ziimpl extends Fu?Fu2{ // 两个方法能同时继承2个么!? 答案是不能的!
	}
	

2.语法定义

  1. 定义接口的方式和类一样,关键字 interface
	interface 接口名 {  
		// 主体代码 
		code...  
}

2.1 接口的特点

  1. 类的定义是class,接口的定义interface
  2. 类是继承 extends,接口是实现 implement
  3. 接口无法被实例化。只能由子类去实现。
  4. 类和接口之间是可以多实现。 接口和接口之间可以多继承。
  5. 接口中的方法都是抽象方法。关键字 abstract修饰,且所有权限都是 public
    • 在Java8新特性之后,default 默认方法。
	interface Computer{
    //1.接口中的方法都是抽象方法,其中权限都是public,可以省略不写
    abstract public void playGame(); //用abstract修饰
    public void music();// 也可以省略 关键字 abstract

    //2.在1.8 之后,有默认方法default,相当于普通方法
    default void video(){
        System.out.println("看视频");
    }
}
	

2.2 接口中方法的使用

  1. 实现接口的,关键字 implement实现类,必须重写接口中的抽象方法。
    • default 默认的方法可以,不用重写。
		public class Interface_Test {
	    public static void main(String[] args) {
	        Computer c = new NoteBook();
	        c.playGame();
	        c.music();
	
	        c.video();//调用接口中普通方法。
	    }
	}
	
	/*定义笔记本
	 */
	class NoteBook implements Computer{
	
	    /*实现接口必须重写抽象方法,如果不想重写,
	        实现类就变成抽象类即可。
	     */
	    @Override
	    public void playGame() {
	        System.out.println("玩Cs");
	    }
	
	    @Override
	    public void music() {
	        System.out.println("听周杰伦音乐");
	    }
	}
	
	
	interface Computer{
	
	    //1.接口中的方法都是抽象方法,其中权限都是public,可以省略不写
	    abstract public void playGame(); //用abstract修饰
	    public void music();// 也可以省略 关键字 abstract
	
	    //2.在1.8 之后,有默认方法default
	    default void video(){
	        System.out.println("基本功能,看视频");
	    }
	}

3. 接口的用法

3.1 成员变量

  1. 接口中变量修饰 默认public static final
    • 啥意思 ?因为有final修饰,所以,接口中 只有常量 没有变量 。

	public class Interface_Test2 {
	    public static void main(String[] args) {
	        Computer2 c2 = new NoteBook2();
	
	        //虽然没有修饰,但是接口中成员变量就是常量。所以无法改变
	       // c2.MAIN=2; //Cannot assign a value to final variable 'MAIN'
	    }
	}
	
	/*定义笔记本
	 */
	class NoteBook2 implements Computer2{
	
	}
	
	interface Computer2{
	    
	    //1.接口中修饰的成员变量为常量
	    // 关键字 public static final
	    public static final int CPU_NUM=1; //cpu个数
	    // 修饰的关键字也可以省略不写,但也是常量
	    int MAIN_BOARD=1;//主板数量
	
	}

3.2 构造方法

  1. 构造方法,两个比较重要的作用

    • “给成员变量初始化值” 和 “创建对象”;
    public class Interface_Test2 {
        public static void main(String[] args) {
            Computer2 c2 = new NoteBook2();
            //想使用子类的属性就需要向下转型
            NoteBook2 noteBook2  = (NoteBook2) c2;
            noteBook2.name="Thinkpad";
            System.out.println(noteBook2.name);
        }
    }
    
    /*定义笔记本
     */
    class NoteBook2  implements Computer2 {
    
        String name;//名称
        public NoteBook2() {
            super();//这是调用谁的父类的构造方法?
            System.out.println("我是子类构造方法");
        }
    }
    
    interface Computer2 {
    
       //1.接口中到底有没有构造方法创建一个即可。
        //public Computer2(){} //就不允许
    
    }
    
  • 输出结果:

    我是子类构造方法
    Thinkpad
    
  1. 思考一个问题: 说一说,你自己理解的, 为什么接口中没有构造方法!?

4. 课堂案例–面向接口编程

4.1 设计交通工具

  1. 车的最基本两个功能: 启动,和 停止。
  2. 跟据车的动力来划分: 有人力,汽油,电。
  3. 所以问题产生了
    • 例如:按照两轮车为: ,你给它 汽油 就是摩托车,你给它,就是电动车,如果只有人力,就是自行车。
  • 思考: 我能不能调用一个方法,传递不同的车,就告诉我它的启动,停止,是什么!?
public class JiaoTongToolsDemo {
    public static void main(String[] args) {
        //测试一下摩托车
        MotorCycle m = new MotorCycle();
        m.setName("摩托车");

        System.out.println(m.getName());
        m.go();
        m.stop();
        m.oil();

        //测试一下新国标电动车
        Bike b = new Bike ();
        b.setName("电动自行车");
        System.out.println(b.getName());
        b.go();
        b.power();
        b.electric();
        b.stop();
    }
}

/**
 * 定义车为抽象类
 */
abstract class Che{
    private String name; //车的名字

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //启动
    abstract public void go();
    //停止
    abstract public void stop();
}

//定义动力接口
interface Power1{
    void oil();
}
interface Power2{
    void electric();
}
interface Power3{
    void power();
}

/**
 * 后期有新加装的功能,设计成动作接口,这样谁来都可以使用!
 */
interface rings{
    void sound();
}

/**
 * 摩托车
 */
class MotorCycle extends Che implements Power1{

    @Override
    public void oil() {
        System.out.println("加92汽油");
    }
    @Override
    public void go() {
        System.out.println("一键启动");
    }
    @Override
    public void stop() {
        System.out.println("手刹");
    }
}

/**
 * 2021年10月1日 新国标开始 需要电动自行车加脚蹬子。
 */
class Bike extends Che implements Power2,Power3{
    @Override
    public void electric() {
        System.out.println("我可以充电跑");
    }

    @Override
    public void power() {
        System.out.println("我可以用脚蹬");
    }

    @Override
    public void go() {
        System.out.println("脚蹬和一键启动");
    }

    @Override
    public void stop() {
        System.out.println("手刹,脚刹");
    }
}

输出结果:

摩托车
一键启动
手刹
加92汽油
电动自行车
脚蹬和一键启动
我可以用脚蹬
我可以充电跑
手刹,脚刹

5. 知识点扩展

5.1 接口和类的关系

  1. 类与类:继承关系,一个类只能继承一个父类,支持多重继承
    • class A ; class A extends B{} ; class B extends C{}
  2. 类和接口:只有实现关系,一个类可以实现多个接口。
    • class A implement B,C,D{}
  3. 接口和接口: 只有继承关系,一个接口可以继承多个接口。
    • interface A extends B ,C ,D{}

5.2 面试题:接口和抽象类的区别

  1. 定义关键字:
    • 接口定义类型 interface
    • 抽象类定义类型 class
  2. 成员变量:
    • 接口中默认修饰public static final 就是常量;
    • 抽象类中,可以有成员变量,也可以有常量。
  3. 方法:
    • 接口中的方法都是抽象方法 {jdk 8之后,有默认方法default修饰。也有静态方法(静态方法必须有方法体)}
    • 抽象类中没有限制。
  4. 构造方法:
    • 接口中没有构造方法; 不可以实例化。
    • 抽象类中有构造方法(用于子类实例化使用);不可以实例化。
  5. 设计思想:
    • 抽象类,这个对象是什么?(强调对象本身)
    • 接口,这个能干什么 (强调动作)

5.3 老吴浅谈:什么时候用接口?什么时候用抽象类?

  1. 首先二者都是设计思想,都是不可以被实例化,且都属于 “抽象层面”
  2. 抽象类更倾向于说明对象的本质,具有相同的属性和行为,如人类,动物类,一系列。
  3. 而接口更偏向于动作规范 ,如:USB接口, 删除,增加,修改,查询等。
  4. 如果设计时,包含的公共代码很多,关系比较密切,可以优先考虑抽象类。如果要考虑后期代码的扩展性和维护性时,可以优先考虑使用接口。
  5. 举一个例子
    • 对于接口来说: 水中鲨鱼,后来发现海参可以吃,男足也吃海参,就可以把 “吃海参” 设计成一个接口。便于扩展。最后狗也可以吃海参,直接实现就可以! 三个对象没有任何联系,只是有吃海参这样的事情。
    • 对于抽象类而言: 谷爱凌喜欢吃馅饼,中国女足喜欢吃面条,可以抽取共同 属性和行为 形成抽象类,二者联系紧密,都是中国人,都喜欢吃中国美食,都为国家争光。
  6. 原则如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴琼老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值