当父类的某些方法,需要声明,但是又不确定如何实现时,可以用abstract关键字修饰该方法这个方法就变成了抽象方法。
同理用abstract修饰类该类就是抽象类。抽象方法只能存在抽象类中
举例说明:
现在有一个Animal类,这是一个动物类,所有的动物都有一个行为,就是吃。所以定义一个eat方法,但是由于现在不知道它是什么动物 ,所以不知道它吃什么。也就是父类的不确定性,此时就需要使用abstract修饰eat方法,使其可以不被实现,也就是不用写方法体。
abstract class Animal{
private String name;
public abstract void eat();
}
上面将Animal类变成了一个抽象类,将eat变成了一个抽象方法。所以eat可以不用具体实现,没有方法体。
那么一般抽象类的抽象方法一般是由子类去实现的。
就相当于老板布置了目标,交给主管,主管比较懒不想完成,所以又交给了底层员工。总之只要继承了抽象类,只有也变成抽象类,或者实现抽象方法。两条路
不能,因为final修饰的方法,子类不可以重写
不能,因为static和abstract会产生冲突
不能,因为private修饰的,子类无法重写
public class test12 {
public static void main(String[] args) {
Manager wang = new Manager("王中",2333,10000,2999);
wang.work();
CommonEmployee li = new CommonEmployee("李三",899,9000);
li.work();
}
}
abstract class Employee{
private String name;
private int id;
private double sal;
public abstract void work();
public Employee(String name, int id, double sal) {
this.name = name;
this.id = id;
this.sal = sal;
}
public String getName() {
return name;
}
public int getId() {
return id;
}
public double getSal() {
return sal;
}
}
class Manager extends Employee{
private double bonus;
public Manager(String name, int id, double sal, double bonus) {
super(name, id, sal);
this.bonus = bonus;
}
@Override
public void work() {
System.out.println("经理:"+getName()+"正在工作中");
}
}
class CommonEmployee extends Employee{
public CommonEmployee(String name, int id, double sal) {
super(name, id, sal);
}
@Override
public void work(){
System.out.println("普通员工:"+getName()+"正在工作中");
}
}
public class Test {
public static void main(String[] args) {
A a = new A();
a.Time();
B b = new B();
b.Time();
}
}
abstract class Template{
public abstract void job();
public void Time(){
long start = System.currentTimeMillis();
job();
long end = System.currentTimeMillis();
System.out.println("完成时间为:"+(end - start));
}
}
class A extends Template{
@Override
public void job(){
for (int i = 1; i <=700000 ; i++) {
i+=i;
}
}
}
class B extends Template{
@Override
public void job(){
for (int i = 1; i <=900000 ; i++) {
i+=i;
}
}
}