2017《Java》实验4 计算机1501 王奕开

(一)学习总结
1.思维导图:

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 Test1{
    public static void main(String args[]) {
        Child c = new Child();
    }
}

不能运行,对父类含参数的构造方法,子类可以通过在定义自己的构造方法中使用super关键字来调用它,但这个调用语句必须是子类构造方法的第一个可执行语句。
将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();
    }
}

用向上转型创建一个Dog类的animal,首先animal必须强制转化成Dog类的,将animal转化成Dog类的,第二个再向下转型的时候,要先发生向上转型的关系
修改后的代码如下:

public class Test1{
    public static void main(String args[]) {
        Animal animal = new Dog(); 
        animal.shout();
        ((Dog) animal).sleep();
        Dog dog = (Dog) animal;
        dog.sleep(); 
        Animal animal2 = new 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()) ; 
  } 
}

(一)不能直接输出一个per的对象,应该在person类中加一个toString()的方法
(二)源码:

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

(三)修改代码:

    class Person { 
   private String name ; 
   private int age ; 
   public Person(String name,int age){ 
         this.name = name ; 
         this.age = age ; 
   } 
   public String toString(){ 
       return "姓名:" + this.name + ",年龄:" + this.age ; 
} 
}
public class test21{  
      public static void main(String args[]){ 
             Person per = new Person("张三",20) ; 
             System.out.println(per.toString()) ; 
  } 
}

(二)代码分析
2.按照下面要求完成类的设计
(1)设计一个平面图形抽象类(提供求该类对象周长和面积的方法)和一个立体图形抽象类(提供求该类对象表面积和体积的方法)
(2)设计球类、圆柱类,圆锥类、矩形类、三角形类、圆类,分别继承平面图形抽象类和立体图形抽象类。
(3)建立测试类,进行测试。画出类图。
设计思路:
首先建立两个抽象类,平面和立体的抽象类
在创建球类、圆柱类,圆锥类、矩形类、三角形类、圆类,在里面创建函数

 abstract class tuxing{
	private double chang;
	private double kuan;
	private double R;
	private double H;
	public double getChang() {
		return chang;
	}

	public void setChang(double chang) {
		this.chang = chang;
	}

	public double getKuan() {
		return kuan;
	}

	public void setKuan(double kuan) {
		this.kuan = kuan;
	}

	public double getR() {
		return R;
	}

	public void setR(double r) {
		R = r;
	}

	public double getH() {
		return H;
	}

	public void setH(double h) {
		H = h;
	}

	public abstract double zhouchang(double chang,double kuan);
	public abstract double mianji(double x,double y);
}
abstract class liti{
	public abstract double tiji(double R);
	public abstract double biaomianji(double R);
}
class qiu extends liti{
	private double R;
	private double V;
	private double S;
	public qiu(double R){
		this.R=R;
	}
	
	public qiu() {
		// TODO Auto-generated constructor stub
	}

	public double tiji(double R) {
		V=4/3.0*3.14*R*R*R;
		return V;
	}
	public double biaomianji(double R) {
		S=4.0*3.14*R*R;
		return S;
	}
		
}
class yuanzhu extends liti{
	private double R;
	private double V;
	private double S;
	private double H;
	public yuanzhu(double R){
		this.R=R;
	}
	public yuanzhu() {
	}
	public double biaomianji(double R) {
		S=3.14*R*R;
		return S;
	}
	public double tiji(double R,double H) {
		V=3.14*R*R*H;
		return V;
	}
	public double tiji(double R) {
		return 0;
	}
}
class yuanzhui extends liti{
	private double R;
	private double V;
	private double S;
	private double H;
	public yuanzhui(double R){
		this.R=R;
	}
	public yuanzhui() {
		// TODO Auto-generated constructor stub
	}
	public double biaomianji(double R) {
		S=3.14*R*R;
		return S;
	}
	public double tiji(double R,double H) {
		V=3.14*R*R*H;
		return V;
	}
	public double tiji(double R) {
		// TODO Auto-generated method stub
		return 0;
	}
}
class juxing extends tuxing{
	public juxing(double chang, double kuan) {
		this.chang=chang;
		this.kuan=kuan;
	}
	public juxing() {
	}	
	private double chang;
	private double kuan;
	private double C;
	private double S;
	public double zhouchang(double chang,double kuan) {
		C=(chang+kuan)*2.0;
		return C;
	}
	public double mianji(double chang,double kuan) {
		S=chang*kuan;
		return S;
	}
	public double getC() {
		return C;
	}
	public void setC(double c) {
		C = c;
	}
	public double getS() {
		return S;
	}
	public void setS(double s) {
		S = s;
	}
	
}
class sanjiaoxing extends tuxing{
	private double bian;
	private double h;
	private double C;
	private double S;
	public sanjiaoxing(double bian, double h) {
		this.bian=bian;
		this.h=h;
	}
	public sanjiaoxing() {
		// TODO Auto-generated constructor stub
	}
	public double zhouchang(double bian,double h) {
		C=3.0*bian;
		return C;
	}
	public double mianji(double bian,double h) {
		S=bian*h/2.0;
		return S;
	}
	public double getBian() {
		return bian;
	}
	public void setBian(double bian) {
		this.bian = bian;
	}
	public double getH() {
		return h;
	}
	public void setH(double h) {
		this.h = h;
	}
	public double getC() {
		return C;
	}
	public void setC(double c) {
		C = c;
	}
	public double getS() {
		return S;
	}
	public void setS(double s) {
		S = s;
	}
	
}
class yuan extends tuxing{
	private double R;
	private double C;
	private double S;
	public yuan(double R){
		this.R=R;
	}
	public yuan() {
		// TODO Auto-generated constructor stub
	}
	public double zhouchang(double R) {
		C=2*3.14*R;
		return C;
	}
	public double mianji(double R) {
		S=R*R*3.14;
		return S;
	}
	public double getR() {
		return R;
	}
	public void setR(double r) {
		R = r;
	}
	public double getC() {
		return C;
	}
	public void setC(double c) {
		C = c;
	}
	public double getS() {
		return S;
	}
	public void setS(double s) {
		S = s;
	}
	public double zhouchang(double chang, double kuan) {
		// TODO Auto-generated method stub
		return 0;
	}
	public double mianji(double x, double y) {
		// TODO Auto-generated method stub
		return 0;
	}
	
}
public class test{
	public static void main(String []args){
		tuxing JX=new juxing();
		tuxing SJX=new sanjiaoxing();
		juxing j=(juxing) JX;
		sanjiaoxing s=(sanjiaoxing) SJX;
		tuxing YUAN=new yuan();
		yuan y=(yuan) YUAN;
		liti QIU=new qiu();
		qiu q=(qiu) QIU;
		liti YUANZHU=new yuanzhu();
		yuanzhu yz=(yuanzhu)YUANZHU;
		liti YUANZHUI=new yuanzhui();
		yuanzhui yzhui=(yuanzhui)YUANZHUI;
		System.out.println("平面图形:");
		System.out.println("矩形周长为:"+j.zhouchang(13.0, 5.0)+"矩形面积为:"+j.mianji(13.0,5.0));
		System.out.println("三角形周长为:"+s.zhouchang(5.0, 6.0)+"三角形面积为:"+s.mianji(5.0,6.0));
		System.out.println("园周长为:"+y.zhouchang(1.0)+"园面积为:"+y.mianji(1.0));
		System.out.println("**********************************************************************");
		System.out.println("立体图形:");
		System.out.println("球的体积为:"+q.tiji(1.0)+"球的表面积"+q.biaomianji(2.0));
		System.out.println("圆柱的体积为:"+yz.tiji(2.0,2.0)+"圆柱表面积为:"+yz.biaomianji(2.0));
		System.out.println("圆锥的体积为:"+yzhui.tiji(2.0,2.0)+"圆柱表面积为:"+yzhui.biaomianji(2.0));
	}
}

3.. 参考类图,重构下面的实例,分析和理解多态的含义和用途
(1)某动物园有一饲养员小李,每天需要给他所负责饲养的一只狮子、五只猴子和十只鸽子喂食。 请用一个程序来模拟他喂食的过程。
设计思路:建4个类,Lion,Monkey,Pigeon三个类中有eat()函数,在feeder类中使用函数进行调用

class Lion{
    	private String lion;
    	public Lion(String lion){
    		this.lion=lion;
    	}
    	public void eat(String lion){
    		System.out.println("狮子吃:"+lion);
    	}
    }
    class Monkey{
    	private String monkey;
    	public Monkey(String monkey){
    		this.monkey=monkey;
    	}
    	public void eat(String monkey){
    		System.out.println("猴子吃:"+monkey);
    	}
    }
    class Pigeon{
    	private String pigeon;
    	public Pigeon(String pigeon){
    		this.pigeon=pigeon;
    	}
    	public void eat(String pigeon){
    		System.out.println("鸽子吃:"+pigeon);
    	}
    }
    class Feeder{
    	private String name;
    	private Lion lion;
    	private Monkey monkey;
    	private Pigeon pigeon;
    	private String lionfood;
    	private String monkeyfood;
    	private String pigeonfood;
    	public Feeder(String name,String lionfood,String monkeyfood,String pigeonfood){
    		this.name=name;
    		this.lionfood=lionfood;
    		this.monkeyfood=monkeyfood;
    		this.monkeyfood=monkeyfood;
    	}
    	public void feedLion(Lion lion){
    		lion.eat(lionfood);
    	}
    	public void feedMonkey(Monkey monkey){
    		monkey.eat(monkeyfood);
    	}
    	public void feedPigeon(Pigeon pigeon){
    		pigeon.eat(pigeonfood);
    	}
    }
    public class siyanger{
    	public static void main(String []args){
    		Lion lion=new Lion("肉");
    		Monkey monkey=new Monkey("香蕉");
    		Pigeon pigeon=new Pigeon("饲料");
    		Feeder feeder=new Feeder("小李","肉","香蕉","饲料");
    		feeder.feedLion(lion);
    		feeder.feedMonkey(monkey);
    		feeder.feedPigeon(pigeon);
    	}
    }

分析:这种方法都用到了eat()函数,重复用,比较麻烦。
(2)第一次重构,引入继承,利用抽象类和对象多态重构程序,Animal类采用抽象类, 合并Feeder类中的方法
设计思路:创建抽象类,利用多态性,进行创建eat()函数

abstract class animal{
    	private String food;
    	public animal(String food){
    		this.food=food;
    	}
    	public abstract void print(String food);
    }
    class Lion extends animal{
    	public Lion(String food) {
    		super(food);
    	}
    	
    	public void print(String food) {
    		System.out.println("狮子吃:"+food);
    	}
    }
    class Monkey extends animal{
    
    	public Monkey(String food) {
    		super(food);
    	}
    	public void print(String food) {
    		System.out.println("猴子吃:"+food);
    	}
    }class Pigeon extends animal{
    
    	public Pigeon(String food) {
    		super(food);
    	}
    	public void print(String food) {
    		System.out.println("鸽子吃:"+food);
    	}
    }
    class Feeder{
    	private String name;
    	private Lion lion;
    	private Monkey monkey;
    	private Pigeon pigeon;
    	public Feeder(String name){
    		this.name=name;
    	}
    	public void feederLion(Lion lion){
    		lion.print("肉");
    	}
    	public void feederMonkey(Monkey monkey){
    		monkey.print("香蕉");
    	}
    	public void feederPigeon(Pigeon pigeon){
    		pigeon.print("饲料");
    	}
    }
    public class siyang{
    	public static void main(String []args){
    		Feeder feeder=new Feeder("小李");
    		Lion lion=new Lion("肉");
    		Monkey monkey=new Monkey("香蕉");
    		Pigeon pigeon=new Pigeon("饲料");
    		feeder.feederLion(lion);
    		feeder.feederMonkey(monkey);
    		feeder.feederPigeon(pigeon);
    	}
    }

(3)第二次重构,修改feedAnimals方法,让它接收一个Animal数组

import java.util.Scanner;
class feeder{
	private String name;
	private Animal []animal;
	public feeder(String name){
		this.name=name;
	}
	public void feedAnimal(Animal[] animal){
		for(int i=0;i<animal.length;i++){
		     animal[i].animaleat();
	    }	
    }
	public String toString(){
		return "饲养员名字:"+this.name;
		
	}
}
abstract class Animal{
	public abstract void animaleat();
}
class Lion extends Animal{
	public void animaleat(){
		System.out.println("狮子吃肉");
	}
}
class Monkey extends Animal{
	public void animaleat(){
		System.out.println("猴子吃香蕉");
	}
}
class Pigeon extends Animal{
	public void animaleat(){
		System.out.println("鸽子吃饲料");
	}
}
public class test1 {
    public static void main(String[] args) {
    	feeder feerder=new feeder("李明");
    	Animal animal[];
    	animal=new Animal[]{new Lion(),new Monkey(),new Pigeon()};
    	System.out.println(feerder.toString());
    	for(int i=0;i<1;i++){
    		feerder.feedAnimal(animal);
    	}   	
    }
}

好处:用多态可以对父类的方法进行重写和覆盖,非常方便。
(三)代码托管

码云地址:
https://git.oschina.net/wangyikai1996/shiyansi.git

posted on 2017-04-17 23:40  一开Stephen  阅读(160)  评论(1编辑  收藏  举报