抽象类
概念
Java中可以定义没有方法体的方法,该方法由其子类来具体的实现
该没有方法体的方法我们称之为抽象方法
含有抽象方法的类我们称之为抽象类
抽象类可以理解为是一个只有方法声明没有方法体的特殊类
abstract 修饰符 返回值 方法名(参数列表)
抽象的 class Animal{
抽象的 public void eat(); //父类方法体提供了显得多余,那就不提供方法体,没有方法体的方法 -- 抽象方法
}
class Cat extends Animal{
@Override
public void eat(){
syso("猫吃鱼");
}
}
class Dog extends Animal {
}
特点
- 通过java关键字abstract实现
- 可以修饰方法或者类
- 抽象类中可以没有抽象方法(由子类去实现)【此时将此类定义为抽象类仅仅是不希望该类被实例化】
- 如果类中有抽象方法,那该类必须定义为一个抽象类
- 子类继承了抽象类以后,要么还是一个抽象类,要么就把所有抽象方法都重写
- 多用于多态中
- 抽象类不可以被实例化
抽象类的用法
构造函数
常用于子类的实例化
package cn.tedu.abstractdemo;
//抽象类的用法
public class Test2_UseAbstract {
public static void main(String[] args) {
//TODO 创建多态对象测试
Animal a = new Dog();
}
}
//创建父类
abstract class Animal{
//TODO 抽象类提供构造方法:不是为了创建抽象类的对象(也不能创建),而是为了创建子类对象
public Animal() {
System.out.println("构造方法");
}
}
//创建子类
class Dog extends Animal{
public Dog() {
super();//默认就有
}
}
成员变量
既可以有变量,也可以有常量。
package cn.tedu.abstractdemo;
//抽象类的用法
public class Test2_UseAbstract {
public static void main(String[] args) {
//TODO 创建多态对象测试
Animal a = new Dog();
}
}
//创建父类
abstract class Animal{
//TODO 提供构造方法:不是为了创建抽象类的对象,而是为了创建子类对象
public Animal() {
System.out.println("构造方法");
}
int sum ;//抽象类中可以写变量
final int count = 10;//抽象类中可以写常量
}
//创建子类
class Dog extends Animal{
public Dog() {
super();//默认就有
}
}
成员方法
抽象类里,既可以有普通方法,有可以有抽象方法
abstract关键字注意事项
抽象方法要求子类继承后必须重写
abstract关键字不可以和哪些关键字一起使用呢?
以下关键字,在抽象类中。用是可以用的,只是没有意义了
- private:被私有化后,子类无法重写,与abstract相违背
- static:静态的,优先于对象存在。而abstract是对象间的关系,存在加载顺序问题
- final:被final修饰后,无法重写,与abstract相违背
案例
接口
概念
Java里面由于不允许多重继承,所以如果要实现多个类的功能,则可以通过实现多个接口来实现
Java接口和Java抽象类代表的就是抽象类型,就是我们需要提出的抽象层的具体表现
OOP面向对象的编程,如果要提高程序的复用率,增加程序的可维护性,可扩展性.
就必须是面向接口的编程,面向抽象的编程,
正确地使用接口、抽象类这些太有用的抽象类型做为java结构层次上的顶层
interface 接口名{ 代码… }
特点
- 接口中都是抽象方法
- 通过interface关键字创建接口
- 只有public和默认可以用来修饰接口
- 通过implements让子类来实现 class Student implements Person
- 可以理解成,接口是一个特殊的抽象类,特殊在,接口中都是抽象方法
- 接口突破了java的单继承的局限性class Student implements Person,Human
- 接口和类之间可以多实现,接口和接口之间可以多继承interface A extends B,C
- 接口是对外暴露的规则,是一套开发规范
- 接口提高了程序的功能扩展,降低了耦合性
接口的用法
构造方法
接口里是没有构造方法的。
在创建实现类的对象时默认的super(),是调用的默认Object的无参构造。
成员变量
接口里没有成员变量,都是常量。所以,你定义一个变量没有写修饰符时,默认会加上:
public static final
成员方法
接口里的方法,默认就都是抽象的,如果你不写明是abstract的,那会自动补齐
例如:public abstract void save
案例
接口文件
主程序文件与执行结果
总结
类与类的关系
- 单继承
- 子类可以使用父类的全部资源(除了私有成员)
- 子类可以重写父类的方法(函数声明完全一致)
- 重写不会影响父类的方法,只改变子类自己的方法
类与接口的关系
- 多实现(接口之间用逗号隔开)
- 类必须重写所实现接口的全部抽象方法,否则就需要被声明为抽象类
- 类可以在继承的同时多实现
接口与接口的关系
- 多继承
- 继承接口的接口可以拥有被继承接口的全部功能
抽象类
- 是一个特殊的类
- 不能实例化
- 可以有变量,也可以有常量
- 抽象类中有构造方法(是为了给子类创建对象)
- 可以有抽象方法,也可以有一般方法
- 可以全是抽象方法
- 可以全是一般方法(此时仅仅是为了不被实例化)
接口
- 是一个特殊的抽象类(特殊在接口里的方法都是抽象方法)
- 无构造方法(子类创建对象时默认调用Object类的构造方法)
- 只有抽象方法(默认添加 abstract public)
- 只有常量(默认添加 public static final)
接口和抽象类的异同
- 接口和抽象类都不能直接实例化(new),果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象
- 接口需要被实现,抽象类需要被继承
- 接口之间可以多继承,抽象类之间只能单继承
- 接口必须全是抽象方法(只能定义声方法,不能实现方法),抽象类可以有一般方法,甚至全是一般方法
- 接口是设计的结果 ,抽象类是重构的结果
- 抽象类可以实现接口,反之不能
- 接口中没有变量只有常量,抽象类中可以有变量有常量
- 接口没有构造函数,抽象类有构造函数
- 抽象类和接口里的抽象方法必须全部被子类重写,否则该子类为抽象类
- 抽象类里可以没有抽象方法
- 如果一个类里有抽象方法,那么这个类只能是抽象类
- 抽象方法要被实现,所以不能是静态的,也不能是私有的
10 : 抽象类和接口
原文:https://www.cnblogs.com/aqin1012/p/12184542.html