java面向对象20抽象类abstract的使用

/*

  • 抽象类与抽象方法,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 + "]";
	}
		
}
发布了47 篇原创文章 · 获赞 1 · 访问量 1050

猜你喜欢

转载自blog.csdn.net/wisdomcodeinside/article/details/104396168