接口:
ActionListener 接口:
有一个方法,且没有方法体
定义: interface /class
- 1: 接口中所有的属性变量,都默认由static final 关键字修饰
- 2: 接口中的方法,都默认为没有方法体的方法 ,抽象方法
- 也可以定义 静态的、默认的方法
- 格式 : interface 接口名{ }
static:
静态的 、 唯一
- 修饰 属性: 属性属于类,由类名直接调用,属性只会在内存存在一份
- 修饰 方法: 类名可以直接调用,不能直接使用本类的成员属性变量
final:
最终形态的 、 不可变
- 修饰属性: 定义常量
- 修饰方法: 不能被子类重写
- 修饰类:不能有子类,不能被继承
实例:
package com.oop.zyf1012;
public class User{
// 只有一份存在,类名直接调用,值是可以变的
static int num;
int n;
// 必须初始化赋值 之后不能改变值 常量
final int id;
static int idcount=0;
{// 初始化 代码块中初始化 常量
id=idcount++;
}
// public User(int id){// 初始化 构造方法中初始化
this.id=id;
// }
// 只存在一份 也不可变
static final double PI=3.1415926D;
String name;
public static void main(String[] args){
Math.min (10,20);
System.out.println (num++);
// System.out.println (User.name);
System.out.println (User.num++);
User user1 = new User();
User user2 = new User();
System.out.println (user1.num++);
System.out.println (user2.num++);
System.out.println (num);
System.out.println (user1.n++);
System.out.println (user2.n++);
// final 修饰的变量不可以再赋值
// System.out.println (user1.id++);
// System.out.println (PI++);
// id 可以改吗,不能改
// 每个对象的id不一样,但 id 是常量
System.out.println (user1.id);
System.out.println (user2.id);
}
}
抽象:
-
抽象方法: 对于行为/功能的抽象
-
类的方法是具体的:
- 对于功能的扩展不方便
-
使用接口:
- 以接口中的方法作为 功能/行为的模板
- 在接口的实现类、基于功能方法的模板进行自定义开发功能
-
示例:买车票: 深圳到北京 是一个抽象行为 ,具体实现从深圳到北京方式以及路线是可以变化的
- 起始站 目的站 Q
- A C
- 火车票
- A Z C
- A R F C
- A F V C
- 火车票
- 抽象行为定义为接口
- 每种具体的实现方式 作为接口的实现类
流程:
- 1:创建一个类实现接口 implements
- 2: 重写接口中的抽象方法 为实体方法
// 出行的 不同策略
public interface SZToBJ{
void fromSZtoBeiJing();
}
public class User{
// 由接口作为参数类型 定义一个参数
public void goBeijing(SZToBJ tobj){
// 接口变量名调用接口的抽象方法
tobj.fromSZtoBeiJing ();
}
}
public class SZToBJ_01 implements SZToBJ{
// 重写方法
@Override
public void fromSZtoBeiJing(){
System.out.println ("深圳出发");
System.out.println ("经停拉萨");
System.out.println ("到达北京");
System.out.println ("费用:2000");
}
}
class SZToBJ_02 implements SZToBJ{
// 重写方法
@Override
public void fromSZtoBeiJing(){
System.out.println ("深圳出发");
System.out.println ("经停重庆");
System.out.println ("到达北京");
System.out.println ("费用:1500");
}
}
class SZToBJ_03 implements SZToBJ{
// 重写方法
@Override
public void fromSZtoBeiJing(){
System.out.println ("深圳出发");
System.out.println ("经停上海");
System.out.println ("经停杭州");
System.out.println ("到达北京");
System.out.println ("费用:2500");
}
}
class Main{
public static void main(String[] args){
// 基于接口 实现了三种方式的实现类
SZToBJ_01 tb01=new SZToBJ_01 ();
SZToBJ_02 tb02=new SZToBJ_02 ();
SZToBJ_03 tb03=new SZToBJ_03 ();
// 用户选择其中一种
user1.goBeijing (tb02);
user1.goBeijing (tb01);
}
}
实例2 :
/**
* 抽象锁接口
* - 自己创建一个类,实现接口,从而实现一把具体的锁
* - Lock 具有对于 开 关 行为的分类 功能
* - 所有的实现了Lock的实际锁 都是Lock 接口的子类
*/
public interface Lock{
void lock();
void unlock();
}
package com.oop.zyf1011;
public class Door{
Lock lock; // 接口声明对象变量名
public void open(){
lock.unlock ();
}
public void close(){
lock.lock ();
}
}
class DoorManage{
public static void main(String[] args){
Door door1 = new Door ();
// 先给 lock 初始一个具体的锁对象
// 创建了Lock 接口的子类对象
FaceIDLock faceIDLock = new FaceIDLock ();
// 装锁
door1.lock = faceIDLock;
door1.open ();
door1.close ();
KeyLock keylock = new KeyLock ();
door1.lock=keylock;
door1.open ();
door1.close ();
}
}
package com.oop.zyf1011;
public class FaceIDLock implements Lock{
@Override
public void unlock(){
System.out.println ("人脸识别正确,解锁 开门 ");
}
@Override
public void lock(){
System.out.println ("人脸识别正确,上锁 关门");
}
}
package com.oop.zyf1011;
public class KeyLock implements Lock{
@Override
public void unlock(){
System.out.println ("Key 验证正确,解锁开门!");
}
@Override
public void lock(){
System.out.println ("Key 验证正确,上锁 关门 ");
}
}