面向对象:11、abstract关键字

abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。

abstract修饰类:抽象类

  • 抽象类不能被实例化
  • 抽象类中的构造器起到子类实例化时调用的作用

abstract修饰方法:抽象方法

  • 抽象方法只有方法的声明,没有方法体

  • 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类

  • 子类继承抽象类后,需要实现抽象类中没有实现的所有抽象方法,否则这个子类也要声明为抽象类

  • 若子类没有重写父类中所有的抽象方法,则此子类也应是一个抽象类

注意

  • abstract不能用来修饰属性和构造器等结构
  • 同样的,也不能用来修饰私有方法,静态方法,final的方法和类
package com.hsy.abstractTest;public class AbstractTest {public static void main(String[] args) {//一旦Person类抽象了,就不可实例化
//    Person p1 = new Person();
//    p1.eat();}
}abstract class Creature{public abstract void breath();
}abstract class Person extends Creature{String name;int age;public Person(){}public Person(String name,int age){this.name = name;this.age = age;}//不是抽象方法:
// public void eat(){//
// }//抽象方法public abstract void eat();public void walk(){System.out.println("走路");}}class Student extends Person{public Student(String name,int age){super(name,age);}public Student(){}public void eat(){System.out.println("吃食物");}@Overridepublic void breath() {System.out.println("呼吸");}
}

小练习1

编写一个Employee 类,声明为抽象 类

包含如下三个 属性: name id salary

提供必要的构造器和抽象方法:work()

对于Manager 类来说,他既是员工,还具有奖金 (bonus 的 属性。

使用继承的思想,设计 CommonEmployee 类和 Manager 类,要求类中提供必要的方法进行属性访问。

Employee

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();
}

Manager

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;}@Overridepublic void work() {System.out.println("管理员工,提供公司运行的效率");}}

CommonEmployee

public class CommonEmployee extends Employee {@Overridepublic void work() {System.out.println("员工在一线车间生产产品");}}

EmployeeTest

public class EmployeeTest {public static void main(String[] args) {//多态Employee manager = new Manager("库克", 1001, 5000, 50000);manager.work();CommonEmployee commonEmployee = new CommonEmployee();commonEmployee.work();}
}

小练习2

编写工资系统 实现不同类型员工 多态 的按月发放工资 。 如果当月出现某个Employee 对象的生日 则将该雇员的工资增加 100 元 。

实验说明:

1、定义一个 Employee 类,该类包含:

private成员变量 name,number,birthday ,其中 birthday 为 MyDate 类的对象

abstract方法 earnings()

toString方法输出对象的 name,number 和 birthday

2、MyDate 类包含

private成员 变量 year month,day

toDateString方法返回日期对应的字符串: xxxx 年 xx 月 xx 日

3、定义 SalariedEmployee 类继承 Employee 类,实现按月计算工资的员工处理。

该类包括 private 成员变量 monthlySalary

实现父类的抽象方法earnings(), 该方法返回 monthlySalary 值;

toString() 方法输出员工类型信息及员工的 name number,birthday 。

4、参照 SalariedEmployee 类定义 HourlyEmployee 类,实现按小时计算工资的员工处理。

该类包括:

private成员变量 wage 和 hour

实现父类的抽象方法earnings(), 该方法返回 wage*hour 值

toString方法输出员工类型信息及员工的 name number,birthday

5、定义 PayrollSystem 类,创建 Employee 变量数组并初始化,该数组存放各类雇员对象的引用。利用循环结构遍历数组元素,输出各个对象的类
型 ,name,number, 以及该对象生日。当键盘输入本月月份值时,如果本月是某个 Employee 对象的生日,还要输出增加工资信息

Employee

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();@Overridepublic String toString() {return "name=" + name + ", number=" + number + ", birthday=" + birthday.toDateString();}}

MyDate

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 + "日";}
}

SalariedEmployee

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;}@Overridepublic double earnings() {return monthlySalary;}@Overridepublic String toString(){return "SalariedEmployee[" + super.toString() + "]"; }
}

HourlyEmployee

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;}@Overridepublic double earnings() {return wage * hour;}@Overridepublic String toString(){return "HourlyEmployee[" + super.toString() + "]"; }
}

PayrollSystem

public class PayrollSystem {public static void main(String[] args) {//方式一:
//    Scanner scanner = new Scanner(System.in);
//    System.out.println("请输入当月的月份:");
//    int month = scanner.nextInt();//方式二:Calendar calendar = Calendar.getInstance();int month = calendar.get(Calendar.MONTH);//获取当前的月份
//    System.out.println(month);//一月份:0Employee[] 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元");}}}
}

面向对象:11、abstract关键字相关推荐

  1. 面向对象下 abstract关键字(宋红康JAVASE)

    abstract关键字的使用 1 abstract:抽象的 2 abstract可以用来修饰的结构:类.方法 3 abstract修饰类:抽象类 此类不能实例化 抽象类中一定有构造器,便于子类实例化时 ...

  2. 设计原则与思想:面向对象11讲

    文章目录 设计原则与思想:面向对象11讲 理论一:面向对象到底是什么 面向对象编程和面向对象编程语言? 如何判定某编程语言是否是面向对象编程语言? 什么是面向对象分析和面向对象设计? 理论二:封装.抽 ...

  3. 为什么要在定义抽象类时使用abstract关键字

    本文为原创,如需转载,请注明作者和出处,谢谢! 众所周之,在任何面向对象的语言中(包括Java.C#),在定义抽象类时必须使用abstract关键字.虽然这已经习已为常了,但实际上abstract是为 ...

  4. java基础2:this、static、final、abstract关键字、代码块、生成API工具包、继承、多态、方法重载和重写,抽象类、接口、常见异常、java权限修饰符、选择排序思想和程序和内部类

    1.this关键字 this表示当前类对象的地址空间值的引用.就是说,this代表了new出来的对象 其最大作用就是解决了构造器中局部变量隐藏成员变量.即用this.变量名 = 变量名 区分. 2.s ...

  5. JAVA基础知识点11-多态、多态的调用、面向对象、abstract、接口

    多态引用调用时候,对子类新增成员不可见 多态前提下,想要调用子类的新增内容怎么办-->向下转型转型: 基本数据类型类型转换 Cast孔子装爹:孔子爹类: class 孔子爹{void teach ...

  6. 【C++】C++11新增关键字详解

    目录 一.auto 1.auto 用来声明自动变量,表明变量存储在栈(C++11之前) 2.auto用于推断变量类型示例(C++11) 3.声明或定义函数时作为函数返回值的占位符,此时需要与关键字 d ...

  7. java中abstract关键字

    abstract关键字的使用 1.abstract: 抽象的 2.abstract可以用来修饰的结构:类.方法 3.abstract修饰类:抽象类 此类不能实例化 抽象类中仍然有构造器,便于子类实例化 ...

  8. C++ 11 nullptr关键字

    C++ 11 nullptr关键字 转载:https://www.cnblogs.com/DswCnblog/p/5629073.html 熟悉C++的童鞋都知道,为了避免"野指针" ...

  9. java中抽象类,abstract关键字

    抽象类:java语法规定,包含抽象方法的类为抽象类. abstract关键字:abstract用来定义抽象方法和抽象类,定义抽象方法格式为:abstract修饰方法,并去掉大括号,直接以封号结束:定义 ...

最新文章

  1. 视频+课件| 视觉引导系列课程
  2. 学python用什么系统好-初次接触python,怎么样系统的自学呢?
  3. 【过程改进】 windows下jenkins常见问题填坑
  4. Windows下编译axel 2.6 / 2.11(下载神器)
  5. QCwindows server 2003部署
  6. 组件化与插件化的差别在哪里?内含福利
  7. Decision Tree学习笔记(基础篇)
  8. OSG仿真案例(5)——模型的平移、缩放、旋转
  9. linux添加网络节点,Pi网络节点配置教程(windows10专业版)
  10. java的hsf高速框架_分布式服务框架HSF - osc_n50eizn7的个人空间 - OSCHINA - 中文开源技术交流社区...
  11. 越狱软件可带来千万量级用户
  12. 发字的楷书写法图片_永字八法”楷书笔画用笔技巧的方法(附书法图)
  13. idea设置Java类和方法注释模板
  14. 被 KPI 绑架的百度贴吧
  15. c#报错 :System . Invalid Operation Exception:“线程间操作无效: 从不是创建控件的线程访问它
  16. 项目产品宣传文案和推广方案
  17. OBS Studio导播台多画面使用实测
  18. 深度学习基本知识(一)评价方法precision\recall\mAP
  19. 太吾绘卷开源代码_请注意代码的来源:开源太多了?
  20. 2t移动硬盘的2t指的是什么意思?2t移动硬盘格式化后数据恢复方法

热门文章

  1. CodeForces 241F Race
  2. 电脑文件被删除?试了十几款工具,数据恢复大师只看这一款
  3. 一个java程序员的年终总结
  4. JavaScript常用知识点笔记
  5. 防病毒基础知识:认识杀毒软件
  6. mmWave Demo Visualizer使用教程
  7. bugkuctf 猫片 安恒杯
  8. 【网络协议】万文长篇,带你深入理解 TCP;场景复现,掌握鲜为人知的细节(下)
  9. 哀悼使网站整体变灰或黑
  10. 使用javassist获取类方法参数名称列表