Java第三次实验

实验三 子类与继承
班级: 姓名: 学号:
一、实验目的
1、掌握子类的继承性,也即子类如何如何继承父类的成员;
2、掌握成员变量继承与隐藏;
3、掌握方法的继承与隐藏;
4、掌握使用super关键字用法;
5、掌握上转型对象的使用。
二、实验内容
1、编写程序模拟中国人、美国人是人,北京人是中国人。除主类外,该程序中还有People、Chinese、American和BeijingMan等4个类。要求如下:
(1)People类有权限是protected的double型成员变量height和weight,以及public void speakHello()、public void averageHeight()和public void averageWeight()方法。
(2)Chinese类是People的子类,新增了public void chinaGongfu()方法,要求Chinese重写父类的public void speakHello(),public void averageHeight()和public void averageWeight()方法。
(3)American类是People的子类,新增了public void americanBoxing()方法,要求American重写父类的public speakHello()、public void averageHeight()和public void averageWeight()方法;
(4) Beijingman类是Chinese的子类,新增了public void beijngOpera()方法,要求Bejingman重写父类的public void speakHello()、publie void averageHeight()和public void averageWeight()方法。
People类Chinese类、American类和Beijingman类的UML图如图3.1所示。

图3.1 类的UML图
程序模板如下:
People.java
public class People {
protected double weight,height;
public void speakHello() {
System.out.println(“yayayaya”);
}
public void averageHeight() {
height=173;
System.out.println(“average height:”+height);
}
public void averageWeight() {
weight=70;
System.out.println(“average weight:”+weight);
}
}
Chinese.java
public class Chinese extends People {
public void speakHello() {
System.out.println(“您好”);
}
public void averageHeight() {
height = 168.78;
System.out.println(“中国人的平均身高:”+height+" 厘米");
}
【代码1】 //重写public void averageWeight()方法,输出:“中国人的平均体重:65公斤”
public void chinaGongfu() {
System.out.println(“坐如钟,站如松,睡如弓”);
}
}
American.java
public class American extends People {
【代码2】 //重写public void speakHello()方法,输出"How do you do"
【代码3】 //重写public void averageHeight()方法,输出"American’s average height:176 cm"
public void averageWeight() {
weight = 75;
System.out.println(“American’s average weight:”+weight+" kg");
}
public void americanBoxing() {
System.out.println(“直拳、钩拳、组合拳”);
}
}
BeijingMan.java
public class BeijingMan extends Chinese {
【代码4】 //重写public void averageHeight()方法,输出:“北京人的平均身高: 172.5厘米”
【代码5】 //重写public void averageWeight()方法,输出:“北京人的平均体重:70公斤”
public void beijingOpera() {
System.out.println(“花脸、青衣、花旦和老生”);
}
}
Example.java
public class Example {
public static void main(String args[]) {
Chinese chinese=new Chinese();
American american=new American ();
BeijingMan beijingPeople=new BeijingMan();
chinese.speakHello();
american.speakHello();
beijingPeople.speakHello();
chinese.averageHeight();
american.averageHeight();
beijingPeople.averageHeight();
chinese.averageWeight();
american.averageWeight();
beijingPeople.averageWeight();
chinese.chinaGongfu();
american.americanBoxing();
beijingPeople.beijingOpera() ;
beijingPeople.chinaGongfu();
}
}
运行结果:
2、某公司的雇员分可为以下若干类:
(1)Employee:这是所有员工总的父类, 属性:员工的姓名,员工的生日月份; 方法:getSalary(intmonth); 根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100 元。
(2)SalariedEmployee:Employee 的子类,拿固定工资的员工。 属性:月薪(3)HourlyEmployee: Employee 的子类, 按小时拿工资的员工,每月工作超出160 小时的部分按照1.5 倍工资发放。 属性:每小时的工资、每月工作的小时数
(4)SalesEmployee:Employee 的子类,销售人员,工资由月销售额和提成率决定。
属性:月销售额、提成率;
(5)BasePlusSalesEmployee:SalesEmployee 的子类,有固定底薪的销售人员,工资 由底薪加上销售提成部分。 属性:底薪。
根据要求创建 SalariedEmployee 、 HourlyEmployees 、SaleEmployee 和BasePlusSalesEmployee四个类的对象各一个,并计算某个月这四个对象的工资。
设计代码:
运行结果:
3、假设银行Bank已经有了按整年year计算利息的一般方法,其中year只能取正整数。比如按整年计算的方法如下:
double computerInterest (){
interest=year0.35savedMoney;
return interest;
}
建设银行ConstructionBank是Bank的子类,准备隐藏继承的成员变量year,并重写计算利息的方法,即自己声明一个double型的year变量,比如,当year取值为5.216时,表示要计算5年零216天的利息,但希望首先按银行Bank的方法computerInterest(计算出5整年的利息,然后再自己计算216天的利息。那么,建设银行就必须把5.216的整数部分赋给隐藏的year,并让super调用隐藏的、按整年计算利息的方法。
要求ConstructionBank类和BankOfDalian类是Bank类的子类,ConstructionBank类和BankOfDalian类都使用super调用隐藏的成员变量和方法。
ConstructionBank类、BankOfDalian类和Bank类的UML图如图3.2所示。要求编写这几个类并且另写一个测试类,每个银行创建一个对象,

图3.2 类的UML图
设计代码:
运行结果:
4、编程要求如下:(1).设计一个表示二维平面上点的类Point,包含有表示坐标位置的protected 类型的成员变量x 和y,获取和设置x 和y 值的public 方法。
(2).设计一个表示二维平面上圆的类Circle,它继承自类Point,还包含有表示圆半径的protected 类型的成员变量r、获取和设置r 值的public 方法、计算圆面积的public 方法。
(3).设计一个表示圆柱体的类Cylinder,它继承自类Circle,还包含有表示圆柱体高的
protected 类型的成员变量h、获取和设置h 值的public 方法、计算圆柱体体积的public
方法;(4).建立Cylinder 对象,输出其轴心位置坐标、半径、面积、高及其体积的值。
设计代码:
运行结果:

  1. 设计一个动物声音模拟器,希望模拟器可以模拟许多动物的叫声,要求如下:
    (1)编写抽象类Animal。Animal类有两个抽象方法cry()和getAnimalName(),即要求各种具体的动物给出自己的叫声和种类名称。
    (2)编写模拟器类Simulator。该类有一个playSound(Animal animal)方法,该方法的参数是Animal类型,即参数animal可以调用Animal的子类重写的cry()方法播放具体动物的声音,调用子类重写的getAnimalName()方法显示动物种类的名称。
    (3)编写Animal类的子类Dog和Cat。图3.3是Simulator、Animal,Dog、Cat类的UML图.

图3.3 UML图
(4)编写主类Application(用户程序)。在主类Application的main方法中至少包含如下代码:
Simulator simulator =new Simulator();
simulator.playSound(new Dog());
simulator.playSound(new Cat());
设计代码:
运行结果:

三、实验总结与分析

代码:
1

//Example.java
package DadAndSon;

public class Example {
    public static void main(String[] args) {
        Chinese chinese = new Chinese();
        American american = new American();
        Beijingman beijingPeople=new Beijingman();
        chinese.speakHello();
        american.speakHello();
        beijingPeople.speakHello();
        chinese.averageHeight();
        american.averageHeight();
        beijingPeople.averageHeight();
        chinese.averageWeight();
        american.averageWeight();
        beijingPeople.averageWeight();
        chinese.chinaGongfu();
        american.americanBoxing();
        beijingPeople.beijingOpera() ;
        beijingPeople.chinaGongfu();
    }
}

//Pople.java
package DadAndSon;

import java.sql.SQLOutput;

public class People {
    protected double height;            //身高
    protected double weight;            //体重
    public void speakHello()            //打招呼
    {
        System.out.println("yayayaya"); //打印yayayaya
    }
    public void averageHeight()         //平均身高
    {
        height = 173;                   //身高为173cm
        System.out.println("average height:" + height + "cm");    //打印身高
    }
    public void averageWeight() {
        weight = 70;                    //体重
        System.out.println("average weight:" + weight);           //打印体重
    }
}
//America.java
package DadAndSon;

public class American extends People{
    public void speakHello()
    {
        System.out.println("How do you do");
    }
    public void averageHeight()
    {
        height = 176;
        System.out.println("American's average height:" + height + "cm");
    }
    public void averageWight()
    {
        weight = 75;
        System.out.println("American's average weight:" + weight + "kg");
    }
    public void americanBoxing()
    {
        System.out.println("直拳、勾拳、组合拳");
    }
}
//Beijingman.java
package DadAndSon;

public class Beijingman extends Chinese{
    public void averageHeight(){
        height = 172.5;
        System.out.println("北京人的平均身高:" + height + "厘米");
    }
    public void averageWeight(){
        weight = 70;
        System.out.println("北京人的平均体重:" + weight + "公斤");
    }
    public void beijingOpera()
    {
        System.out.println("花脸、青衣、华诞和老生");
    }
}

//Chinese.java
package DadAndSon;

public class Chinese extends People {

    public void chinaGongfu()
    {
        System.out.println("坐如钟,站如松,睡如弓");
    }
    public void speakHello()             //重写
    {
        System.out.println("您好!");     //打印您好
    }
    public void averageHeight()
    {
        height = 168.78;
        System.out.println("中国人的平均身高:" + height + "厘米");
    }
    public void averageWeight() {
        weight = 65;
        System.out.println("中国人的平均体重:" + weight + "公斤");
    }
}

//capitalist.java
package Employee;

public class capitalist {
    public static void main(String[] args) {
        System.out.println("计算2月份四个员工的工资\n");
        //固定工资  1000 + 100(奖励) = 1100
        System.out.println("固定工资");
        SalariedEmployee SE = new SalariedEmployee();
        SE.getName("小明");
        SE.getBirthday(2);
        SE.getfixedSalary(1000);
        System.out.println("工资: " + SE.getSalary(2) + "元");
        //按小时计算工资  100 * 10 = 1000
        System.out.println("\n按小时计算工资");
        HourlyEmployees HE  = new HourlyEmployees();
        HE.getName("小红");
        HE.getBirthday(1);
        HE.getWorkTime(100);  //工作了100小时
        HE.getSalaryHour(10); //每小时的工资为10元
        System.out.println("工资: " + HE.getSalary(2) + "元");
        //工作超过165小时   165 * 10 + 1 * 10 * 1.5 = 1665
        System.out.println("\n");
        HE.getWorkTime(166);  //工作了100小时
        HE.getSalaryHour(10); //每小时的工资为10元
        System.out.println("工资: " + HE.getSalary(2) + "元");
        //销售人员  5000 * 0.7 = 3500
        System.out.println("\n销售人员,按提成发工资");
        SaleEmployee SSE = new SaleEmployee();
        SSE.getName("靓仔");
        SSE.getBirthday(7);
        SSE.getMonthlySalaVolume(5000);   //月销售额
        SSE.getRoyaltYrate(0.7);            //提成率
        System.out.println("工资" + SSE.getSalary(2) + "元");
        //底薪加提成  1000 + 2000 * 0.8 = 2600
        System.out.println("\n底薪加提成");
        BasePlusSalesEmployee BSE = new BasePlusSalesEmployee();
        BSE.getName("靓女");
        BSE.getBirthday(12);
        BSE.getBasePay(1000);
        BSE.getMonthlySalaVolume(2000);
        BSE.getRoyaltYrate(0.8);
        System.out.println("工资" + BSE.getSalary(2) + "元");
    }
}
//Employee.java
package Employee;

public class Employee {
    String name;     //员工名字
    int birthday;    //员工生日
    double Salary;   //员工工资
    void getName(String name)   //获得员工名字
    {
        this.name = name;
        System.out.println("名字: " + name);
    }

    void getBirthday(int birthday)      //获得员工生日
    {
        this.birthday = birthday;
        System.out.println("生日: " + birthday + "月");
    }
    double getSalary(int month)
    {
        if(month == birthday)      //如果该月员工过生日,则公司会额外奖励100 元
        {
            Salary = 100;
        }
        else
        {
            Salary = 0;
        }
        return Salary;
    }
}

//SalariedEmployee.java
package Employee;

public class SalariedEmployee extends Employee{
    double fixedSalery;
    @Override
    void getName(String Name) {
        super.getName(Name);
    }

    @Override
    void getBirthday(int Birthday) {
        super.getBirthday(Birthday);
    }

    void getfixedSalary(double fixedSalery)
    {
        this.fixedSalery = fixedSalery;
    }

    double getSalary(int month)
    {
        return fixedSalery + super.getSalary(month);          //固定工资1000元+生日奖励
    }
}
//HourlyEmployees.java
package Employee;

public class HourlyEmployees extends Employee{
    double workTime;      //每月的工作时间
    double salaryHour;    //每小时的工资

    @Override
    void getName(String Name) {
        super.getName(Name);
    }

    @Override
    void getBirthday(int Birthday) {
        super.getBirthday(Birthday);
    }

    void getWorkTime(double workTime)
    {
       this.workTime = workTime;
        System.out.println("每月的工作时间" + workTime + "小时");
    }

    void getSalaryHour(double salaryHour)
    {
        this.salaryHour = salaryHour;
        System.out.println("每小时的工资" + salaryHour + "元");
    }

    double getSalary(int month)
    {
        if(workTime < 165) {
            Salary = workTime * salaryHour;
            System.out.println("该员工每月工作没有超过165小时");
         } else if (workTime >= 165) {
            Salary = (workTime - 165) * salaryHour * 1.5 + 165 * salaryHour;
            System.out.println("该员工每月工作超过165小时");
        }
        return Salary + super.getSalary(month);
    }
}
//SaleEmployee.java
package Employee;

public class SaleEmployee extends Employee{
    double monthlysalesvolume = 0;     //月销售额
    double royalty_rate = 0;            //提成率

    double royalties;       //提成
    @Override
    void getName(String Name) {
        super.getName(Name);
    }

    @Override
    void getBirthday(int Birthday) {
        super.getBirthday(Birthday);
    }

    void getMonthlySalaVolume(double monthlySalaVolume)
    {
       this.monthlysalesvolume = monthlySalaVolume;
    }

    void getRoyaltYrate(double royaltYrate)
    {
        this.royalty_rate = royaltYrate;
    }

    @Override
    double getSalary(int month) {
        royalties = monthlysalesvolume * royalty_rate;
        return royalties + super.getSalary(month);
    }
}
//BasePlusSalesEmployee.java
package Employee;

public class BasePlusSalesEmployee extends SaleEmployee{
    double basepay;       //基本工资

    @Override
    void getName(String Name) {
        super.getName(Name);
    }

    @Override
    void getBirthday(int Birthday) {
        super.getBirthday(Birthday);
    }

    void getBasePay(double basepay)
    {
        this.basepay = basepay;
    }

    @Override
    double getSalary(int month) {
        Salary = basepay + super.getSalary(month);
        return Salary;
    }
}

//Money.java
package BANK;

public class Money {
    public static void main(String[] args) {
        //本金是10000元
        //建设银行  存5年零126天
        System.out.println("建设银行");
        ConstructionBank CB = new ConstructionBank();
        System.out.println("建设银行的利息:" + CB.computerInterest() + "元");
        //大连银行
        System.out.println("大连银行");
        BankOfDalian  BOK = new BankOfDalian();
        System.out.println("大连银行的利息:" + BOK.computerInterest() + "元");
    }
}

//Bank.java
package BANK;

public class Bank {
    double interest;   //利益
    int year;       //年份
    int savedMoney = 10000;  //存进去的钱
    double computerInterest (){    //计算利息
        interest = year * 0.35 * savedMoney;
        return interest;
    }
}
//ConstructionBank.java
package BANK;

public class ConstructionBank extends Bank{
    double year = 5.126;   //隐藏变量

    @Override
    double computerInterest() {
        super.year = (int) year;             //将整数部分给Bank计算利息
        year -= super.year;                  //将小数部给ConstructionBank计算利息
        return super.computerInterest() + year * 0.02 * super.savedMoney;   //
    }
}

//BankOfDalian.java
package BANK;

public class BankOfDalian extends Bank{
    double year = 1.587;   //隐藏变量

    @Override
    double computerInterest() {
        super.year = (int) year;             //将整数部分给Bank计算利息
        year -= super.year;                  //将小数部给ConstructionBank计算利息
        return super.computerInterest() + year * 0.02 * super.savedMoney;   //
    }
}
//ThreeDAndTwoD.java
package TwoDimension;

public class ThreeDAndTwoD {
    public static void main(String[] args) {
        Cylinder CL = new Cylinder();
        CL.setX(0.00);
        CL.setY(15.78);
        CL.setH(67.89);
        CL.setR(32.90);
        System.out.println("x: " + CL.x + "cm\n" + "y: " + CL.y + "cm\n"
                + "h: " + CL.h + "cm\n" + "r: "+CL.r + "cm\n"
                + "Area: " + CL.CalculatedCircleArea() +" cm^2\n"
                + "volume: " + CL.CalculatedCircleArea() + " cm^3");
    }
}
//Point.java
package TwoDimension;

public class Point {
    protected double x;
    protected double y;

    public void setX(double x) {    //获取x值
        this.x = x;
    }

    public void setY(double y){    //获取y值
        this.y = y;
    }
}
//Circle.java
package TwoDimension;

public class Circle extends Point {
    protected double r;   //半径
    public void setR(double r)    //获取半径r
    {
        this.r = r;
    }
    public double CalculatedCircleArea()    //计算圆面积
    {
        return Math.PI * r * r;
    }
}

//Cylinder.java
package TwoDimension;

public class Cylinder extends Circle{
    protected double h; //圆柱体的高
    public void setH(double h)  //获得h
    {
        this.h = h;
    }
    public double CalculatingCylinderVolume()
    {
        return super.CalculatedCircleArea() * h;
    }
}

//Application.java
package AnimalAPP;

public class Application {
    public static void main(String[] args) {
        Simulator simulator =new Simulator();
        simulator.playSound(new Dog());
        simulator.playSound(new Cat());
    }

}
//Animal.java
package AnimalAPP;

public abstract class Animal {
    public abstract void cry();
    public abstract String getAnimalName();
}
//Simulator.java
package AnimalAPP;

public class Simulator {
    public void playSound(Animal animal){
        System.out.print("现在播放" + animal.getAnimalName() + "类的声音:");
        animal.cry();
    }
}
//Cat.java
package AnimalAPP;

public class Cat extends Animal {
    public void cry(){
        System.out.println("喵喵...喵喵");
    }
    public String getAnimalName(){
        return "猫";
    }
}
//Dog.java
package AnimalAPP;

public class Dog extends Animal {
    public void cry() {
        System.out.println("汪汪...汪汪");
    }
    public String getAnimalName(){
        return "狗";
    }

}

解释我会放在下一篇blog

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

特辣番茄炒鸡蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值