**抽象**
什么是抽象
从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃。例如从学生对象中抽象出姓名、年龄、性别、成绩等属性
抽象的使用
抽象的声明需要使用abstract关键字进行修饰
声明抽象类
修饰符 abstract class 类名{ }
声明抽象方法
修饰符 abstract 返回类型 方法名();
抽象类和抽象方法的规则
- 抽象类和抽象方法都必须被abstract关键字修饰,并且抽象方法不允许有函数体
- 抽象类和抽象方法都不能被private修饰符修饰,因为抽象类需要被继承,抽象方法需要被重写。不过有一种例外的情况,当一个抽象类为内部类时,可以被private修饰。
- 抽象类可以不包含抽象方法,但是包含抽象方法的类一定要声明为抽象类
- 抽象类可以包含构造方法,但是抽象类不能被实例化为一个对象。不过我们可以通过父类的引用来指向子类的实例来间接地实现父类的实例化。
package com.chenjun;
abstract class Father {
public Father() {
System.out.println("抽象父类被实例化了");
}
}
public class Test extends Father {
public Test() {
System.out.println("子类被实例化了");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Father test = new Test();
}
}
输出结果为
抽象父类被实例化了
子类被实例化了
抽象类和接口的区别
- 抽象类用abstract关键字声明,接口用Interface关键字声明
- 接口中的变量会被隐式的指明为public static final变量(并且只能为public static final)接口中的方法会被隐式的指明为public abstract(在Java 8中接口中的方法可以用 public, abstract, default, static and strictfp are permitted等来修饰)
- 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法
- 一个类只能继承一个抽象类,但是一个类可以实现多个接口(单继承,多实现)
- 接口可以被看做一个极度抽象的抽象类
不论是继承抽象类还是实现接口子类都需要重写父类或者接口的抽象方法,因此引申一下重载和重写的区别
重载和重写的区别
- 重载发生在同一个类中,重写发生在具有父子关系的类或者实现了某个接口的类中
- 重载的概念是一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表(参数个数不同,参数顺序不同,参数类型不同)返回类型可以相同也可以不相同,但是不能作为函数重载的判断标准
- 重写的概念是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和兼容的返回类型
- 重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性