使用abstract修饰的方法没有方法体,只有声明。
定义是一种“规范”,就是告诉子类必须要给抽象方法提供具体的实现
含有抽象方法的类一定为 抽象类
public abstract class Test1 {
abstract public void sayHello(); //只有声明没有方法体
public void commonMethod() {
System.out.println("在抽象类中也可以定义普通方法");
}
}
先从一个例子中提出抽象类的使用要点
关于抽象方法主要有两点:第一:没有实现 第二:子类必须实现
public abstract class Pet {
public abstract void eat();
public abstract String sleep();
public void run() {
System.out.println("Pet.run()");
}
public static void main(String[] args) {
//Pet p1 = new Pet(); **//抽象类不能被实例化**
Pet p2 = new Dogs();
p2.eat(); //Dogs.eat()
}
}
class Dogs extends Pet{
@Override
public void eat() { //子类必须实现父类的抽象方法 否则报错
System.out.println("Dogs.eat()");
}
@Override
public String sleep() { //返回值类型也必须保持一致
return "Dogs.sleep()";
}
}
抽象类的作用:
通过抽象类可以严格的定义子类的规范
抽象类的意义就是给子类提供统一的设计模板 让子类去实现
抽象类的使用要点
1.有抽象方法的类一定是抽象类
2.抽象类不可被实例化 即不可被new
3.子类必须实现父类的抽象方法 否则报错。
重写抽象方法的规则 与 继承重写父类方法的规则相同
1.方法名,形参列表必须相同
2.返回值类型和声明异常类型,子类必须小于等于父类
3.访问权限,子类大于等于父类
抽象类的继承关系
1.当一个普通类继承了一个抽象类,并重写了抽象方法后,这个普通类再被继承的时候,其子类不需要重写父类所重写的抽象方法,因为子类的父类是个普通类。
例如这个例子CanFly继承抽象类 但是CanFly是个普通类,当子类Bird继承普通父类CanFly 不需要再重写eat()方法。
2.继承抽象父类的类也可以是一个抽象类,重写父类抽象方法的方法也可以是一个抽象方法。
当一个重写父类的抽象方法的方法仍然是一个抽象方法的时候,这个类再被继承时,就必须重写此方法,因为他的父类也是一个抽象类。
例如这个例子,重写Animal类抽象方法eat()的方法可以仍然是一个抽象方法,所对应的CanFly类也就是一个抽象类,当这个CanFly类再被继承时,其子类必须重写eat()方法。