java学习日记-接口

23 篇文章 0 订阅

回顾:

  1. abstract
    1. 修饰方法 抽象方法
      1. 没有方法体
      2. 必须定义在抽象类中
    2. 修饰类 抽象类
      1. 可以定义抽象方法
        1. 普通类中可以定义的一切,在抽象类中都可以定义
          1. 属性
          2. 构造方法
          3. 实例方法
      2. 不能实例化
      3. 子类必须重写父类的抽象方法
        1. 除非子类也是抽象类
  2. static
    1. 修饰属性 静态属性
      1. 数据类级别的属性
      2. 所有对象都共用一份
      3. 使用方法 类名.属性名
    2. 修饰方法 静态方法
      1. 目的:在调用方法时,不用创建对象
      2. 类名.方法名() 调用方法
      3. 一般情况下,把工具方法,公共方法定义成静态方法
    3. 修饰语句块 静态语句块
      1. 代码块 {}
      2. static {} 就是静态代码块
  3. final
    1. 修饰变量
      1. 实例变量、属性
        1. 手动赋值
        2. 不能修改
        3. 修饰静态属性 – 常量
          1. 常量名全部大写
      2. 局部变量
        1. 不能修改
    2. 修饰方法
      1. 不能被重写
    3. 修饰类
      1. 不能被继承

一. 接口

package com.qf;

public class Demo01 {

	public static void main(String[] args) {
		Pet p1 = new Dog();
		Pet p2 = new Cat();
		
		p1.call();
		p2.call();

	}
}

//宠物类
abstract class Pet {
	String type;
	String color;
	
	public abstract void call();
	
	public void run() {
		System.out.println("动物叫--");
	}
}
//宠物类子类   狗类
class Dog extends Pet{
	public void call() {
		System.out.println("狗叫--汪汪汪");
	}
}

//宠物类子类   狗类
class Cat extends Pet{
	public void call() {
		System.out.println("猫叫--喵喵");
	}
}
  1. 把抽象类中,所有的属性和非抽象方法(构造方法,实例方法)全部删除
  2. abstract class 修改成interface(接口)
  3. 可以把抽象方法的abstract修饰符删除
  4. 把子类继承父类的extends修改成implements
package com.qf;

public class Demo01 {

	public static void main(String[] args) {
		Pet p1 = new Dog();
		Pet p2 = new Cat();
		
		p1.call();
		p2.call();
		
		/*
		 * 在java中,类是单继承的, 一个类只能继承一个类
		 * 
		 * 但是在现实中,一个类事物需要继承多个类的
		 * 	一个人既是老师,又是厨师,又是父亲,又是儿子
		 */
	}
}

//宠物类
interface Pet {

	public void call();

}

//宠物类子类   狗类
class Dog implements Pet{
	public void call() {
		System.out.println("狗叫--汪汪汪");
	}
}

//宠物类子类   狗类
class Cat implements Pet{
	public void call() {
		System.out.println("猫叫--喵喵");
	}
}

1. 接口的定义

  • 使用interface定义
  • 不能定义属性
    • 不用描述什么是电脑
  • 不能定义构造方法
    • 不能实例化,不能new
  • 不能定义实例方法
    • 方法一定会被(重写),会使用多态
  • 可以定义抽象方法
    • abstract可以不定义(默认有)
    • public也可以不定义(默认就是public,不是default)

接口含义:定义一类事物能够进行的操作,只要实现了这些操作我们就说它就是这类事物。

类: 从属性的角度考虑,描述一类是什么

接口:是从这类能够进行的操作和提供的服务来考虑

接口只能定义抽象方法,常量

接口的可以有多个实现类,实现类必须实现接口中的抽象方法

  • 除非实现类也是抽象类

接口无法实例化,只能指向实现类的对象。

接口语法:

public interface 接口名 {
    //抽象方法
    public 返回类型/void 方法名(参数列表);
    
    //...
}

实现类:

public 实现类名 implements 接口名称 {
    //实现抽象方法
    public 返回类型/void 方法名(参数列表) {
        
    }
    
    //...
}

使用:

接口不能实例化,必须使用接口的引用/变量,指向实现类的对象(参考抽象类)。

接口类型  变量  = new 接口实现类对象();
package com.qf;

//定义电脑接口,定义电脑能干的事情
public interface Computer {

	/*
	 * 在接口中定义抽象方法
	 * 所要表达意思:该类事物都能够做的事情
	 * 		我们不再从属性的方向,表示一类事物是什么
	 * 		而是从功能和行为方向,表示一类事物能干什么
	 */
	void coding();
	
	void seeMovie();
	
	void playGames();
	
}

实现类:

package com.qf;

/*
 * 联想是电脑,既然是电脑,就要做到电脑都能干的事情
 * 
 * implements : 实现的意思     表示  联想实现电脑能做的事情
 *              Lenovo  就叫做接口Computer  的实现类
 */
public class Lenovo implements Computer{

	@Override
	public void coding() {
		System.out.println("使用联想电脑 编码");
		
	}

	@Override
	public void seeMovie() {
		System.out.println("使用联想电脑  看电影");
		
	}

	@Override
	public void playGames() {
		System.out.println("使用联想电脑  玩游戏");
	}

}
package com.qf;

//华硕也是电脑,既然是电脑,就要做到电脑都能干的事情
public class Ausa implements Computer {

	@Override
	public void coding() {
		System.out.println("使用华硕电脑 编码");
	}

	@Override
	public void seeMovie() {
		System.out.println("使用华硕电脑  看电影");
		
	}

	@Override
	public void playGames() {
		System.out.println("使用华硕电脑  玩游戏");
	}

}

2. 接口的实现

接口的实现使用implements关键字

接口无法实例化,只能指向实现类的对象。

public 实现类名 implements 接口名称 {
    //实现抽象方法
    public 返回类型/void 方法名(参数列表) {
        
    }
    
    //...
}
接口类型  变量  = new 接口实现类对象();

类:老师

​ 老师是什么

接口:老师

package com.qf;

public class Demo03 {

	public static void main(String[] args) {
		Teacher t = new Teacher();
		t.setName("张三丰");
		t.setGender("男");
		t.setSubject("太极");
		
		
		Master m = new JavaMaster();
		m.preach();
		
	}
}

//类:老师   描述老师的特性,表示什么样的老师
class Teacher {
	private String name;
	private String gender;
	private String subject;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	
}

/*
 * 接口:老师  老师能够做什么事情,  做了这些事情(实现老师接口)的就是老师
 * 
 * 传道   授业   解惑
 */
interface Master {
	
	//传道
	void preach();
	
	//授业
	void teach();
	
	//解惑
	void solveConfusion();
}

//java老师是老师  实现老师的接口
class JavaMaster implements Master {

	@Override
	public void preach() {
		System.out.println("通过编程思想,传道--");
	}

	@Override
	public void teach() {
		System.out.println("叫你编码,找工作");
	}

	@Override
	public void solveConfusion() {
		System.out.println("通过编程的哲理,解决你的困惑");
	}

	
}


/*
 * 定义一个厨师的接口
 * - 做菜
 * - 煲汤
 * 
 * 定义厨师的实现类    米其林厨师    餐馆老板
 */

2.1 接口可以多实现

java中的类是单继承的,意思就是一个类只能继承一个类,但是在现实中一个具体的事物,可以会有很多身份,意思就是既是这又是那。接口就可以解决我们多继承的问题。

  • 一个类可以实现多个接口
    • 一个接口可以有多个实现
  • 实现类必须实现所有接口的抽象方法
public  class 实现类  implements 接口1, 接口2,... {
	
}
package com.qf;

public class Demo03 {

	public static void main(String[] args) {
		Teacher t = new Teacher();
		t.setName("张三丰");
		t.setGender("男");
		t.setSubject("太极");
		
		
		Master m = new JavaMaster();
		m.preach();
		
		
		XdfMaster xm = new XdfMaster();
		xm.solveConfusion();
		
		
		/*
		 * 接口的引用指向到实现类的对象
		 */
		Master m2 = new XdfMaster();
		Chef c = new XdfMaster();
		m2.teach();  //m2只能执行Master接口中方法
		c.cook();    //c只能执行Chef接口中方法
		
	}
}

//类:老师   描述老师的特性,表示什么样的老师
class Teacher {
	private String name;
	private String gender;
	private String subject;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	
}

/*
 * 接口:老师  老师能够做什么事情,  做了这些事情(实现老师接口)的就是老师
 * 
 * 传道   授业   解惑
 */
interface Master {
	
	//传道
	void preach();
	
	//授业
	void teach();
	
	//解惑
	void solveConfusion();
}

//java老师是老师  实现老师的接口
class JavaMaster implements Master {

	@Override
	public void preach() {
		System.out.println("通过编程思想,传道--");
	}

	@Override
	public void teach() {
		System.out.println("叫你编码,找工作");
	}

	@Override
	public void solveConfusion() {
		System.out.println("通过编程的哲理,解决你的困惑");
	}

	
}


/*
 * 定义一个厨师的接口
 * - 做菜
 * - 煲汤
 * 
 * 定义厨师的实现类    米其林厨师    餐馆老板
 */
interface Chef {
	
	void cook();
	
	void soup();
	
}


/*
 *  新东方的老师
 *  - 是老师
 *  - 厨师
 */
class XdfMaster implements Master, Chef {

	@Override
	public void cook() {
		System.out.println("新东方老师,做菜");
	}

	@Override
	public void soup() {
		System.out.println("新东方老师,煲汤");
	}

	@Override
	public void preach() {
		System.out.println("新东方老师,传道");
	}

	@Override
	public void teach() {
		System.out.println("新东方老师,教做菜");
	}

	@Override
	public void solveConfusion() {
		System.out.println("新东方老师,做菜中,悟出的道理");
	}
	
}

2.2 接口可以多继承

在java中接口可以多继承,一个接口可以继承多个接口,表示一类事物既是什么,又是什么

蓝翔的老师即是厨师,又是老师,还会开挖掘机

package com.qf;

public class Demo04 {

	public static void main(String[] args) {
		LxMaster lm = new LxTeacher(); //所有接口中的方法都可调用
		lm.preach();
		lm.cook();
		lm.driveExcavator();
	}
	
}

/*
 * 一个接口可以继承多个接口
 * 
 * 蓝翔的老师,即使老师,又是厨师,还要会开挖掘机
 * 
 * 如果实现LxMaster接口,要把继承的所有接口中的抽象方法全部实现
 */
interface LxMaster extends Master, Chef {
	
	//开挖掘机
	void driveExcavator();
}

//如果实现LxMaster接口,要把继承的所有接口中的抽象方法全部实现
class LxTeacher implements LxMaster {

	@Override
	public void preach() {
		System.out.println("蓝翔老师--传道");
		
	}

	@Override
	public void teach() {
		System.out.println("蓝翔老师--授业");
		
	}

	@Override
	public void solveConfusion() {
		System.out.println("蓝翔老师--解惑");
		
	}

	@Override
	public void cook() {
		System.out.println("蓝翔老师--做菜");
		
	}

	@Override
	public void soup() {
		System.out.println("蓝翔老师--煲汤");
		
	}

	@Override
	public void driveExcavator() {
		System.out.println("蓝翔老师--开挖掘机");
	}
	
}

3. 接口,抽象类,类之间的比较

3.1 抽象类和类的比较

  • 相同点
    • 可以定义属性,实例方法,构造方法
    • 都可以作为数据类型
  • 不同点
    • 抽象类可以定义抽象方法,类不能定义
    • 类可以实例化,抽象类不能实例化

3.2 类和接口的比较

  • 相同点
    • 可以定义公开的静态常量
      • 接口中定义静态常量可以忽略public static final 因为默认有这三个修饰符
    • 都可以作为数据类型
      • 接口的引用指向实现类的对象
  • 不同点
    • 类可以定义属性,实例方法,构造方法,接口只能定义抽象方法及静态常量
    • 接口不能实例化,类可以实例化
    • 类是一个事物是什么出发,考虑是如何表述一个事物
      • 定义属性
      • 创建对象,通过为属性赋值,描述一个具体事物
    • 接口是从一个事物可以做什么出发,或者规范一个标准
      • 定义抽象方法
      • 通过实现类实现方法

3.3 抽象类和接口的比较

接口是一种特殊的抽象类

  • 相同点
    • 都可以定义抽象方法,静态常量
    • 都不能实例化
  • 不同点
    • 抽象类可以定义属性,实例方法,构造方法,接口不能定义
    • 接口中的抽象方法,可以不定义public abstract 默认就有
    • 接口中的静态常量,可以不定义public static final 默认就有
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值