一、对抽象类的理解
二、抽象类细节
- 定义一个抽象类 ```java abstract class Animal{
}
- 抽象类无法实例化,因此**抽象类就是用来被子类继承的**- final和abstract不能一起使用,这两个关键字对立;因为final修饰的类无法被继承,而抽象类就是用来被继承的```javafinal abstract class Animal{// 编译失败// java: 非法的修饰符组合: abstract和final}
- 抽象类的子类可以是抽象类,也可以是非抽象类
- 抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的
```java
abstract class Animal{
public Animal(int i){
} }// 这里加了个有参构造方法,此时系统就不会默认提供无参构造
class Bird extends Animal{ // 无法通过编译 // There is no default constructor available in ‘org.example.Animal’ // 说明抽象类中是默认存在一个无参构造方法的,这个构造方法是供子类使用的 // 子类在继承父类时,会在无参构造方法中使用super()调用父类的无参构造方法 }
abstract class Dog extends Animal{ // 无法通过编译 }
- 抽象类关联到抽象方法的概念,抽象方法就是使用abstract修饰的并且没有方法体的方法- 抽象类中不一定要有抽象方法,但是抽象方法一定只能写在抽象类中- **一个非抽象类继承一个抽象类,必须实现抽象类中的抽象方法!!!**- 面向抽象编程,降低程序耦合度,提高程序的扩展力;这种编程思想符合OCP开闭原则```javapublic class abstractTest {public static void main(String[] args) {// 多态// 父类型引用指向子类型对象Animal a = new Bird(); // 向上转型a.eat(); // 鸟儿飞翔!!!/*编译时这个eat()方法是Animal的运行时这个eat()方法是Bird的*/}}abstract class Animal{public abstract void eat();}class Bird extends Animal{@Overridepublic void eat() {System.out.println("鸟儿飞翔!!!");}}
- 面试题:Java中凡是没有方法体的方法都是抽象方法(error)
- public native int hashCode();
- 以上这个方法底层调用了C++写的动态链接程序库
- native表示调用JVM本地程序
