• 《Java技术》第三次作业


    (一)学习总结

    1.阅读下面程序,分析是否能编译通过?如果不能,说明原因。应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来?

    class Grandparent {
        public Grandparent() {
            System.out.println("GrandParent Created.");
        }
        public Grandparent(String string) {
            System.out.println("GrandParent Created.String:" + string);
        }
    }
    class Parent extends Grandparent {
        public Parent() {        
            System.out.println("Parent Created");
            super("Hello.Grandparent.");
        }
    }
    class Child extends Parent {
        public Child() {
            System.out.println("Child Created");
        }
    }
    public class Test{
        public static void main(String args[]) {
            Child c = new Child();
        }
    }
    

    不能,super调用父类中指定构造方法的操作,语句必须放在子类构造方法的是首行。 将super移至system上边,
    子类继承父类的属性和方法,同时也可以修改父类的属性或重写父类的方法,以及在父类的基础上添加新的属性和方法。
    因此,父类和子类 之间反映的是“一般与特殊”的关系。
    (能不能反过来?)--不能,父类根本不知道子类有什么变量,而且这样一来子类也得不到初始化的父类变量,导致程序运行出错

    2.阅读下面程序,分析程序中存在哪些错误,说明原因,应如何改正?正确程序的运行结果是什么?

    class Animal{
      void shout(){
          System.out.println("动物叫!");
      }
    }
    class Dog extends Animal{
          public void shout(){  
              System.out.println("汪汪......!");  
         }
          public void sleep() {
           System.out.println("狗狗睡觉......");
          } 
    }
    public class Test{
        public static void main(String args[]) {
            Animal animal = new Dog(); 
            animal.shout();
            animal.sleep();
            Dog dog = animal;
            dog.sleep(); 
            Animal animal2 = new Animal();
            dog = (Dog)animal2;
            dog.shout();
        }
    }
    

    测试类中 animal.sleep();有错animal是向上转型的 只能用继承和重写 不能用子类新定义的。
    Dog dog = animal; 向下转型出错 格式:子类名称 子类对象 =(子类)父类实例;
    dog = (Dog)animal2;
    dog.shout();
    父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。

    3.运行下列程序

    class Person { 
       private String name ; 
       private int age ; 
       public Person(String name,int age){ 
             this.name = name ; 
             this.age = age ; 
       } 
    }
    public class Test{  
          public static void main(String args[]){ 
                 Person per = new Person("张三",20) ; 
                 System.out.println(per);
                 System.out.println(per.toString()) ; 
      } 
    }
    

    (1)程序的运行结果如下,说明什么问题?

    Person@166afb3
    Person@166afb3
    (2)那么,程序的运行结果到底是什么呢?利用eclipse打开println(per)方法的源码,查看该方法中又调用了哪些方法,能否解释本例的运行结果?
    (3)在Person类中增加如下方法

    public String toString(){ 
            return "姓名:" + this.name + ",年龄:" + this.age ; 
     } 
    

    重新运行程序,程序的执行结果是什么?说明什么问题?

    1).不管有没有tostring 都没有把数传进去;
    2).
    源码

    public void println(Object x) {
            String s = String.valueOf(x);
            synchronized (this) {
                print(s);
                newLine();
            }
        }
    

    结果 张三 20 ;
    3).
    用户自己写的tostring方法 系统调用默认的头string方法,所以会出来hash码
    如果用户写了tostring方法了,就覆写了object类中的tostring方法,这样出来的结果是 张三 20;
    4.汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路。现在要创建一个可租车列表,应当如何创建?

      定义一个汽车类的接口 方法getNo(编号的),getName(名称的),getMoney(租金的)在定义一个载客量的接口,方法只有一个就是载客量,
    

    在定义一个载货量的接口,方法只有一个就是载货量,客车实现汽车和载客量的接口,货车实现汽车和载货量的接口,皮卡实现汽车 载客量 载货量三个接口。

    5.阅读下面程序,分析代码是否能编译通过,如果不能,说明原因,并进行改正。如果能,列出运行结果

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

    不能,在类的声明中用implements子句来表示一个类使用某个接口,在类中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。 所以dog类少了一个run 方法;
    dog类 void eat 出错 继承的时候 不能降低访问标识符的级别 而public 已经是最高的了;

    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 Text{
        public static void main(String[] args){
            Dog dog = new Dog();
            dog.breathe();
            dog.eat();
        }
    }
    

    (二)实验总结

    1.银行新用户现金业务办理

    • 问题:在交易类中 存钱 存不进去
      解决方法: 在存钱的方法中 余额应该是当前余额加上交易额 也就是说 这里的balance 得用this关键字。

    2.公司
    本题和实验三的第四题差不多,只是多了一个继承,
    要注意的是,管理层继承了员工类,在管理层的构造方法中 要把super关键字写在首行,且括号里写父类的属性

    3.图形

    • 设计思路:先写两个抽象类 一个是平面的,一个是立体的,别的类继承这两个其中的一个,在子类中继承父类的方法,在测试类中用随机数实现那些半径啊,高啊,边长啊 什么的
      要注意的是 三角形已知边长求面积 有一个海伦公式 可以网上查一下

    4.动物园

    • 设计思路:动物类定义成抽象的,鸽子,猴子,狮子,继承动物类,再写一个测试类,一个饲养员类,饲养员类 定义的是animal数组。
      问题:写的时候,不知道定义animal数组是干嘛用的,测试类只是输出了一个吃饱了,并没有告诉饲养员说第几只吃饱了;
      解决方法:在测试类定义狮子,鸽子,猴子类数组 长度为相应的动物的个数,三个子类里边 除了要写父类的方法之外,还要定义一个i,用来告诉它你的第几只动物吃饱了
      输出的时候 使用饲养员类的feedanimal的方法 括号里写狮子,鸽子,猴子类名称,在用循环输出就行了。

    实验五
    1.宠物商店

    • 设计思路:宠物类是接口,狗和猫类实现接口,实现那些接口的那些方法,商店类 就是买宠物的,可以参考书上的
      问题:买不了宠物 输入关键字之后 查找不了 问题提示空指针异常
      解决方法:在商店类的买宠物的方法中,在类里定义的存放买的宠物的数组和同种类宠物的个数,这两个数组,在写完买宠物个数的代码之后,
      要申请空间 大小就是你买的宠物的数量;然后 就要输入关键字和你买的同种的个数,在写个循环查找关键字 找到了就放进去。输出购物清单就行了。

    2.模拟器

    • 问题:不会实例化猫和狗的名字
      解决方法:在测试类实例化的时候 用到了向上转型 把子类给父类 父类名称 父类对象 = 子类实例;

    3.快递

    • 设计方法:PPT上老师给的很清楚,需要注意的是 JDTransportation类继承了父类的方法,要在他的构造方法里用super关键字调用父类的构造方法,
      这个位置信息的 你可以自己输入 也可以用随机数来产生,
      问题:输不出来信息
      原因:我直接使用了运输信息的那三个方法 就是谁.方法
      解决方法:需要用System.out.println来接收他的返回值;

    4.修改实验三第四题

    • 设计方法:因为日期的需要用系统的date类来实现,所以之前写的就没用了,要注意输出格式;比较器的那两,可以参考书上的代码,比较的时候,比较的是生日,
      要o.getbrith().getTime()这样比较;
      问题:不会实例化生日和入职时间
      解决方法:Date 对象名称=new sdf.parse("xxxx-xx-xx")

    (三)代码托管(务必链接到你的项目)

    https://gitee.com/hebau_java_cs16/Java_CS02YJX/tree/master/实验四和五

  • 相关阅读:
    cf D. Vessels
    cf C. Hamburgers
    zoj 3758 Singles' Day
    zoj 3777 Problem Arrangement
    zoj 3778 Talented Chef
    hdu 5087 Revenge of LIS II
    zoj 3785 What day is that day?
    zoj 3787 Access System
    判断给定图是否存在合法拓扑排序
    树-堆结构练习——合并果子之哈夫曼树
  • 原文地址:https://www.cnblogs.com/zj1220/p/8873830.html
Copyright © 2020-2023  润新知