抽象类定义:Java语言中用abstract 关键字来修饰一个类时,这个类叫作抽象类。抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。抽象类可以看作是对类的进一步抽象。在面向对象领域抽象类主要用来进行类型隐藏。
1. 抽象类
abstract class Animal{ //可以是默认default 或者 public 或者 protected
public Animal(){ //抽象类有构造函数
System.out.println("Animal: 构造方法");
}
public abstract void run(); //抽象类可以有抽象方法也可以没有抽象方法,但是抽象方法一定存在抽象类中
public void eat(){ //抽象类可以有非抽象方法。
System.out.println("Animal: eat");
}
}
class Person extends Animal{
public Person() {
System.out.println("Person: 构造方法");
}
@Override
public void run() { //子类必须实现重写抽象父类所有的抽象方法否则子类继续成为一个抽象类
System.out.println("Person: run");
}
}
public class Main {
public static void main(String[] args) {
// Animal a = new Animal(); //Error,抽象类不允许实例化对象
Person p = new Person();
System.out.println("==================");
Animal a = new Person(); //上转型
a.eat(); //回调自己的非抽象方法
a.run(); //调用子类重写的方法
}
}
/*输出
Animal: 构造方法
Person: 构造方法
==================
Animal: 构造方法
Person: 构造方法
Animal: eat
Person: run
*/
a. 抽象类的定义只允许是非private类,一旦是private类就无法被子类继承那就没有意义了。
b. 抽象类不能实例化对象,因为子类继承抽象父类必须重写所有的父类方法否则子类自己也必须成为抽象类,因此可以解释出抽象类无法使用final修饰词。
c. 抽象类虽然无法进行实例化对象但是可以做为上整型对象,那么该对象可以调用子类的重写方法。
d. 抽象类虽然不能实例化对象但是存在构造方法。因为抽象类中可能存在一些属性需要初始化子类在继承抽象父类时必须先初始化父类才能再去初始化子类。
2. 抽象方法
abstract class Animal{ //可以是默认default 或者 public 或者 protected
protected abstract void play(); //protected修饰
public abstract void run(); //public修饰
abstract void sleep(); //默认default修饰
// private abstract void speak(); //错误
private void go(){ //非抽象的私有方法
System.out.println("Animal: go");
}
public void eat(){ //非抽象方法
System.out.println("Animal: eat");
}
}
a. 抽象类中可以有抽象方法也可以没有抽象方法,同时抽象类中也可以有非抽象方法。
b. 抽象方法同样只允许非private方法,否则子类继承的时候无法重写父类方法(Override)。但是可以有非抽象的private方法。
c. 子类必须实现抽象父类所有的抽象方法,否则子类继续成为一个抽象类
愿你走出半生,归来仍是少年~