Java期末考试试题及参考答案(04)
Posted 谷哥的小弟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java期末考试试题及参考答案(04)相关的知识,希望对你有一定的参考价值。
版权声明
- 本文原创作者:谷哥的小弟
- 作者博客地址:http://blog.csdn.net/lfdfhl
一、填空题
1.在面向对象中,类之间共享属性和操作的机制称为________。
2.在继承关系中,子类会自动继承父类中的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类的方法进行________。
3.________ 关键字可用于修饰类、变量和方法,它有“无法改变的”或者“最终”的含义。
4.一个类如果要实现一个接口,可以通过关键字________来实现这个接口。
5.一个类如果实现一个接口,那么它就需要实现接口中定义的全部方法,否则该类就必须定义成________。
6.如果子类想使用父类中的成员,可以通过关键字________引用父类的成员。
二、判断题
1.定义一个抽象类的关键字是interface。()
2.父类的引用指向自己子类的对象是多态的一种体现形式。()
3.Java中一个类最多可以有一个直接父类。()
4.接口中定义的变量默认是public static final型,且必须赋初值。()
5.final修饰的局部变量只能被赋值一次。()
6.在定义方法时不写方法体,这种不包含方法体的方法为静态方法。()
7.Java中的instanceof关键字可以判断一个对象是否为某个类(或接口)的实例或者子类实例。()
三、选择题
1.下面程序运行的结果是( )
public class A
public static void main(String[] args)
B b = new B();
b.test();
void test()
System.out.print("A");
class B extends A
void test()
super.test();
System.out.print("B");
A、产生编译错误
B、代码可以编译运行,并输出结果AB
C、代码可以编译运行,但没有输出
D、编译没有错误,但会产生运行时异常
2.下列关于继承的描述中,错误的是()
A、Java中一个类只能有一个直接父类
B、多个类可以继承一个父类
C、Java中,C类继承B类,B类又继承A类,这时,C类也可称作A类的子类
D、Java是支持多继承的
3.下列关于对象的类型转换的描述,说法错误的是( )
A、对象的类型转换可通过自动转换或强制转换进行
B、无继承关系的两个类的对象之间试图转换会出现编译错误
C、由new语句创建的父类对象可以强制转换为子类的对象
D、子类的对象转换为父类类型后,父类对象不能调用子类的特有方法
4.下列关于接口的说法中,错误的是( )
A、接口中定义的方法默认使用“public abstract”来修饰
B、接口中的变量默认使用“public static final”来修饰
C、接口中的所有方法都是抽象方法
D、接口中定义的变量可以被修改
5.阅读下段代码:
class Dog
public String name;
Dog(String name)
this.name =name;
public class Demo1
public static void main(String[] args)
Dog dog1 = new Dog("xiaohuang");
Dog dog2 = new Dog("xiaohuang");
String s1 = dog1.toString();
String s2 = dog2.toString();
String s3 = "xiaohuang";
String s4 = "xiaohuang";
返回值为true的是( )
A、dog1.equals(dog2)
B、s1.equals(s2)
C、s3.equals(s4)
D、dog1==dog2
四、简答题
1.请简述Java中继承的概念以及使用继承的好处。
2.简要概述多态的作用。
3.简要概述接口和抽象类的区别。
五、编程题
某公司的雇员分为5类,每类员工都有相应的封装类,这5个类的信息如下所示。
(1) Employee:这是所有员工总的父类。
① 属性:员工的姓名,员工的生日月份
② 方法:getSalary(int month) 根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100 元。
(2) SalariedEmployee:Employee 的子类,拿固定工资的员工。
① 属性:月薪。
(3)HourlyEmployee:Employee 的子类,按小时拿工资的员工,每月工作超出160小时的部分按照1.5 倍工资发放。
① 属性:每小时的工资、每月工作的小时数。
(4) SalesEmployee:Employee 的子类,销售,工资由月销售额和提成率决定。
① 属性:月销售额、提成率。
(5) BasePlusSalesEmployee:SalesEmployee 的子类,有固定底薪的销售人员,工资由底薪加上销售提成部分。
① 属性:底薪。
本题要求根据上述雇员分类,编写一个程序,实现以下功能:
(1)创建一个Employee 数组,分别创建若干不同的Employee对象,并打印某个月的工资。
(2)每个类都完全封装,不允许非私有化属性。
参考答案
一、
1.继承
2.重写
3.final
4.implements
5.抽象类
6.super
二、
1.错
2.对
3.对
4.对
5.对
6.错
7.对
三、
1.B
2.D
3.C
4.D
5.C
四、
1.概念:在Java中类的继承是指在一个现有类的基础上去构建一个新的类。构建出来的新类被称作子类,现有类被称作父类。子类会自动拥有父类所有可继承的属性和方法。
好处:继承性主要描述的是类与类之间的关系,通过继承可以无需重新编写原有类的情况下对原有类的功能进行使用和扩展。
2.
1、应用程序不必为每一个子类编写功能调用只需要对抽象父类进行处理即可。大大提高程序的可复用性。
2、子类的功能可以被父类的方法或引用变量所调用,这叫向后兼容可以提高可扩充性和可维护性。
3、使用多态可以解决项目中紧偶合的问题提高程序的课扩展性是OCP原则的一个具体的实现。
五、
Employee如下:
abstract class Employee
private String name; //定义姓名name并私有化属性
private int month; //定义生日月份month并私有化属性
public Employee() //无参构造器
public Employee(String name,int month) //有参构造方法
this.name = name; //给属性name初始化赋值
this.month = month; //给属性month初始化赋值
//获取属性name的方法
public String getName()
return name; //返回name属性
//获取属性month的方法
public int getMonth()
return month; //返回month属性
//给属性name赋初始值
public void setName(String name)
this.name = name; //本类中的属性name
//给属性month赋初始值
public void setMonth(int month)
this.month = month; //本类中的属性month
//创建一个方法getSalary()用来计算工资,参数month是月份,如果当月是员工生日,奖 励100元
public double getSalary(int month)
double salary = 0; //定义工资变量
//判断当前月份是否是员 工的生日月份,如果是奖励100元
if(this.month == month)
salary = salary + 100;
return salary; //返回工资salary
SalariedEmployee如下:
class SalariedEmployee extends Employee
private double monthSalary; //封装monthSalary属性
public SalariedEmployee() //无参构造方法
//有参构造方法 参数 姓名 生日月份 月薪
public SalariedEmployee(String name,int month,double monthSalary)
super(name,month); //调用父类有参构造方法
this.monthSalary = monthSalary; //为属性monthSalary初始化赋值
//获取monthSalary的值
public double getMonthSalary()
return monthSalary;
//给monthSalary赋值
public void setMonthSalary(double monthSalary)
this.monthSalary = monthSalary;
//覆盖父类中的方法
public double getSalary(int month)
double salary = monthSalary+super.getSalary(month); //定义工资变量
return salary;
HourlyEmployee如下:
class HourlyEmployee extends Employee
private double hourlySalary; //定义属性hourlySalary每小时的工资
private int hours; //定义属性hours每月工作的小时数
public HourlyEmployee() //无参构造方法
//有参构造方法 参数 姓名 生日月份 每小时的工资 每月工作的小时数
public HourlyEmployee(String name,int month,double hourlySalary,int hours)
super(name,month); //调用父类有参构造方法
this.hourlySalary = hourlySalary ; //为属性hourlySalary初始化赋值
this.hours = hours; //为属性hours 初始化赋值
public double getHourlySalary() //获取hourlySalary的值
return hourlySalary;
public int getHours() //获取hours的值
return hours;
//定义set方法设置hourlySalary hours的值
public void setHourlySalary(double hourlySalary)
this.hourlySalary =hourlySalary;
public void setHourly(int hours)
this.hours = hours;
//覆盖父类方法
public double getSalary(int month)
if(hours < 0) //如果工作小时数小于0 输出数据错误
System.out.println("数据错误");
return 0;
//小于160个小时的 按照每个月的工作小时数乘以每小时的工资
else if(hours <= 160)
return hourlySalary*hours+super.getSalary(month);
//超出160个小时的小时数 按照1.5倍计算
else return hourlySalary*160+hourlySalary*1.5*(hours- 160)+super.getSalary(month);
SalesEmployee如下:
class SalesEmployee extends Employee
private double sales ; //定义销售额sales
private double rate; //定义提成率rate
public SalesEmployee()
public SalesEmployee(String name,int month,double sales,double rate)
super(name,month);
this.sales = sales;
this.rate = rate;
public double getSales()
return sales;
public double getRate()
return rate;
public void setSales(double sales)
this.sales = sales;
public void setRate(double rate)
this.rate = rate;
public double getSalary(int month)
return this.getSales()*(1+this.getRate())+super.getSalary(month);
BasePlusSalesEmployee如下:
class BasePlusSalesEmployee extends SalesEmployee
private double baseSalary; //定义基础工资baseSalary
//无参构造方法
public BasePlusSalesEmployee()
//有参构造方法
public BasePlusSalesEmployee(String name,int month,double sales,double rate,double baseSalary)
super(name,month,sales,rate);
this.baseSalary = baseSalary;
//get/set方法对私有属性的调用和设置
public double gatBaseSalary()
return baseSalary;
public void setBaseSalary()
this.baseSalary = baseSalary;
public double getSalary(int month)
return baseSalary+super.getSalary(month);
Test如下:
public class Test
public static void main(String[] args)
//声明一个Employee类型的数组,并创建不同子类型的对象
Employee[] employee = new SalariedEmployee(“张三”,1,6000),new HourlyEmployee(“李 四”,2,50,180),new SalesEmployee(“王 五”,3,6500,0.15),new BasePlusSalesEmployee(“赵 六”,4,5000,0.15,2000);
//打印每个员工的工资
for(int i = 0; i < employee.length ;i++)
System.out.println(Math.round(employee[i].getSalary(10)));
以上是关于Java期末考试试题及参考答案(04)的主要内容,如果未能解决你的问题,请参考以下文章