类中只要有抽象方法,该类必须也是抽象的,也必须使用abstract修饰类
抽象类不能实例化,子类必须全部重写父类中的抽象方法才能创建对象
抽象类的构造方法:可以对子类对象进行初始化,或定义一组固定的方法调用逻辑;
抽象类中可以没有抽象方法,定义抽象的目的:不让类创建对象(该类中某些方法体为空),创建对象无意义;
抽象关键字不能与private,final,static共存;
抽象类的应用:
父类定义好方法的调用逻辑,但是方法的具体实现交给子类去完成
示例
Parent类
abstract public class Parent {
Parent() {
//调用父类中固定好的处理逻辑
fixedMethodInvoke();
}
/**
* 调用逻辑固定:父类中的调用逻辑已经是确定好的
* 方法的实现不同:method()由不同子类进行不同的实现
*/
private void fixedMethodInvoke() {
say();
method();
hello();
}
public void say() {
System.out.println("say");
}
public void hello() {
System.out.println("hello");
}
//具体逻辑由子类来实现
abstract public void method();
}
ChildA
public class ChildA extends Parent {
@Override
public void method() {
System.out.println("ChildA.method()");
}
}
ChildB
public class ChildB extends Parent {
@Override
public void method() {
System.out.println("ChildB.method()");
}
}
测试
public class Test {
public static void main(String[] args) {
new ChildA();
System.out.println();
new ChildB();
}
/*
say
ChildA.method()
hello
say
ChildB.method()
hello
* */
}
========================================================================
继承+抽象 ---> 设计
继承:侧重属性、方法的复用;
抽象:在继承的前提下,侧重于方法的定义,具体实现交给子类完成;
接口:侧重于功能的扩张,可与继承结合使用,达到更强的功能;
public abstract class Employee {
private String name;
private String id;
private double salary;
public Employee(String name, String id, double salary) {
this.name = name;
this.id = id;
this.salary = salary;
}
public abstract void work();
}
public class Programmer extends Employee {
public Programmer(String name, String id, double salary) {
super(name, id, salary);
}
@Override
public void work() {
System.out.println("普通程序员在干活");
}
}
public class Manager extends Employee {
private double bonus;
public Manager(String name, String id, double salary, double bonus) {
super(name, id, salary);
this.bonus = bonus;
}
@Override
public void work() {
System.out.println("经理在设计程序的架构");
}
}