回顾:
- abstract
- 修饰方法 抽象方法
- 没有方法体
- 必须定义在抽象类中
- 修饰类 抽象类
- 可以定义抽象方法
- 普通类中可以定义的一切,在抽象类中都可以定义
- 属性
- 构造方法
- 实例方法
- 普通类中可以定义的一切,在抽象类中都可以定义
- 不能实例化
- 子类必须重写父类的抽象方法
- 除非子类也是抽象类
- 可以定义抽象方法
- 修饰方法 抽象方法
- static
- 修饰属性 静态属性
- 数据类级别的属性
- 所有对象都共用一份
- 使用方法 类名.属性名
- 修饰方法 静态方法
- 目的:在调用方法时,不用创建对象
- 类名.方法名() 调用方法
- 一般情况下,把工具方法,公共方法定义成静态方法
- 修饰语句块 静态语句块
- 代码块 {}
- static {} 就是静态代码块
- 修饰属性 静态属性
- final
- 修饰变量
- 实例变量、属性
- 手动赋值
- 不能修改
- 修饰静态属性 – 常量
- 常量名全部大写
- 局部变量
- 不能修改
- 实例变量、属性
- 修饰方法
- 不能被重写
- 修饰类
- 不能被继承
- 修饰变量
一. 接口
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("猫叫--喵喵");
}
}
- 把抽象类中,所有的属性和非抽象方法(构造方法,实例方法)全部删除
- abstract class 修改成interface(接口)
- 可以把抽象方法的abstract修饰符删除
- 把子类继承父类的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 默认就有