/*
- 抽象类与抽象方法,abstract关键字
- abstract可以修饰类与方法,不能t修饰变量、代码块、构造器,
- 不能用abstract修饰私有方法、静态方法、final的方法、final的类。
- 1,用abstract关键字来修饰一个类,这个类叫做抽象类.
- 1.1抽象类不能被实例化
- 1.2类中一定要有构造器,便于子类实例化时调用。
- 1.3应用中都会提供抽象类的子类,让子类对象实例化。
- 2,用abstract来修饰一个方法,该方法叫做抽象方法。
- 2.1抽象方法只有声明,没有方法体,没有{},
- 2.2包含抽象方法的类一定是抽象类,否则类就会有实例,可能调取抽象方法。抽象类中不一定有抽象方法。
- 2.3抽象类的子类必须重写父类的抽象方法,并提供方法体。
- 若没有重写全部的抽象方法,仍为抽象类
- 3,抽象类在调用的时候可以使用匿名类的方式,在 只调用一次的情况下可以通过
- new 抽象类名(){}.方法名();的方式创建抽象类的匿名类,{}内部写入重写 的抽象方法。
- 4,模板方法设计模式
- 4.1抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板
- ,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式
- 4.2当功能内部一部分实现是确定的,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。
- 4.3换句话说,在软件开发中实现一个算法时,整体步骤很固定、通用,这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽象出来,供不同子类实现。这就是一种模板模式。
- 4.4模板方法设计模式是编程中经常用得到的模式。各个框架、类库中都有他的
- 影子,比如常见的有:
* 数据库访问的封装
* Junit单元测试
* JavaWeb的Servlet中关于doGet/doPost方法调用
* Hibernate中模板程序
* Spring中JDBCTemlate、HibernateTemplate等
*/
package object_chapter2;
import java.util.Calendar;
import java.util.Scanner;
public class Object_Abstract {
public static void main(String[] args) {
//非匿名类非匿名对象调用方式
Dog d = new Dog();
d.shout();
//非匿名类匿名对象调用方式
new Dog().eat();
//匿名类非匿名对象调用方式
Animal a = new Animal() {
@Override
void eat() {
// TODO Auto-generated method stub
System.out.println("bird eat bugs");
}
@Override
void shout() {
// TODO Auto-generated method stub
System.out.println("渣渣!!");
}
};
a.eat();
a.shout();
//匿名类匿名对象的调用
new Animal() {
@Override
void eat() {
// TODO Auto-generated method stub
}
@Override
void shout() {
// TODO Auto-generated method stub
System.out.println("嘶嘶嘶!!!");
}
}.shout();
//测试模板设计模式
Timer t = new FindPrime();
t.spendTime();
//测试练习
//获取当前月份方式1
// Scanner scan = new Scanner(System.in);
// System.out.println("请输入当前月份");
// int month = scan.nextInt();
//获取当前月份方式2
Calendar c = Calendar.getInstance();//Calendar是JDK中 提供的关于日期的抽象类
int month = c.get(c.MONTH) + 1; //月份数值从0到11,转换到正常数值需要加1.
System.out.println("当前月份是:" + month + "月");
Employee[] employeeList = new Employee[4];
employeeList[0] = new HourlyEmployee(1001, "join", new BirthDate(2000, 10, 1), 50, 256);
employeeList[1] = new SalariedEmployee(1002, "jake", new BirthDate(1995, 1, 11), 14000);
employeeList[2] = new HourlyEmployee(1003, "pork", new BirthDate(2002, 2, 1), 55, 244);
employeeList[3] = new SalariedEmployee(1004, "tony", new BirthDate(1990, 2, 11), 19000);
for (int i = 0; i < employeeList.length; i++) {
System.out.println(employeeList[i].toString());
if(month == employeeList[i].getBirthday().getMonth()){
System.out.println("生日福利加1000元");
System.out.println("当月工资是: " + (employeeList[i].earning() + 1000));
}else {
System.out.println("当月工资是: " + employeeList[i].earning());
}
}
}
}
abstract class Animal{
private String name;
private int age;
abstract void eat();
abstract void shout();
}
class Dog extends Animal{
@Override
void eat() {
// TODO Auto-generated method stub
System.out.println("dog eat bones");
}
@Override
void shout() {
// TODO Auto-generated method stub
System.out.println("汪汪汪!!!");
}
}
class Cat extends Animal{
@Override
void eat() {
// TODO Auto-generated method stub
System.out.println("cat eat fish");
}
@Override
void shout() {
// TODO Auto-generated method stub
System.out.println("喵喵喵!!!");
}
}
abstract class Timer{
void spendTime() {
long start = System.currentTimeMillis();
code();
long end = System.currentTimeMillis();
System.out.println("Programe spend time:" + (end - start));
}
abstract void code();
}
class FindPrime extends Timer{
@Override
void code() {
for (int i = 2; i <= 1000; i++) {
boolean mark = true;
for (int j = 2; j < Math.sqrt(i); j++) {
if(i % j == 0) {
mark = false;
break;
}
}
if(mark) {
System.out.println(i);
}
}
}
}
abstract class Employee{
private int ID;
private String name;
private BirthDate birthday;
abstract double earning();
public Employee() {
super();
}
public Employee(int iD, String name, BirthDate birthday) {
super();
ID = iD;
this.name = name;
this.birthday = birthday;
}
public int getID() {
return ID;
}
public void setID(int iD) {
ID = iD;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BirthDate getBirthday() {
return birthday;
}
public void setBirthday(BirthDate birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Employee [ID=" + ID + ", name=" + name + ", birthday=" + this.birthday.toDateString() + "]";
}
}
class BirthDate{
private int day;
private int month;
private int year;
public BirthDate() {
super();
}
public BirthDate(int year, int month, int day) {
super();
this.day = day;
this.month = month;
this.year = year;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
String toDateString() {
return year + "年" + month + "月" + day + "日";
}
}
class SalariedEmployee extends Employee{
private double monthlySalary;
public SalariedEmployee() {
super();
}
public SalariedEmployee(int iD, String name, BirthDate birthday,double monthlySalary) {
super(iD, name, birthday);
this.monthlySalary = monthlySalary;
}
public double getMonthlySalary() {
return monthlySalary;
}
public void setMonthlySalary(double monthlySalary) {
this.monthlySalary = monthlySalary;
}
@Override
double earning() {
// TODO Auto-generated method stub
return monthlySalary;
}
@Override
public String toString() {
return "SalariedEmployee [ " + super.toString() + ", monthlySalary=" + monthlySalary + "]";
}
}
class HourlyEmployee extends Employee{
private double hourlySalary;
private int hour;
public HourlyEmployee() {
super();
}
public HourlyEmployee(int iD, String name, BirthDate birthday,double hourlySalary,int hour) {
super(iD, name, birthday);
this.hourlySalary = hourlySalary;
this.hour = hour;
}
public double getHourlySalary() {
return hourlySalary;
}
public void setHourlySalary(double hourlySalary) {
this.hourlySalary = hourlySalary;
}
@Override
double earning() {
// TODO Auto-generated method stub
return hour * hourlySalary;
}
@Override
public String toString() {
return "HourlyEmployee [ " + super.toString() + ", hourlySalary=" + hourlySalary + ", hour=" + hour + "]";
}
}