第四章面向对象(下)

一、填空题

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

    }
}

7f695763a61c40f98e2089e74b40fee1.jpg

 

 

 

 

 

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《java程序设计》课程的题库资料,由贺州学院整理,可供学生期末课程复习使用,也可以供相关任课教师出卷使用。 内容示例为: 1. JAVA的源代码中定义几个类,编译结果就生成几个以“.class”为后缀的字节码文件。( ) 答案:√ [考点范围] JAVA简介 2. Java源程序是由类定义组成的,每个程序可以定义若干个类,但只有一个类是主类。( ) 答案:√ [考点范围] JAVA简介 3. 无论Java源程序包含几个类的定义,若该源程序文件以a.java命名,编译后只生成一个名为A的字节码文件。( ) 答案:× [考点范围] JAVA简介 4. Java字节码程序是可以在Java虚拟机上执行的。( ) 答案:√ [考点范围] JAVA简介 5. Java程序对计算机硬件平台的依赖性很低。( ) 答案:√ [考点范围] JAVA简介 6. Java可以用来进行多媒体及网络编程。( ) 答案:√ [考点范围] JAVA简介 7. Java语言具有较好的安全性和可移植性及与平台无关等特性。( ) 答案:√ [考点范围] JAVA简介 8. Java语言的源程序不是编译型的,而是编译解析型的。( ) 答案:√ [考点范围] JAVA简介 9. Java Application程序中,必须有一个主方法main(),该方法有没有参数都可以。( ) 答案:× [考点范围] JAVA简介 10. Java是面向对象的语言,对象是客观事物,对象与之是一一对应,它是很具体的概念。( ) 答案:× [考点范围] JAVA简介
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值