
Java第三次实验
建设银行ConstructionBank是Bank的子类,准备隐藏继承的成员变量year,并重写计算利息的方法,即自己声明一个double型的year变量,比如,当year取值为5.216时,表示要计算5年零216天的利息,但希望首先按银行Bank的方法computerInterest(计算出5整年的利息,然后再自己计算216天的利息。属性:月薪(3)HourlyEmployee: Employe
实验三 子类与继承
班级: 姓名: 学号:
一、实验目的
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)编写抽象类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
更多推荐
所有评论(0)