4抽象类及接口
4.1 final关键字
1. final关键字在Java中被称为完结器,表示最终的意思。
2. final关键字可以声明类、属性和方法:
定义:final class 类名{ }
修饰符 final 返回值类型 方法名(){ }
3.
① 使用final声明的类不能被继承。
② 使用final声明的方法不能被重写。
③ 使用final声明的变量会变为常量,常量是不可修改的。
4.2抽象类
1. 抽象类:包含一个抽象方法的类就是抽象类。
2. 抽象方法:声明而未被实现的方法,抽象方法必须使用abstract关键字声明。
3. 抽象类被子类继承,子类(不是抽象类)必须重写抽象类中的所有抽象方法。
4. 定义:abstract class 类名{
属性;
方法;
抽象方法;//不是必须的
}
抽象方法:修饰符 abstract 返回值类型 方法名();//注意最后是以分号结尾。
5. 抽象类不能直接实例化,必须通过子类实例化。
4.3接口
1. 接口是Java中非常重要的概念。接口定义了一系列的抽象方法和常量,形成一个属性集合。
2. 接口定义完成后任何类都可以实现接口,且一个类可以实现多个接口。接口用来弥补Java单继承带来的不足。
3. 实现接口的类必须实现接口中定义的抽象方法。
4.3.1接口的定义
1. 定义:
修饰符 interface 接口名{
//接口内容
//声明变量
类型 变量名;
……
//声明方法
返回值类型 方法名(); //分号结尾
……
}
① 接口的修饰符只能是默认的(无修饰符)或public。当修饰符是默认的,接口是包可见的,在接口所在的包之外的类不能使用接口。修饰符为public时,任何类都可以使用该接口。
② 接口内的变量被自动设置为共有的、静态的、最终的字段。如: int age; 实际效果是: public static final int age; 在接口定义变量时可以把它明确定义为public static final,但因为字段会被自动地设置为这些类型,所以可以不写出。变量名用大写字母表示。
③ 接口定义的方法都是抽象方法,被自动设置为public abstract。
④ 接口也被保存为.java文件,文件名与接口名相同。
⑤ 完整地接口定义如下:
4.3.2接口的实现
(一)接口的实现是指具体实现接口的类。接口的声明仅仅给出了抽象方法,实现接口的类必须要实现接口中定义的方法。
(二)实现接口的形式:
class 类名 implements 接口1,接口2{
方法1(){
//方法体
}
方法2(){
//方法体
}
}
① 多个接口用逗号隔开;
② 如果实现接口的类不是抽象类,它必须实现接口中定义的所有方法。如果该类为抽象类,在它的子类甚至子类的子类中要实现接口中定义的方法。
③ 实现接口的方法必须使用相同的方法名和参数列表。
④ 实现接口类中的方法必须被声明为public,因为在接口中的方法都被定义为public,根据继承的原则,访问范围只能放大不能缩小。
(三)实例
接口定义如下:
interface Grandfather{
int GAE = 100;
void say();
void sleep();
}
实现接口的类如下:
class Father implements Grandfather{
//实现say方法
public void say() {
System.out.println("father");
}
//实现sleep方法
public void sleep() {
System.out.println("I sleep 8 hours");
}
public static void main(String[] args) {
Father s = new Father();
s.say();
s.sleep();
}
}
(四)接口之间也可以有继承关系。继承接口的接口拥有它的父类接口的方法,他还可以定义自己的方法,实现这个子接口的类要实现所有这些方法。
interface grandfather{
int GAE = 100;
void say();
void sleep();
}
interface father extends grandfather{
void eat();
}
class daughter implements father{
@Override
public void say() {
System.out.println("daughter");
}
@Override
public void sleep() {
System.out.println("I sleep 10 hours");
}
@Override
public void eat() {
System.out.println("I like eat fruits");
}
public static void main(String[] args) {
daughter d = new daughter();
d.eat();
}
}
4.4抽象类和接口的比较
l 一个类可以实现多个接口,但只能继承一个抽象类。
l 抽象类可以有非抽象方法;接口中定义的方法必须全部是抽象方法。
l 抽象类中定义的方法修饰符可以是public/protected/private,也可以是默认值;但在接口中只能是public。
l 抽象类可以有构造函数,接口不能。两者都不能实例化,但是都能通过它们来存放子类对象或是实现类的对象。可以说它们都可以实现多态。