abstract关键字的使用
1.abstract:抽象的 2.abstract可以用来修饰的结构:类、方法
3.abstract修饰类:抽象类
> 此类不能实例化
> 抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)
> 开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作
4.abstract修饰方法:抽象方法
> 抽象方法只有方法的声明,没有方法体
> 包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法的。
> 若子类重写了父类中的所有的抽象方法后,此子类方可实例化
若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰
abstract使用上的注意点: 1.abstract不能用来修饰:属性、构造器等结构
2.abstract不能用来修饰私有方法、静态方法、final的方法、final的类
练习1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public abstract class Employee { private String name; private int id; private double salary; public Employee () { super (); } public Employee (String name, int id, double salary) { super (); this .name = name; this .id = id; this .salary = salary; } public abstract void work () ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 public class Manager extends Employee { private double bonus; public Manager (double bonus) { super (); this .bonus = bonus; } public Manager (String name, int id, double salary, double bonus) { super (name, id, salary); this .bonus = bonus; } @Override public void work () { System.out.println("管理员工,提供公司运行的效率" ); } }
1 2 3 4 5 6 7 8 public class CommonEmployee extends Employee { @Override public void work () { System.out.println("员工在一线车间生产产品" ); } }
测试: 1 2 3 4 5 6 7 8 9 10 11 12 13 public class EmployeeTest { public static void main (String[] args) { Employee manager = new Manager("库克" , 1001 , 5000 , 50000 ); manager.work(); CommonEmployee commonEmployee = new CommonEmployee(); commonEmployee.work(); } }
补充: 抽象类的匿名子类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 public class PersonTest { public static void main (String[] args) { method(new Student()); Worker worker = new Worker(); method1(worker); method1(new Worker()); System.out.println("********************" ); Person p = new Person(){ @Override public void eat () { System.out.println("吃东西" ); } @Override public void breath () { System.out.println("好好呼吸" ); } }; method1(p); System.out.println("********************" ); method1(new Person(){ @Override public void eat () { System.out.println("吃好吃东西" ); } @Override public void breath () { System.out.println("好好呼吸新鲜空气" ); } }); } public static void method1 (Person p) { p.eat(); p.breath(); } public static void method (Student s) { } } class Worker extends Person { @Override public void eat () { } @Override public void breath () { } }
抽象类的应用:模板方法的设计模式: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 public class TemplateTest { public static void main (String[] args) { SubTemplate t = new SubTemplate(); t.spendTime(); } } abstract class Template { public void spendTime () { long start = System.currentTimeMillis(); this .code(); long end = System.currentTimeMillis(); System.out.println("花费的时间为:" + (end - start)); } public abstract void code () ; } class SubTemplate extends Template { @Override public void code () { for (int i = 2 ;i <= 1000 ;i++){ boolean isFlag = true ; for (int j = 2 ;j <= Math.sqrt(i);j++){ if (i % j == 0 ){ isFlag = false ; break ; } } if (isFlag){ System.out.println(i); } } } }
练习2:
代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 public abstract class Employee { private String name; private int number; private MyDate birthday; public Employee (String name, int number, MyDate birthday) { super (); this .name = name; this .number = number; this .birthday = birthday; } public String getName () { return name; } public void setName (String name) { this .name = name; } public int getNumber () { return number; } public void setNumber (int number) { this .number = number; } public MyDate getBirthday () { return birthday; } public void setBirthday (MyDate birthday) { this .birthday = birthday; } public abstract double earnings () ; @Override public String toString () { return "name=" + name + ", number=" + number + ", birthday=" + birthday.toDateString(); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 public class MyDate { private int year; private int month; private int day; public MyDate (int year, int month, int day) { super (); this .year = year; this .month = month; this .day = day; } public int getYear () { return year; } public void setYear (int year) { this .year = year; } public int getMonth () { return month; } public void setMonth (int month) { this .month = month; } public int getDay () { return day; } public void setDay (int day) { this .day = day; } public String toDateString () { return year + "年" + month + "月" + day + "日" ; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 public class SalariedEmployee extends Employee { private double monthlySalary; public SalariedEmployee (String name, int number, MyDate birthday) { super (name, number, birthday); } public SalariedEmployee (String name, int number, MyDate birthday,double monthlySalary) { super (name, number, birthday); this .monthlySalary = monthlySalary; } public double getMonthlySalary () { return monthlySalary; } public void setMonthlySalary (double monthlySalary) { this .monthlySalary = monthlySalary; } @Override public double earnings () { return monthlySalary; } public String toString () { return "SalariedEmployee[" + super .toString() + "]" ; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 public class HourlyEmployee extends Employee { private int wage; private int hour; public HourlyEmployee (String name, int number, MyDate birthday) { super (name, number, birthday); } public HourlyEmployee (String name, int number, MyDate birthday,int wage,int hour) { super (name, number, birthday); this .wage = wage; this .hour = hour; } public int getWage () { return wage; } public void setWage (int wage) { this .wage = wage; } public int getHour () { return hour; } public void setHour (int hour) { this .hour = hour; } @Override public double earnings () { return wage * hour; } public String toString () { return "HourlyEmployee[" + super .toString() + "]" ; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 import java.util.Calendar;import java.util.Scanner;public class PayrollSystem { public static void main (String[] args) { Calendar calendar = Calendar.getInstance(); int month = calendar.get(Calendar.MONTH); Employee[] emps = new Employee[2 ]; emps[0 ] = new SalariedEmployee("马森" , 1002 ,new MyDate(1992 , 2 , 28 ),10000 ); emps[1 ] = new HourlyEmployee("潘雨生" , 2001 , new MyDate(1991 , 1 , 6 ),60 ,240 ); for (int i = 0 ;i < emps.length;i++){ System.out.println(emps[i]); double salary = emps[i].earnings(); System.out.println("月工资为:" + salary); if ((month+1 ) == emps[i].getBirthday().getMonth()){ System.out.println("生日快乐!奖励100元" ); } } } }