一、为什么使用抽象类
类用于描述现实生活中的一类事物,类中有属性有方法,并且方法都有方法体。
某种情况下,父类只能知道子类应该具备一个怎样的方法,但是不能明确知道子类如何实现该方法
例如:几何图形(多态练习),所有几何图形都应该具备一个计算面积的功能,但是不同几何图形计算面积的方式不同
Java 为上述问题提供了相应的解决办法:
Java中允许父类中只是提供一个方法的声明,不提供具体的实现具体的实现交给子类来完成,该方法称为抽象方法”
拥有一个或多个抽象方法的类,称为抽象类”
二.如何使用抽象:abstract
1.使用abstract修饰的类成为"抽象类"
①格式:访问控制修饰符 abstract class 类名{}
②拥有一个或多个抽象方法的类必须是抽象类
③抽象类中可以有非抽象方法
④抽象类中也可以没有抽象方法
⑤***抽象类不能创建实例
⑥抽象类中可以有构造器。
目的:子类继承父类后,继承父类中所有的属性和方法,因此子类需要知道父类如何为对象进行初始化
2.使用abstract修饰的方法称为"抽象方法"
①格式:访问控制修饰符 abstract 返回值类型 方法名(参数列表);
②子类继承父类后,若重写了父类中”所有“的抽象方法,该类为具体类,可以创建实例
③子类继承父类后,若没有重写父类中”所有“的抽象方法,该类必须为抽象类,不能创建实例
3.abstract 和 final 二者不能同时使用
abstract 和 static 二者也不能同时使用
abstract 和private 二者也不能同时使用
4.具体类和抽象类的区别?
抽象类可为具体类父类
/*
一.为什么使用抽象类
类用于描述现实生活中的一类事物,类中有属性有方法,并且方法都有方法体。
某种情况下,父类只能知道子类应该具备一个怎样的方法,但不能明确知道子类如何实现该方法
例如:几何图形(多态),所有的几何图形都应具备一个计算面积的功能,但不同的几何图形计算面积的方式不同
java为上述问题提供了解决办法:
java中允许父类中只是提供一个方法的声明,不提供具体的实现
具体的实现交给子类来完成,该方法称为”抽象方法“
拥有一个或多个抽象方法的类,称为"抽象类"
二.如何使用抽象:abstract
1.使用abstract修饰的类成为"抽象类"
①格式:访问控制修饰符 abstract class 类名{}
②拥有一个或多个抽象方法的类必须是抽象类
③抽象类中可以有非抽象方法
④抽象类中也可以没有抽象方法
⑤***抽象类不能创建实例
⑥抽象类中可以有构造器。
目的:子类继承父类后,继承父类中所有的属性和方法,因此子类需要知道父类如何为对象进行初始化
2.使用abstract修饰的方法称为"抽象方法"
①格式:访问控制修饰符 abstract 返回值类型 方法名(参数列表);
②子类继承父类后,若重写了父类中”所有“的抽象方法,该类为具体类,可以创建实例
③子类继承父类后,若没有重写父类中”所有“的抽象方法,该类必须为抽象类,不能创建实例
3.abstract 和 final 二者不能同时使用
abstract 和 static 二者也不能同时使用
abstract 和private 二者也不能同时使用
4.具体类和抽象类的区别?
抽象类可为具体类父类
*/
public class AbstractTest {
public static void main(String[] args) {
Chinese c1=new Chinese();//本态
c1.speak();
Person1 p1=new Chinese();//多态
p1.speak();//虚拟方法调用
}
}
abstract class Person1{
private String name;
private int age;
public Person1(){
}
public Person1(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person1{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//人都应该具备一个说话的功能,但是不同的人说话的方式不同
public abstract void speak();
public abstract void show();
}
class Chinese extends Person1{
//public abstract void speak();重写方法
public void speak(){
System.out.println("中国人说汉语");
}
public void show(){
System.out.println("中国人");
}
}
abstract class American extends Person1{//抽象类
public void speak(){
System.out.println("美国人说英语");
}
//public abstract void show();
}
Exer:
public class AbstractExer {
public static void main(String[] args) {
//Frock f1=new Frock();不能创建frock对象
Shirt s1=new Shirt();
s1.setSize(1.5);
System.out.println(s1.calcArea());
Frock p1=new Shirt();
p1.setSize(1.5);
System.out.println(p1.calcArea());
}
}
abstract class Frock{
private double size;
public Frock() {
}
public Frock(double size) {
this.size = size;
}
public double getSize() {
return size;
}
public void setSize(double size) {
this.size = size;
}
public abstract double calcArea();
@Override
public String toString() {
return "Frock{" +
"size=" + size +
'}';
}
}
class Shirt extends Frock{
public double calcArea(){
return getSize()*1.3;
}
}
实验:
package Test;
public abstract class Employee {
private String name;
private int number;
private MyDate birthday;
public Employee() {
}
public Employee(String name, int number, MyDate birthday) {
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 "Employee{" +
"name='" + name + '\'' +
", number=" + number +
", birthday=" + birthday +
'}';
}
}
package Test;
public class SalariedEmployee extends Employee {
private double monthlySalary;
public SalariedEmployee() {
}
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;
}
public double earnings() {
return monthlySalary;
}
@Override
public String toString() {
return "SalariedEmployee{" +super.toString()+
"monthlySalary=" + monthlySalary +
'}';
}
}
package Test;
public class HourlyEmployee extends Employee {
private int wage;
private int hour;
public HourlyEmployee() {
}
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;
}
@Override
public String toString() {
return "HourlyEmployee{" +super.toString()+
"wage=" + wage +
", hour=" + hour +
'}';
}
}
package Test;
import java.util.Scanner;
public class PayrollSystem {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
Employee[] employees=new Employee[5];
employees[0]=new SalariedEmployee("张三",101,new MyDate(2004,5,6),9000);
employees[1]=new HourlyEmployee("李四",102,new MyDate(1999,4,8),800,8);
employees[2]=new SalariedEmployee("王五",103,new MyDate(1994,7,15),20000);
employees[3]=new HourlyEmployee("小六",104,new MyDate(1995,11,20),500,5);
employees[4]=new SalariedEmployee("大七",105,new MyDate(2001,4,22),2000);
System.out.println("输入月份!");
int month=scan.nextInt();
for (int i = 0; i < employees.length; i++) {
System.out.println(employees[i]);
System.out.println("您的工资为:"+employees[i].earnings());
if (month==employees[i].getBirthday().getMonth()){
System.out.println("生日奖励:100"+" 总工资为:"+employees[i].earnings()+100);
}
}
}
}
package Test;
public class MyDate {
private int year;
private int month;
private int day;
public MyDate(){
}
public MyDate(int year, int month, int day) {
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;
}
@Override
public String toString() {
return year+"年"+month+"月"+day+"日";
}
}