Java实验四

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


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

---不能编译通过。
---原因:在子类中使用super关键字调用时,调用语句不是子类构造方法的第一个可执行语句。
---应改为:

class Parent extends Grandparent {
    public Parent() { 
        super("Hello.Grandparent.");       
        System.out.println("Parent Created");
    }
}

---执行结果:

---子类的构造方法在运行之前,必须调用父 类的构造方法的原因为:
子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。
---不能反过来。原因:
父类根本不知道子类有什么变量而且子类也得不到初始化的父类变量,导致程序运行出错!


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

---错误及原因:
3.1 对于向下转型时,要明确地指明要转型的子类类型。
子类 子类对象 =(子类)父类实例;
应改为:

    Dog dog = (Dog) animal; 

3.2 要想调用子类中的sleep()方法,不可以将对象进行向上转型,而要使用子类实例,就可以将对象进行向下转型。
应改为:

    Animal animal = new Dog(); 			//发生向上转型的关系,子类->父类
    Dog dog = (Dog) animal; 			//发生向下转型的关系,父类->子类
    dog.shout();						//此方法被子类覆盖写过
    dog.sleep(); 

3.3 程序运行错误,父类用其本身类实例化自己的对象,它并不知道谁是自己的子类,就会在转换时出现错误。

应改为:将俩个对象建立好关系,发生向上转型关系即可。相当于由子类去实例化父类对象,也就是说父类知道有一个这样的子类。

        Animal animal2 = new Dog();
        Dog dog1 = (Dog) animal2;
        dog1.shout();						//此方法被子类覆盖写过
        dog1.sleep(); 

---运行结果:


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

---说明执行System.out.println(per)语句和System.out.println(per.toString())语句,输出结果是一样的,对象输出时一定会调用Object类中的toString()方法打印内容。


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

---println()方法的源码:

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

---说明这是随机输出了一些地址信息,实例化并没有被执行。


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

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

---程序的执行结果:

---说明程序Person类中覆写了Object类中的toString()方法,直接输出对象时调用得是被子里覆写过的toString()方法。


(二)实验总结
1.定义员工类,具有姓名、年龄、性别属性,并具有构造方法和显示数据方法。定义管理层类,继承员工类,有自己的属性职务和年薪。定义职员类,继承员工类,并有自己的属性所属部门和月薪。定义一个测试类,进行测试。画出类图。
工具:ProcessOn
参考资料:UML 类图
程序设计思路:首先建立1个类,Employee类,别设置它的属性,然后建立Manage类和Employee1类,都继承Employee类,设置它的属性,之后建立一个Test类,进行测试即可。
问题1:输出时有空值。
原因:有的内容未被调用。
应改为:

                ....
		employee1 emp1=new employee1();
		mana1.setName("李明") ;
		mana1.setAge(30) ;
		mana1.setSex("男") ;
		mana1.setMyearmoney(50000);
		emp1.setEmouthmoney(10000);		
		mana1.setMzhifu("经理");
		emp1.setEdapt("侦查部");
		        ....

类图:

2.按照下面要求完成类的设计
(1)设计一个平面图形抽象类(提供求该类对象周长和面积的方法)和一个立体图形抽象类(提供求该类对象表面积和体积的方法)
(2)设计球类、圆柱类,圆锥类、矩形类、三角形类、圆类,分别继承平面图形抽象类和立体图形抽象类。
(3)建立测试类,进行测试。画出类图。
程序设计思路:首先建立一个平面图形抽象类和立体图形抽象类,分别设置他们的属性,设计球类、圆柱类,矩形类,分别设置他们的属性,分别继承平面图形抽象类和立体图形抽象类,建立Test类,分别调用,用tostring的方法输出即可。
问题1:在建立抽象类时,不知道如何设置周长和面积,不确定在哪传参。
原因:对知识了解不够透彻,不够仔细。通过请教同学,弄明白了这一点。
类图:

(三)代码托管
https://git.oschina.net/hebau_cs15/java_CS01wfy.git

posted @ 2017-04-18 11:17  不羁的青春  阅读(232)  评论(0编辑  收藏  举报