Java作业四

一.学习总结

1.学习使用思维导图对Java面向对象编程的知识点(封装、继承和多态)进行总结。
1082644-20170418200706727-1473641483.png

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

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

改程序不能正常运行,构造函数调用必须是构造函数中的第一个语句。改为:

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() {  
    super("Hello.Grandparent.");      
        System.out.println("Parent Created");
        
    }
}
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方法调用时都必须放在构造方法的首行,而且无论子类如何操作,都必须首先调用父类中的构造方法。父类是首先产生的,现有父类再有子类。
3 . 阅读下面程序,分析程序中存在哪些错误,说明原因,应如何改正?正确程序的运行结果是什么?

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,父类中只定义了shout,而在下面的调用中出现了animal.sleep。Dog是子类,子类里面有shout和sleep,实例化子类时应该是Dog.dog=new Dog。所以程序应该改为如下:

class Animal{
      void shout(){
          System.out.println("动物叫!");
      }

     void sleep() {
            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 Animal(); 
            animal.shout();
            animal.sleep();
            Dog dog = new Dog();
            dog.sleep(); 
            Animal animal2 = new Animal();
            dog = (Dog)animal2;
            dog.shout();
        }
    }

运行结果:
动物叫!
动物睡觉!
狗狗睡觉......

4.运行下列程序

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

person类中并没有toString类,而在Test中却输出了toString()。
(2)那么,程序的运行结果到底是什么呢?利用eclipse打开println(per)方法的源码,查看该方法中又调用了哪些方法,能否解释本例的运行结果?
结果:

shiyansi.Person@1db9742
shiyansi.Person@1db9742

(3)在Person类中增加如下方法

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

运行的结果:

姓名:张三,年龄:20
姓名:张三,年龄:20

对象输出时一定会调用Object类中的toString方法打印内容。因此可以这样通过toString()取得一些对象的信息。

二.实验总结

1.定义员工类,具有姓名、年龄、性别属性,并具有构造方法和显示数据方法。定义管理层类,继承员工类,有自己的属性职务和年薪。定义职员类,继承员工类,并有自己的属性所属部门和月薪。定义一个测试类,进行测试。画出类图。
工具:ProcessOn
参考资料:UML 类图
实验思路:创建类,里面用private 定义各个内容属性,姓名,年龄,性别等。用private封装,然后要用get和set获取。建一个Test类,对之前的类实例化然后调用构造方法传参,最后输出。

2.按照下面要求完成类的设计
(1)设计一个平面图形抽象类(提供求该类对象周长和面积的方法)和一个立体图形抽象类(提供求该类对象表面积和体积的方法)
(2)设计球类、圆柱类,圆锥类、矩形类、三角形类、圆类,分别继承平面图形抽象类和立体图形抽象类。
(3)建立测试类,进行测试。画出类图。
实验思路:建一个抽象平面图形类,然后在下面再建三个子类(矩形,三角形,圆)用继承的方法 public 子类 extends 父类{}。在父类里面定义周长和面积,然后用get和set方法。因为这个平面图形类是抽象的,所以还要定义抽象方法:访问权限 abstract 返回值类型 方法名称(参数);在子类里面用构造方法,继承抽象类覆写父类的抽象方法。立体抽象类同平面抽象类。然后建一个测试类,实例化子类对象后赋值。

3.先建一个Animal抽象类,然后建立狮子类,猴子类,鸽子类继承Animal类。用super类调用父类中的指定构造方法,在每个子类后面覆写父类。最后一个测试类,写喂动物的具体内容,实例化子类,用一个循环和switch case选择要进行的动作。

三.代码托管 git@git.oschina.net:hebau_cs15/Java-cs01zzy.git https://git.oschina.net/hebau_cs15/Java-cs01zzy.git

1082644-20170418222539696-1104395979.png

转载于:https://www.cnblogs.com/zhaoziying/p/6729806.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值