4、抽象类和接口()-其他
4、抽象类和接口()
接口和抽象类,主讲:汤小洋
一、final关键字
final表示最终的,可以用来修饰变量、方法和类
1. 修饰变量
被final修饰的变量,称为常量constant,常量的值不能被修改
被static final修饰的变量,称为静态常量,一般也简称为常量(使用较多)
常量命名规范:所有字母全部大写,多个单词之间使用下划线连接
应用:一般用于替代 / ,大多是难于阅读和理解的值
硬编码
僵尸代码
2. 修饰方法
被final修饰的方法,不能被重写
3. 修饰类
被final修饰的类,不能被继承,即不能有子类
final类中的所有方法都默认为final方法
4. 修饰参数
被final修饰的参数,只能读取,不能修改
二、抽象类
如何防止父类被实例化?
如何保证子类必须重写父类的方法?
1. 概念
被abstract修饰的类,称为抽象类
- 定义方式:public abstract class 类名{ }
public abstract class 类名{ }
- 抽象类不能被实例化,即不能使用new创建一个对象,只能被继承
被abstract修饰的方法,称为抽象方法
- 定义方式:public abstract 返回值类型 方法名();
public abstract 返回值类型 方法名();
- 抽象方法只有声明,没有具体实现,即没有方法体,以分号结尾
2. 特性
抽象类中可以有抽象方法,也可以没有抽象方法
含有抽象方法的类,必须为抽象类
子类继承抽象类后,必须实现/重写抽象类中所有的抽象方法,否则子类仍然为抽象类
抽象类中可以有构造方法,但不是用来创建对象的,而是用来初始化成员属性的
三、接口
如果一个抽象类中只有抽象方法和和常量,则可以定义为接口interface
1. 概念
从本质上讲,接口是一种特殊的抽象类,只能包含常量和抽象方法
2. 用法
2.1 定义接口
语法:
interface 接口名{ 常量; 抽象方法;}
接口中的属性,默认被 修饰,即接口中只能有常量
public static final
接口中的方法,默认被 修饰,即接口中只能有抽象方法
public abstract
接口中没有构造方法,不能实例化接口
2.2 实现接口
语法:
class 类名 extends 父类 implements 接口名{ }
实现接口的类,称为实现类
实现类必须实现接口中所有的抽象方法,且方法必须使用public修饰,否则其为抽象类
3. 特性
一个类可以实现多个接口,多个接口之间以逗号分隔
JDK1.8及以后,可以使用关键字修饰方法,此时方法可以有方法体,但一般都为空方法体(简化实现类的操作,无需实现所有方法)
default
一个接口可以继承多个其他接口,添加新属性和抽象方法,但接口不能继承类
Java中支持接口的多继承,但不支持类的多继承
接口实现多态:将接口的引用,指向其实现类的对象
4. 作用
接口的作用:
- 间接实现多继承(Java不支持多继承,但可以实现多个接口)
- 通过接口定义规范和标准
- 将标准的制定和实现分开
注:建议面向接口编程,提高扩展性
5. 接口与抽象类的比较
相同点:
- 接口和抽象类都不能被实例化
- 都可以包含抽象方法
不同点:
- 接口中只能有静态常量,抽象类中还可以有普通成员变量
- 接口中只能有抽象方法,抽象类中还可以有非抽象方法(使用default关键字时接口中也可以有非抽象方法)
default
- 接口不包含构造方法,抽象类可以包含构造方法
- 接口支持多继承,抽象类不支持多继承
接口和抽象类,主讲:汤小洋
一、final关键字
final表示最终的,可以用来修饰变量、方法和类
1. 修饰变量
被final修饰的变量,称为常量constant,常量的值不能被修改
被static final修饰的变量,称为静态常量,一般也简称为常量(使用较多)
常量命名规范:所有字母全部大写,多个单词之间使用下划线连接
应用:一般用于替代 / ,大多是难于阅读和理解的值
硬编码
僵尸代码
2. 修饰方法
被final修饰的方法,不能被重写
3. 修饰类
被final修饰的类,不能被继承,即不能有子类
final类中的所有方法都默认为final方法
4. 修饰参数
被final修饰的参数,只能读取,不能修改
二、抽象类
如何防止父类被实例化?
如何保证子类必须重写父类的方法?
1. 概念
被abstract修饰的类,称为抽象类
- 定义方式:public abstract class 类名{ }
public abstract class 类名{ }
- 抽象类不能被实例化,即不能使用new创建一个对象,只能被继承
被abstract修饰的方法,称为抽象方法
- 定义方式:public abstract 返回值类型 方法名();
public abstract 返回值类型 方法名();
- 抽象方法只有声明,没有具体实现,即没有方法体,以分号结尾
2. 特性
抽象类中可以有抽象方法,也可以没有抽象方法
含有抽象方法的类,必须为抽象类
子类继承抽象类后,必须实现/重写抽象类中所有的抽象方法,否则子类仍然为抽象类
抽象类中可以有构造方法,但不是用来创建对象的,而是用来初始化成员属性的
三、接口
如果一个抽象类中只有抽象方法和和常量,则可以定义为接口interface
1. 概念
从本质上讲,接口是一种特殊的抽象类,只能包含常量和抽象方法
2. 用法
2.1 定义接口
语法:
interface 接口名{ 常量; 抽象方法;}
接口中的属性,默认被 修饰,即接口中只能有常量
public static final
接口中的方法,默认被 修饰,即接口中只能有抽象方法
public abstract
接口中没有构造方法,不能实例化接口
2.2 实现接口
语法:
class 类名 extends 父类 implements 接口名{ }
实现接口的类,称为实现类
实现类必须实现接口中所有的抽象方法,且方法必须使用public修饰,否则其为抽象类
3. 特性
一个类可以实现多个接口,多个接口之间以逗号分隔
JDK1.8及以后,可以使用关键字修饰方法,此时方法可以有方法体,但一般都为空方法体(简化实现类的操作,无需实现所有方法)
default
一个接口可以继承多个其他接口,添加新属性和抽象方法,但接口不能继承类
Java中支持接口的多继承,但不支持类的多继承
接口实现多态:将接口的引用,指向其实现类的对象
4. 作用
接口的作用:
- 间接实现多继承(Java不支持多继承,但可以实现多个接口)
- 通过接口定义规范和标准
- 将标准的制定和实现分开
注:建议面向接口编程,提高扩展性
5. 接口与抽象类的比较
相同点:
- 接口和抽象类都不能被实例化
- 都可以包含抽象方法
不同点:
- 接口中只能有静态常量,抽象类中还可以有普通成员变量
- 接口中只能有抽象方法,抽象类中还可以有非抽象方法(使用default关键字时接口中也可以有非抽象方法)
default
- 接口不包含构造方法,抽象类可以包含构造方法
- 接口支持多继承,抽象类不支持多继承