2017《Java》第四次作业

Java第四次作业——面向对象高级特性(继承和多态)

(一)学习总结

1.学习使用思维导图对Java面向对象编程的知识点(封装、继承和多态)进行总结。
Java面向对象有封装性,继承性和多态三个特性。
一.封装性: 就是把信息隐蔽起来,把一些属性设置为只有用户可以读取或者
修改但在访问属性或者调用方法时要用get()和set()方法得到和设置属性 不能直接调用和访问,封装对象内部属性private。
二:继承性:所谓继承代表了两个类之间的一种关系,继承下来的交子类,而被 继承的是父类。
(1)子类含有父类的属性和方法,但是同时也可以修改和重写,以及在父类的基础上添加新的方法和属性。
(2)一个子类只能有一个父类,但一个父类能有好多子类。
(3)子类不能继承访问权限为private的成员变量和方法。
(4)对父类含参数的构造方法,子类可以通过在定义自己的构造方法中使用super关键字来调用它。

创建子类的格式:
class 子类名 extends 父类名{
子类体;
}

三.多态性:即允许程序中出现重命名的现象。Java中含有方法重载和对象多态两种形式。
方法重载: 在一个类中允许多个方法使用同一个名字,但方法中的参数类型,个数或者顺序不同。
对象多态: 子类对象可以和父类对象相互转换根据其使用的子类不同实现的功能也不同

参考资料: XMind
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();
        }
    }

不能通过编译。
在Parent类中super关键字的位置放错。
对父类含参数的构造方法,子类可以通过在定义自己的构造方法中使用super关键字来调用它,但这个调用语句必须是子类构造方法的第一个可执行语句。
就像有了父亲才有孩子一样,子类对象在实例化之前必须首先调用父类中的构造方法再调用子类的构造方法。
运行结果:

GrandParent Created.String:Hello.Grandparent.
Parent Created
Child 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();
    }
}

三处错误

  1. animal.sleep();Anmal类中没有Sleep的构造方法。

    public void sleep() {
    System.out.println("呼呼");
    }

  2. Dog dog = animal;animal是Animal类型不能从父类直接向子类转。
    改为((Dog) animal).sleep(); Dog dog = (Dog) animal;

    1. if(animal2 instanceof Dog){
      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

说明测试类中有没有调用toString()方法结果都一样。因为在Java中所有的类都有一个公共的父类Object,一个类只要没有明显的继承一个类,就是Object的子类。不管有没有加toString(),对象输出时一定要调用Obiect中的toString()方法。
(2)那么,程序的运行结果到底是什么呢?利用eclipse打开println(per)方法的源码,查看该方法中又调用了哪些方法,能否解释本例的运行结果?

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

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

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

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

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

person类中重写了Object的toString()方法。
可参考教材P229

5.其他需要总结的内容。
super关键字:
可以从子类中调用父类的构造方法,普通方法和属性,与this调用构造方法时一样必须放在子类的构造方法的第一行。
但this在访问属性和调用方法时先访问和调用本类中的属性和方法,本类中没有,则从父类中查找。
Final关键字:
Final是最终的意思所以用Final声明的类不能有子类;使用Final声明的方法不能被子类覆写;以及用他声明的变量即为常量不能修改;如果一个程序中的变量使用public static final声明,则此变量成为全局常量。如:

public static final String INFO="fdf";

(二)实验总结
实验一:
程序设计思路:三个类,管理层类和职员类都继承员工类,和一个测试类。
员工类中有三个类都有的属性,而子类中需要用Super关键字来调用父类的方法。

实验二:
程序设计思路:主要是抽象类的应用,定义Pingmian类,和Liti类,里边含有子类的共同属性几何体的名字,然后矩形,三角,圆和球类,圆柱,圆锥类分别继承Pingmian类和Liti类。
问题:在测试类运行结果都是0,没有数值。
原因:开始对周长和面积set和get方法,然后又定义了周长和面积的抽象方法,但在子类中只是覆写了抽象方法,但并不是返回的定义了的get方法的周长和面积。
解决:只留了一个公共属性姓名,在子类中直接覆写抽象方法并且返回。

(三)代码托管(务必链接到你的项目)
http://git.oschina.net/hebau_cs15/Java-cs02QSM/commits/master

码云commit历史截图
上传实验项目代码到码云,在码云项目中选择“统计-commits”,设置搜索时间段,搜索本周提交历史,并截图.

posted on 2017-04-18 13:16  昨夜蔷薇  阅读(205)  评论(0)    收藏  举报