一、填空题
1.在面向对象中,类之间共享属性和操作的机制称为继承。
2.在继承关系中,子类会自动继承父类中的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类的方法进行重写。
3.final关键字可用于修饰类、变量和方法,它有“无法改变的”或者“最终”的含义。
4.一个类如果要实现一个接口,可以通过关键字implements来实现这个接口。
5.一个类如果实现一个接口,那么它就需要实现接口中定义的全部方法,否则该类就必须定义成抽象类。6.如果子类想使用父类中的成员,可以通过关键字super引用父类的成员。
二、判断题
1.定义一个抽象类的关键字是interface。(错)
2.父类的引用指向自己子类的对象是多态的一种体现形式。(√)
3.Java中一个类最多可以有一个直接父类。(√)
4.接口中定义的变量默认是publicstaticfinal型,且必须赋初值。(√)
5.final修饰的局部变量只能被赋值一次。(√)
6.在定义方法时不写方法体,这种不包含方法体的方法为静态方法。(错)
7.Java中的instanceof关键字可以判断一个对象是否为某个类(或接口)的实例或者子类实例。(√)
三、选择题
1.下面程序运行的结果是(B)
public classA{
public static void main(String[]args){
Bb=newB();
b.test();
}
voidtest(){
System.out.print("A");
}
}
class B extendsA{
voidtest(){
super.test();
System.out.print("B");
}
}
A、产生编译错误
B、代码可以编译运行,并输出结果AB
C、代码可以编译运行,但没有输出
D、编译没有错误,但会产生运行时异常
2.下列关于继承的描述中,错误的是(D)
A、Java中一个类只能有一个直接父类
B、多个类可以继承一个父类
C、Java中,C类继承B类,B类又继承A类,这时,C类也可称作A类的子类
D、Java是支持多继承的
3.下列关于对象的类型转换的描述,说法错误的是(C)
A、对象的类型转换可通过自动转换或强制转换进行
B、无继承关系的两个类的对象之间试图转换会出现编译错误
C、由new语句创建的父类对象可以强制转换为子类的对象
D、子类的对象转换为父类类型后,父类对象不能调用子类的特有方法
4.下列关于接口的说法中,错误的是(D)
A、接口中定义的方法默认使用“publicabstract”来修饰B、接口中的变量默认使用“publicstaticfinal”来修饰
C、接口中的所有方法都是抽象方法
D、接口中定义的变量可以被修改
5.阅读下段代码:
classDog{
public String name;
Dog(String name){ this.name=name;}}
publicclassDemo1{
public static void main(String[]args){
Dog dog1=newDog("xiaohuang");
Dog dog2=newDog("xiaohuang");
Strings1=dog1.toString();
Strings2=dog2.toString();
Strings3="xiaohuang";Strings4="xiaohuang";
}
}
返回值为true的是(C)
A、dog1.equals(dog2)
B、s1.equals(s2)
C、s3.equals(s4)
D、dog1==dog2
简答题
1.请简述Java中继承的概念以及使用继承的好处。
概念:在Java中","类的继承是指在一个现有类的基础上去构建一个新的类","构建出来的新类被称作子类","现有类被称作父类","子类会自动拥有父类所有可继承的属性和方法。
好处:继承性主要描述的是类与类之间的关系","通过继承","可以无需重新编写原有类的情况下","对原有类的功能进行使用和扩展。
2.简要概述多态的作用。
(1)应用程序不必为每一个子类编写功能调用","只需要对抽象父类进行处理即可。大大提高程序的可复用性。
(2)子类的功能可以被父类的方法或引用变量所调用","这叫向后兼容","可以提高可扩充性和可维护性。
(3)使用多态可以解决项目中紧偶合的问题","提高程序的课扩展性.是OCP原则的一个具体的实现。
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)每个类都完全封装,不允许非私有化属性。
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
}
}
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;
}
}
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方法设置hourlySalaryhours的值
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);
}
}
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);
}
}
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 getBaseSalary() {
return baseSalary;
}
public void setBaseSalary() {
this.baseSalary=baseSalary;
}
public double getSalary(int month) {
return baseSalary+super.getSalary(month);
}
}
//定义一个测试类
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)));
}
}