Java第五次作业--面向对象高级特性(抽象类与接口)
Java第五次作业--面向对象高级特性(抽象类与接口)
(一)学习总结
1.在上周完成的思维导图基础上,补充本周的学习内容,对Java面向对象编程的知识点做一个全面的总结。
2.汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路并画出类图。
2.1设计思路:定义一个父类为Car
,里面包括属性number
,name
,rentMoney
属性。
然后子类包括Keche
类,Huoche
,Pika
,分别继承父类,添加各自的属性。
3.阅读下面程序,分析代码是否能编译通过,如果不能,说明原因,并进行改正。如果能,列出运行结果
interface Animal{
void breathe();
void run();
void eat();
}
class Dog implements Animal{
public void breathe(){
System.out.println("I'm breathing");
}
void eat(){
System.out.println("I'm eating");
}
}
public class Test{
public static void main(String[] args){
Dog dog = new Dog();
dog.breathe();
dog.eat();
}
}
在接口中实现的方法,在实现接口的时候必须都要全部实现,而且封装属性也应该显式封装。正确的代码是:
interface Animal{
void breathe();
void run();
void eat();
}
class Dog implements Animal{
public void breathe(){
System.out.println("I'm breathing");
}
public void eat(){
System.out.println("I'm eating");
}
public void run(){
System.out.println("I'm running");
}
}
public class Test{
public static void main(String[] args){
Dog dog = new Dog();
dog.breathe();
dog.eat();
dog.run();
}
}
程序输出后为:
4.运行下面的程序
import java.util.Arrays;
public class Test{
public static void main(String[] args){
String[] fruits = {"peach","banana","orange","apple"};
Arrays.sort(fruits);
for(int i = 0;i < fruits.length;i++)
{
System.out.println(fruits[i]);
}
}
}
程序输出的结果是升序排序的。查看String 类的源码,说明是如何实现的?如果现在希望对输出的结果进行降序排序,该如何处理?修改上述代码,实现按照字母顺序逆序排序。
更改循环变量,从后倒着输出即可。
import java.util.Arrays;
public class Test{
public static void main(String[] args){
String[] fruits = {"peach","banana","orange","apple"};
Arrays.sort(fruits);
for(int i = fruits.length-1;i>=0;i--)
{
System.out.println(fruits[i]);
}
}
}
(二)实验总结
1.某工厂生产各种音乐盒,客户无需知道音乐盒的制作过程,只需知道如何播放音乐盒即可。用简单工厂设计模式实现该过程:接口MusicBox具有方法play(),两个音乐盒类PianoBox,ViolinBox,MusicBoxFactory 产生MusicBox的实例。
程序设计思路:按照题目设置各个接口或者类,然后在Test类中进行调用MusicBoxFactory
类,产生实例化具体Fatory代码如下
package music;
public class MusicBoxFactory {
public static MusicBox getInstance(String classname){
MusicBox m=null;
if("Piano".equals(classname)){
m=new PianoBox();
}
if("Violin".equals(classname)){
m=new ViolinBox();
}
return m;
}
}
其中注意的是,尽量将字符串写前面,可以避免异常情况的产生。
第二种Fatory
代码如下:
package music;
public class NewMusicBoxFactory {
public static MusicBox getInstance(String className){
MusicBox m=null;
try{
m=(MusicBox)Class.forName(className).newInstance();
}catch(Exception e){
e.printStackTrace();
}
return m;
}
}
其中 m=(MusicBox)Class.forName(className).newInstance();
中无论classname或者name,在进行实例化的时候都需要使用包.类名才能实例化。
package music;
public class Test1 {
public static void main(String args[]){
MusicBox m=NewMusicBoxFactory.getInstance("music.ViolinBox");//name,classname都需要用包名.类名
if(m!=null){
m.play();
}
}
}
2.修改第三次作业的第一题,使用java.util.Date类表示职工的生日和参加工作时间,并将职工信息按照生日大小排序后输出。(分别用comparable和comparator实现)
思路:先将date
类删除,然后在Employee类中实现date,需要将date
类转化为String
类型,因为在Test类中实例化不能通过。所以定义一个方法,将date类
当做形参,传到方法中,然后用SimpleDateFormat
类进行设置格式,再将date类转化为该类型的String
。在toString方法中,输出生日的时候调用该方法即可。
public String time(Date date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String str = sdf.format(date);
return str;
}
public String toString() {
return "员工基本信息: 员工编号:" + emno + ", 员工姓名:" + emna + ", 性别:" + esex
+ ", 出生日期:" + this.time(birth) + ", 部门:" + depar + ", 参加工作时间:"+this.time(jdate);
}
问题1:重写Date
类后,实例化出错。
解决:因为将Date
转为字符串了,而构造方法中,却实现的Date
类的实例化,所以在实例化中需要用到SimpleDateFormat
方法中的parse
方法,并且对其进行异常捕获。
问题2:生日排序出现类型不匹配
解决:Date
类中有getlong
方法可用于比较日期,如下:
public int compareTo(Employee o){
if(this.birth.getTime()>o.birth.getTime()){
return -1;
}else if(this.birth.getTime()>o.birth.getTime()){
return 1;
}
else{
return 0;
}
}
问题3:在使用Comparator方法,Arrays.sort
里面的参数设置
解决:java.util.Arrays.sort(e1,new BirthdayComparator());
,需要一个匿名对象传进该排序方法中进行排序
3.在案例宠物商店的基础上,实现以下功能:
(1)展示所有宠物
(2)购买宠物
(3)显示购买清单
每一个功能都是独立的,没有直接联系。没有递进关系,也就是说,进行(2)后在进行(3)没有你购买的宠物清单,(2)中只是简单地实现了你购买的宠物,没有计算,然后进行输出。
设计思路:在Petshop
类中实现展示所有宠物功能:
public void print(Pet p[]){
for(int i=0;i<p.length;i++){
if(p[i]!=null){
System.out.println(p[i].getNo()+","+p[i].getKind()+","+p[i].getColor()+
","+p[i].getAge()+","+p[i].getPrice());
}
}
}
public Pet search(String no){
Pet p=null;
for(int i=0;i<this.pets.length;i++){
if(this.pets[i].getNo().indexOf(no)!=-1){
p=this.pets[i];
}
}
return p;
}
形参为Pet类的数组,然后对数组进行遍历即可。
实现购买宠物:
编写方法以找到该宠物,然后将该宠物放进一个数组中,然后用Petshop
定义的对象的print
方法进行输出。
在Test类中定义Pet接口的变量,用于接受search
传过来的编号,用于购买。对狗进行定义多个数组,
Pet pno[]=new Pet[5]; //用于传送给编号数组
Pet d[]=new Pet[10]; //用于实例化判断是狗类
Pet c[]=new Pet[10]; //同上
int number[]=new int[5]; //用户输入几只然后如果是dog类则加到number[]数组中
int cnumber[]=new int[5]; //如果是cat类则加到从cnumber数组中
int price[]=new int[5]; //如果是狗类,将price存进price[]数组中
int cprice[]=new int[5];
(1),对传进来的数组进行判断,使用instanceof
类,看是否产生狗或者猫的实例化,如果是狗则传进狗的数组中,反之存进猫中。
(2),输入的个数,如果是狗类则存进狗的计数数组中
(3),如果是狗类,将pno[i]给了的d[i],同时获取其价格乘以计数数组,同时累加记和传给sum。部分代码如下:
if(pno[i]instanceof Dog){
number[i]=g; //判断是狗类,则给狗类的number数组
d[i]=pno[i]; //同时将数组pno中的内容给了以dog类实例化的d数组
price[i]=d[i].getPrice() * number[i]; //将传进去的d数组获取价格同时乘以该输入的个数
sum+=price[i]; //求和
}
问题1:价格计算出错
解决:对狗类,猫类的每个属性(输入的个数,价钱等)分别定义多个数组,用于计算。
(三)代码托管
Java第五次作业--面向对象高级特性(抽象类与接口)的更多相关文章
- Java第五次作业--面向对象高级特性(抽象类和接口)
一.学习要点 认真看书并查阅相关资料,掌握以下内容: 掌握抽象类的设计 掌握接口的设计 理解简单工厂设计模式 理解抽象类和接口的区别 掌握包装类的应用 掌握对象的比较方法和比较器的使用 学习使用日期操 ...
- Java第四次作业——面向对象高级特性(继承和多态)
Java第四次作业--面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能, ...
- Java第四次作业—面向对象高级特性(继承和多态)
Java第四次作业-面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能,说 ...
- Java第四次作业--面向对象高级特性(继承和多态)
一.学习要点 认真看书并查阅相关资料,掌握以下内容: 掌握类的继承概念和设计 掌握构造方法的继承原则 掌握方法重写 掌握super键字和final关键字 理解多态的概念,掌握通过方法重写和方法重载机制 ...
- 《Java技术》第三次作业--面向对象——继承、抽象类、接口
1.阅读下面程序,分析是否能编译通过?如果不能,说明原因.应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来? class Grandparen ...
- Java第四次作业,面向对象高级特性(继承和多态)
Java第四次作业-面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能,说 ...
- Java第三次作业——面向对象基础(封装)
Java第三次作业--面向对象基础(封装) (一)学习总结 1.什么是面向对象的封装性,Java中是如何实现封装性的?试举例说明. 封装性 封装性是面向对象的方法所应遵循的一个重要原则,它有两个含义: ...
- Slickflow.NET 开源工作流引擎基础介绍(五) -- 会签加签高级特性介绍
前言:会签和加签是常见审批流程模式,在引擎中,对这两种流程模式做了分别定义和实现,其中也用到了Workflow Pattern的Multiple Instance(多实例) . 1. 会签和加签的定义 ...
- java基础1.0::Java面向对象、面向对象封装、抽象类、接口、static、final
一.前言 一直以来都是拿来主义,向大神学习,从网上找资料,现在就把自己在工作中和学习中的所理解的知识点写出来,好记星不如烂笔头,一来可以作为笔记自己温习,二来也可以给走在求学之路的同学们一点参考意见, ...
随机推荐
- wpf屏蔽快捷键alt+space,alt+F4
/// <summary> /// 阻止 alt+f4和alt+space 按键 /// </summary> /// <par ...
- 零元学Expression Blend 4 – Chapter 21 以实作案例学习MouseDragElementBehavior
原文:零元学Expression Blend 4 – Chapter 21 以实作案例学习MouseDragElementBehavior 本章将教大家如何运用Blend 4内建的行为注入元件「Mou ...
- WP 8.1 中挂起时页面数据保存方式(1)
1.保存到Applicaion Data配置信息中: 保存: privatevoid testTB_TextChanged(object sender, TextChangedEventArgs e) ...
- ZooKeeper+Dubbo+SpringBoot 微服务Demo搭建
1. 首先创建springBoot项目,springBoot是一堆组件的集合,在pom文件中对需要的组件进行配置.生成如下目录结构 创建test项目,同步在test创建dubbo-api,dubbo- ...
- Gps坐标距离计算C#实现
园子里找到两钟实现方式,做一记录,回头再认真学习,先拿来就用吧: 1.@旋风描述的算法: 场景:已知两个GPS点的经纬度坐标信息.计算两点的距离. 1. 距离/纬度关系 GPS: 22.514519, ...
- centos yum 安装 jdk1.8
JDK: 版本:1.8 服务器默认安装1.7,所以不使用默认安装 yum -y list java* --查看yum的jdk安装包 yum install java-1.8.0-openjdk jav ...
- pytorch实现yolov3(1) yolov3基本原理
理解一个算法最好的就是实现它,对深度学习也一样,准备跟着https://blog.paperspace.com/how-to-implement-a-yolo-object-detector-in-p ...
- C语言实现常用查找算法——二分查找
#include<stdio.h> void insert_sort(int a[],int n); int binary_search(int a[],int x,int n); voi ...
- react中使用高德地图的原生API
干货,无话 1.react-create-app,创建新react项目 2.npm install react-amap,引入高德地图的封装 3.编写组件index.js import React f ...
- Spring Boot:整合MyBatis框架
综合概述 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单 ...