今日所学:
掌握final关键词和接口interface
一、final关键词
1>final 可以修饰类、方法还有变量
final 修饰类的话,不能被继承
final修饰方法的话,不能被重写
final修饰变量的话,该变量理解为常量,因此必须赋初值
2>interface 接口
1.声明 [修饰符] interface 接口名称[父类接口列表]{
方法:[public] [abstract] 返回类型 函数名称(参数列表);
变量:[public][static][final] 数据类型 变量名称=初始值;
注:接口中所有方法都是抽象的、公有的
接口中所有成员变量默认都是公有的、静态的、终值的变量
}
2. 接口可以被继承 一个类只能继承一个类 但是可以继承(实现)多个接口
格式: [修饰符] class 类名<泛型> extends 父类 implements [接口列表]
1>实现接口的类 不可以降低方法的可见性
2>实现接口的类 必须重写接口中所有的方法
3.使用接口的原因: 1)实现方法声明和方法实现相分离 2) 使多个类表现出相同的行为 3)由于一个类可以实现多个接口,因此可以实现多重继承
接口使用条件:解耦 不同的场景
例:老板要开会,校长也能开会 他们都是人 但不能把他们归到人这个属性 因为不是所有的人都能开会。 此时,场合不同但是具有相同的行为 这个时候我们就要抽象出一个开会的行为 用的时候只需定义 函数 dosomething(开会的接口 对象)
4.接口和抽象类一样 不能直接创建对象 但是可将一个接口的引用指向一个实现了该接口的类的实例
5.接口可以定义类的内部成员
6.接口和抽象类的相同点和不同点
相同点:1)抽象类和接口都包含抽象方法 2)接口和抽象类都不可被实例化 但都可以将其引用指向实现了该接口(或抽象类)的类的实例
不同点:1)抽象类可以有非抽象方法 接口中方法默认都是抽象的 2)接口约定了多个互不相关的类的共同行为 抽象类约定了多个子类之间共同使用的方法 3)抽象类和子类是单重继承 一个类可以实现多个接口,多个接口之间用逗号隔开 4)实现接口意味着能够“做什么” 继承抽象类意味着“是什么”
7.抽象类和接口如何选择:
1)如果不需要定义成员变量和方法 优先使用接口 主要考虑 : 你是要“做什么”还是“是什么”
2)变更已存在的功能时用继承 增加功能时用接口
3)几个人写一个模块时,接口更有利于并行开发和单元测试
在图形界面的时候 会大量用到接口和抽象类 Java API 是应用程序接口集合
以下代码中为上面知识点的测试,并带有注释
interface interA{
int a=0; //The blank final field a may not have been initialized
public abstract void f();//{//Abstract methods do not specify a body
//}
void f1();
}
class Aclass implements interA{//定义了一个实现接口interA的类
//- The type Aclass must implement the inherited abstract method
public void f1(){//不要忘记 public 接口中所有方法默认访问权限都是public
System.out.println("实现了接口中的方法 f1()");
}
public void f(){
}
}
public class TestInterface {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 接口不能直接实例化,但是可以将一个实现了接口的类 赋值给接口对象
Computer c= new Computer();
c.plugin(new Phone());
c.plugin(new Vivo());
}
}
//定义了一个USB接口 实现了接口的类 分别是phone vivo 这样两个设备都可以在电脑上使用
//我们将接口的规范称为标准 制定标准 由实现接口的类具体实现标准的方法 由标准使用者 (电脑)具体使用
interface USB{//标准制定 抽象的定义一个实现该标准的类 应该具备什么功能或行为
public void install();
public void work();
}
class Computer{//标准使用
public void plugin(USB usb){//标准使用者只需要传过来一个实现标准的类的对象即可,不关心该对象内部是如何具体工作的
usb.install();
usb.work();
}
}
class Phone implements USB{//标准实现
public void install(){
System.out.println("安装phone驱动程序");
}
public void work(){
System.out.println("phone手机与电脑进行工作");
}
}
class Vivo implements USB{//标准实现
public void install(){
System.out.println("安装vivo手机驱动程序");
}
public void work(){
System.out.println("vivo手机与电脑进行工作");
}
}
class A{
final void f(){
}
// final int a; //The blank final field a may not have been initialized
}
class B extends A{
//void f(){
//Cannot override the final method from A 不能被重写
//}
}