zoukankan      html  css  js  c++  java
  • Java第五次作业面向对象高级特性(抽象类与接口)

    Java第五次作业--面向对象高级特性(抽象类与接口)


    (一)学习总结


    1.在上周完成的思维导图基础上,补充本周的学习内容,对Java面向对象编程的知识点做一个全面的总结。


    2.汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路并画出类图。

    2.1设计思路:定义一个父类为Car,里面包括属性numbernamerentMoney属性。
    然后子类包括Keche类,HuochePika,分别继承父类,添加各自的属性。


    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:价格计算出错

    解决:对狗类,猫类的每个属性(输入的个数,价钱等)分别定义多个数组,用于计算。

    (三)代码托管

  • 相关阅读:
    博文视点大讲堂第20期——Windows 7来了
    程序员如何缓解“电脑病”
    HQL中In的问题详解
    Tomcat、Websphere和Jboss类加载机制
    Hibernate锁机制悲观锁和乐观锁
    软件项目开发典型风险一览过程篇
    XPath实例教程
    CMMI的含义及重点
    自动化测试工具selenium使用介绍
    深入DNS域名解析服务原理
  • 原文地址:https://www.cnblogs.com/chenyameng/p/6760527.html
Copyright © 2011-2022 走看看