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

(一)学习总结
1.思维导图:
1080047-20170416224055102-1969010693.jpg
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));
    }
}

1080047-20170417232032212-1934945501.png

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

好处:用多态可以对父类的方法进行重写和覆盖,非常方便。
(三)代码托管
1080047-20170417233721227-788325030.png
码云地址:
https://git.oschina.net/wangyikai1996/shiyansi.git

转载于:https://www.cnblogs.com/494625951-wangyikai/p/6725692.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验二 C#程序设计练习 一、实验目的 1.掌握C#语言的基本语法、控制语句及异常处理。 2.掌握C#类的基本使用方法以及C#语言面向对象的基本特性。 二、实验内容 1.编写一个函数,用于计算1!+2!+3!+4!+5!,在控制台或页面输出运行结果。 2.在控制台或页面输出九九乘法表。 3.输入10个以内的整数,输出该组整数的降序排列,要求采用数组实现。 4.计算两个数的商,在控制台或页面输出结果,要求包含异常处理。 5.定义一个汽车类,该类具有重量和速度属性;再定义一个跑车类,该类继承汽车类的属性,并拥有自己的颜色属性;然后声明一个汽车类的对象和一个跑车类的对象,并把它们的属性输出到控制台上。 6.假设某动物园管理员每天需要给他所负责饲养的狮子、猴子和鸽子喂食。请用一个程序来模拟他喂食的过程。 要求: (1)饲养员喂食时,不同动物执行不同的吃的功能,例如狮子吃肉、猴子吃香蕉、鸽子吃大米等。 (2)饲养员喂动物时,不能使用判断语句判断动物类型。 (3)使用虚方法或抽象方法实现喂养不同动物的多态,不能使用方法重载。 提示:需要建一个动物类,动物类有一个虚的或抽象的吃方法,动物类下面有几个子类,不同的子类重写父类的吃方法。饲养员类提供喂食方法。然后,在Main方法中一一调用吃的方法。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Add2._1 { class Program { static void Main(string[] args) { int sum = 0; for (int i = 1; i < 6; i++) { int tmp = 1; for (int j = 1; j <= i; j++) { tmp = tmp * j; } sum += tmp; } Console.WriteLine("1!+2!+3!+4!+5!={0}\r\n", sum.ToString()); } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值