抽象类(abstract class)
基本概念
包含抽象方法的类叫做抽象类。
抽象方法被abstract修饰,类也要由abstract修饰。
抽象类中可以有抽象方法,也可以有非抽象方法。
抽象类不能创建实例对象 不能new抽象类。
抽象类中可以没有抽象方法,但是抽象方法一定在抽象类中。因为抽象类不能被实例化,抽象方法不能被实现。
抽象类和普通类的区别:
- 抽象类不能被实例化。可以定义抽象类型的变量,但值必须为null,或者是其派生类的非抽象类的实例的引用
- 抽象类被abstract所修饰
- 允许抽象类包含抽象成员
抽象方法(abstract method)
基本概念
在抽象类内部不给予实现。当有一个类继承了当前的抽象类后,需要实现。
抽象方法必须是public/protected/或者不加访问修饰限定符(默认为public),不能被private修饰
抽象类的派生类:
- 如果是普通类必须实现抽象类的抽象方法
- 如果是抽象类,可以不实现基类的派生方法
abstract class Animal {//抽象类
//抽象方法
public abstract void bark();
//非抽象方法
public void fun() {
System.out.println("abstract Animal fun()");
}
}
//抽象类派生的普通类
class Dog extends Animal {
public Dog() {
System.out.println("Dog() init");
}
public void bark() {
System.out.println("Dog:wangwang");
}//重写抽象类的抽象方法,注释掉会出错
}
public class Test {
public static void main(String[] args) {
//Animal animal = new Animal(); erro,抽象类无法进行实例化
Dog dog = new Dog();
dog.bark();
}
}
//输出结果
Dog() init
Dog:wangwang
密封类(final class)
当一个类被final所修饰的时候称为密封类。
作用:防止有意的派生。
注意:
- 密封类不能用作基类,就算派生类被final所修饰也不行。
- 密封类也不能是抽象类
密封方法(final method)
当实例方法声明包含final修饰符时,称该方法为密封方法
密封方法不能被重写。
final class Person {//密封类
private String name;
private int age;
public Person() {
System.out.println("Person init()");
}
class Student extends Person {//编译报错,不能从final类继承
}