Java 学习 Day14

一、 abstract关键字的使用

  1. abstract:抽象的
  2. abstract 可以用来修饰的结构:类、方法
  3. abstract 修饰类:抽象类
    (1)此类不能实例化
    (2)抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)
    (3)开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作
  4. abstract 修饰方法:抽象方法
    (1)抽象方法只有方法的声明,没有方法体
    (2)包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法的
    (3)若子类重写了父类中的所有的抽象方法后,此子类方可实例化。若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract 修饰
  5. abstract 使用上的注意点
    (1)abstract不能用来修饰:属性、构造器
    (2)abstract不能用来修饰私有方法、静态方法、final 的方法,final 的类
public class AbstractTest {public static void main(String[] args) {//一旦Person类抽象了,就不可实例化
//      Person p1 = new Person();
//      p1.eat();Student s1=new Student();s1.eat();s1.breath();}
}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 abstract void eat();public void walk() {System.out.println("人走路");}
}class Student extends Person{public Student() {super();}public Student(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("学生吃有营养的东西");}@Overridepublic void breath() {System.out.println("呼吸新鲜空气");}}
/** 抽象类的匿名子类* */
public class PersonTest {public static void main(String[] args) {method(new Student());//匿名对象Worker worker = new Worker();method1(worker);//非匿名的类非匿名的对象method1(new Worker());//非匿名的类匿名对象System.out.println("********************");//抽象类不能实例化,创建了一匿名子类的对象:pPerson p = new Person() {@Overridepublic void breath() {System.out.println("好好呼吸");}@Overridepublic void eat() {System.out.println("吃东西");}};method1(p);System.out.println("********************");//创建匿名子类的匿名对象method1(new Person() {@Overridepublic void eat() {System.out.println("吃好吃东西");}@Overridepublic void breath() {System.out.println("好好呼吸新鲜空气");}});}public static void method1(Person p) {p.eat();p.breath();} public static void method(Student s) {System.out.println("你好");}
}class Worker extends Person{@Overridepublic void eat() {}@Overridepublic void breath() {}}

例1:

/** 定义一个Employee类,该类包含:
private成员变量name,number,birthday,其中birthday 为MyDate类的对象;
abstract方法earnings();
toString()方法输出对象的name,number和birthday。* */
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();}//如果birthday=" + birthday,则运行结果输出的birthday是地址值}
/** MyDate类包含:
private成员变量year,month,day ;
toDateString()方法返回日期对应的字符串:xxxx年xx月xx日*/
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类继承Employee类,* 实现按月计算工资的员工处理。该类包括:private成员变量monthlySalary;
实现父类的抽象方法earnings(),该方法返回monthlySalary值;
toString()方法输出员工类型信息及员工的name,number,birthday。*/
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;}public String toString(){return "SalariedEmployee[" + super.toString() + "]"; }
}
/** 参照SalariedEmployee类定义HourlyEmployee类,实现按小时计算工资的员工处理。该类包括:
private成员变量wage和hour;
实现父类的抽象方法earnings(),该方法返回wage*hour值;
toString()方法输出员工类型信息及员工的name,number,birthday。*/
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;}public String toString(){return "HourlyEmployee[" + super.toString() + "]"; }
}
import java.util.Calendar;
import java.util.Scanner;/** 定义PayrollSystem类,创建Employee变量数组并初始化,该数组存放各类雇员对象的引用。* 利用循环结构遍历数组元素,输出各个对象的类型,name,number,birthday。* 当键盘输入本月月份值时,如果本月是某个Employee对象的生日,还要输出增加工资信息。*/
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元");}}}
}

二、模板方法设计模式

/** 抽象类的应用:模板方法的设计模式* */
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{@Overridepublic void code() {for(int i = 2;i <= 1000;i++){    //1000以内的质数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);}}}}

Java 学习 Day14相关推荐

  1. Java学习——Day14:网络编程

    7.1 网络编程概述 Java是 Internet 上的语言,它从语言级上提供了对网络应用程 序的支持,程序员能够很容易开发常见的网络应用程序. Java提供的网络类库,可以实现无痛的网络连接,联网的 ...

  2. Java学习总结第一阶段

    day1(甘特图)预科阶段 甘特图:让工程项目变成可视化图表,也叫项目进度规划表. 一般由:任务名称.工期.开始时间.完成时间.前置任务.资源名称.日期组成 如下所示,资源名称那就是人的名字,前置任务 ...

  3. 【日记】Java学习日记(第63天)持续无聊更新

    前言 Youtube上EJ Media(up主)的视频我依次学完了HTML.CSS.Javascript.Jquery.觉得他教得挺好的(短小精悍),就继续学他教的JAVA.感觉EJ教的都是些语法什么 ...

  4. Java学习路线图,如何学习Java事半功倍?

    作为一个初学者想掌握Java并不是很容易,Java本身是具有一定难度的,虽然说兴趣这东西可以让我们学习不累,但是有多少人学习是因为兴趣,或者有多少人知道自己的兴趣在哪?所以我很明确的告诉你学习这事本来 ...

  5. Java学习必不可少的网站,快收藏起来

    java技术在IT互联网行业的发展前景一直在提升,越来越多的人都在学习java技术,今天小编来给大家提供一些学习Java的网站集合,希望能够帮助到正在学习java技术的同学. Java学习必不可少的网 ...

  6. 分享五款java学习辅助工具,总有你用的上的~

    想要学好java技术,除了自身的努力,辅助工具也不缺少,辅助工具可以帮助大家在今后的工作中可以提高工作效率,下面小编就来分享五款java学习辅助工具,总有你用的上的~ 五款java学习辅助工具: 1. ...

  7. Java学习从入门到精通的学习建议

    想要学好java技术,首先打好基础很重要,不论学什么基础都是重中之重,学习Java更是如此.如:基础语法.核心类库.面向对象编程.异常.集合.IO流等基础如果学不好,那么后边更深入的语法也不容易学会. ...

  8. java学习笔记11--Annotation

    java学习笔记11--Annotation Annotation:在JDK1.5之后增加的一个新特性,这种特性被称为元数据特性,在JDK1.5之后称为注释,即:使用注释的方式加入一些程序的信息. j ...

  9. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

最新文章

  1. linux mysql innodb_MySQL innoDB 存储引擎学习篇
  2. [转] GloVe公式推导
  3. hdu4400 BFS+STL
  4. c语言用指针带出局部变量,关于C语言中返回局部变量和局部指针变量
  5. ways to keep health
  6. python 3.6.5编译安装_Centos7下编译安装python3.6.5
  7. linux思科认证,思科CCIE认证知识点之IPv6地址
  8. 微软谷歌出资500万美元推出 Alpha-Omega 项目,提升软件供应链安全
  9. ISNULL与CASE函数
  10. Python: Flask后端与webapi
  11. Access2016学习1
  12. 笔记本能连上wifi 但是浏览器打不开,使用手机的热点却可以正常上网的问题?
  13. autoit-v3 编辑工具SciTE Script Editor 解决中文乱码+中文换行崩溃问题
  14. HBase Shell 命令
  15. 300道SpringCloud面试题及答案(最新整理)
  16. c语言程序设计第三版宁爱军答案,C语言程序设计(第3版)
  17. 小米手机刷android one,别羡慕小米用户了!一加8Pro成功刷入MIUI 12,附简易步骤...
  18. 解决QQ2009不能发临时会话信息
  19. 设计师学python有意义吗-如果你有设计师朋友,请对他好一些...
  20. 基于Java开发一套完整的区块链系统

热门文章

  1. 《C++初阶之路》命名空间的意义
  2. 给电子开发工程师的建议
  3. 视频教程-基于NDK、C++、FFmpeg的android视频播放器开发实战-Android
  4. Keil5给工程添加组,Keil卡死。
  5. java实现actionlistener_在Java中,假设我们有一个实现ActionListener接口的类,以下方法中,()能够为一个Button类注册这个类...
  6. 通过政府网站做高质量外链的方法
  7. 基于Anaconda的pandas学习
  8. OS实验1的代码与readme
  9. Eclipse Android开发入门手册
  10. 初中化学实验室装备配置要求