Java实验报告四,研究生薪资管理,创建一个抽象交通工具Vehicle类,经理与员工工资等实验

简介: 1、实验题目:类的继承和方法重写定义一个基类作为父类,再定义一个继承父类的子类,在子类中重写父类的方法,使用super关键字调用父类的方法,测试其功能。
🏠个人主页: 黑洞晓威
🧑个人简介:大家好,我是晓威,一名普普通通的大二在校生,希望在CSDN中与大家一起成长。

🎁如果你也在正在学习Java,欢迎各位大佬来到我的博客查漏补缺呀,如果有哪里写的不对的地方也欢迎诸佬指正啊。

@[Toc]

一、实验目的

1、理解继承的概念;

2、掌握方法的重写;

3、掌握super、final关键字的使用;

4、掌握抽象类和接口的使用;

5、掌握多态的使用;

6、掌握内部类的使用;

7、掌握异常处理方式,能够自定义异常类;

8、了解Object类。

二、实验内容

1、实验题目:类的继承和方法重写

定义一个基类作为父类,再定义一个继承父类的子类,在子类中重写父类的方法,使用super关键字调用父类的方法,测试其功能。

class Person {
    public void say(){
        System.out.println("我是父类,会被子类的super调用呀");
    }
}
class Student extends Person{
    public void say(){
        System.out.println("我是子类");
        super.say();//调用父类的say()方法
    }
}

public class S4_1 {
    public static void main(String[] args) {
        new Student().say();
        //调用Student中的say()方法,方法中又调用父类Person中的say()方法
    }
}

2、实验题目:final关键字的应用

定义一个类,在类中声明成员变量和成员方法,尝试使用final关键词修饰类中的变量、方法及该类,测试并查看结果,必要时加以注释。

class Person {
    private final String name;//只能被定义一次之后无法修改
    private int age;


    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void say(){
        System.out.println("我是父类成员方法");
    }

    public final void finalsay(){  //final修饰的方法子类无法重写
        System.out.println("我是父类的final方法");
    }
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

class Student extends Person
//如果Person类用final修饰,extends Person 会报错,final修饰的类无法被继承
{

    public Student(String name, int age) {
        super(name, age);
    }

    public void say(){
        System.out.println("我是子类重写的非final方法");
    }

    //报错,无法重写
        /*public void finalsay(){
        System.out.println("子类的方法");
        super.say();
    }*/
}
public class S4_2 {
    public static void main(String[] args) {
        Person student = new Student("Tom",18);
        System.out.println("初始化名字为:"+student.getName());
        System.out.println("初始化年龄为:"+student.getAge());


        student.setAge(19);
        System.out.println("修改后年龄为:"+student.getAge());
        //没有student.setName,因为name被final修饰初始化后不能更改

        student.say();//调用子类重写的父类的say()方法
        student.finalsay();//调用父类的finalsay()方法,因为子类无法重写
    }
}

3、实验题目:研究生薪资管理

(注:在职研究生继承学生类,实现雇员接口)

在学校中,学生每个月需要交相应的生活费(2000元),雇员每个月有相应的工资(1000~3000随机生成),而在职研究生(on-the-job postgraduate)既是雇员又是学生,所以在职研究生既需要交学费又会有工资。下面要求编写一个程序来统计在职研究生的收入与学费,如果收入无法满足交学费,则输出“撸起袖子加油干!”信息。(思考:如果使用抽象类,是否能完成该要求?)

答:无法实现继承两个类,不能完成要求

interface Empioyee {
    int salary =12*(int)(1000+2000*Math.random());//计算全年的工资为多少
}

class Student {
    private int cost = 2000*12;//计算一年的学费

    public int getCost() {
        return cost;
    }
}

class Postgraduate extends Student implements Empioyee{

    public void judge(){
        if(new Student().getCost()>salary){//判断学费与工资
            System.out.println("撸起袖子加油干!");
        }else {
            System.out.println("干得好,打工人!");
        }
    }

}

public class S4_3 {
    public static void main(String[] args) {
        Postgraduate postgraduate = new Postgraduate();//创建一个研究生实例
        postgraduate.judge();//调用judge方法
    }
}

4、实验题目:创建一个抽象交通工具Vehicle类

它有 wheelNum 和 seatNum 两个成员变量以及抽象方法 display()。 类 Bus 和类 Motorcycle 继承自Vehicle类,实现打印成员变量的 display()方法。在主函数中分别生成Bus对象和Motorcycle对象,上转型为Vehicle对象调用 display()方法。

abstract class Vehicle {//抽象类
    int wheelNum;
    int seatNum;

    protected abstract void display();

}

class Bus extends Vehicle{
    public Bus(int a, int b) {
        this.wheelNum=a;
        this.seatNum=b;
    }
    @Override
    public void display(){//重写抽象方法
        System.out.println("公交车有"+this.wheelNum+"个轮子和"+this.seatNum+"个座位");
    }
}

class Motorcycle extends Vehicle{
    public Motorcycle(int a, int b) {
        this.wheelNum=a;
        this.seatNum=b;
    }
    @Override//重写抽象方法
    public void display(){
        System.out.println("摩托车有"+this.wheelNum+"个轮子和"+this.seatNum+"个座位");
    }
}

public class S4_4 {
    public static void main(String[] args) {
        Vehicle bus = new Bus(4,40);
        Vehicle motorcycle = new Motorcycle(2, 2);
        bus.display();
        motorcycle.display();
    }
}

5、实验题目:经理与员工工资,主要考察多态

某公司的人员分为员工和经理两类,但经理也属于员工中的一类,公司员工和经理都有自己的姓名,年龄,工号、工资、工龄等属性(通过属性无法区分员工和经理)和工资上涨函数。假设每次给员工涨工资一次能涨10%,经理能涨20%。要求利用多态实现给员工和经理涨工资,测试并通过。

public class S4_5 {
    public static void main(String[] args) {
        Employee employee = new Employee(1000);
        Employee manager = new manager(1000);//多态的实现

        System.out.println("原工资为:"+ employee.getSalary());
        employee.raise();//调用Employee中的raise方法
        manager.raise();//调用manager类中重写的raise方法

        System.out.println("员工增长10%后为:"+employee.getSalary());
        System.out.println("经理增长20%后为:"+manager.getSalary());

    }
}


class Employee{
    protected int age;
    protected int id;
    protected double salary;
    protected int workage;

    public Employee() {
    }

    public Employee(double salary) {
        this.salary = salary;
    }



    public void raise(){
        this.salary+=this.salary*0.1;
    }

    public double getSalary() {
        return salary;
    }
}

class manager extends Employee{
    public manager() {
    }

    public manager(double salary) {
        this.salary = salary;
    }


    public void raise(){//重写Employee中的raise()方法
        this.salary+=this.salary*0.2;
    }

    @Override
    public double getSalary() {
        return salary;
    }
}

6、实验题目:补全代码

把下面的代码补充完整,输出结果为“实现了Inner接口的匿名内部类!”,并测试输出结果。

interface Inner{

​ void introduce();

}

class Outer{

​ //补齐代码,完成方法主要功能

}

class InnerClassTest{

​ public static void main(String[] args){

​ Outer.method().introduce ();

}

}

interface Inner{
void introduce();
}

class Outer {
public static Inner method(){
return new Inner() {
@Override
public void introduce() {
System.out.println("实现了Inner接口的匿名内部类");
            }
        };
    }
//补齐代码,完成方法主要功能
}

class S4_6{
public static void main(String[] args){
Outer.method().introduce();
    }
}

7、实验题目:设计一个类,在类中能够处理自定义异常类并测试。(选做)

import java.util.Scanner;

class myexcept extends Exception {//继承extends
    private int detail;

    public myexcept(int a) {

        this.detail = a;
    }

    //toString打印异常信息
    @Override
    public String toString() {
        return "出现异常!!"+detail+"大于10";
    }
}


class test {
    static void moth() throws myexcept {
        int i = 0;
        System.out.println("请输入一个不大于10的数");
        Scanner scanner = new Scanner(System.in);
        i = scanner.nextInt();
        System.out.println("传递的参数为" + i);

            if (i > 10) {
                throw new myexcept(i);//如果输入大于10则抛出异常
            }

        System.out.println("没有出现异常");
    }
}


public class S4_7 {
    public static void main(String[] args) throws myexcept {
        test.moth();
    }
}

🎉文章到这里就结束了,感谢诸佬的阅读。🎉

💕欢迎诸佬对文章加以指正,也望诸佬不吝点赞、评论、收藏加关注呀😘在这里插入图片描述

相关文章
|
6天前
|
安全 Java 编译器
JAVA泛型类的使用(二)
接上一篇继续介绍Java泛型的高级特性。3. **编译时类型检查**:尽管运行时发生类型擦除,编译器会在编译阶段进行严格类型检查,并允许通过`extends`关键字对类型参数进行约束,确保类型安全。4. **桥方法**:为保证多态性,编译器会生成桥方法以处理类型擦除带来的问题。5. **运行时获取泛型信息**:虽然泛型信息在运行时被擦除,但可通过反射机制部分恢复这些信息,例如使用`ParameterizedType`来获取泛型参数的实际类型。
|
6天前
|
安全 Java 编译器
JAVA泛型类的使用(一)
Java 泛型类是 JDK 5.0 引入的重要特性,提供编译时类型安全检测,增强代码可读性和可维护性。通过定义泛型类如 `Box<T>`,允许使用类型参数。其核心原理是类型擦除,即编译时将泛型类型替换为边界类型(通常是 Object),确保与旧版本兼容并优化性能。例如,`Box<T>` 编译后变为 `Box<Object>`,从而实现无缝交互和减少内存开销。
|
3月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
200 58
|
2月前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
3月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
104 8
|
3月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
3月前
|
Java Android开发
Eclipse 创建 Java 类
Eclipse 创建 Java 类
40 0
Java基础-抽象队列同步器:AbstractQueuedSynchronizer(1)
AQS定义了一套多线程访问共享资源的同步器框架。 许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch。 它维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列。 多线程争用资源被阻塞时会进入此队列。 AQS定义两种资源共享方式:Exclusive(独占,只有一个线程能执行,如ReentrantLock)和Share(共享,多个线程可同时执行,如Semaphore/CountDownLatch)。
133 0
|
2天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
33 14
|
5天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
34 13

热门文章

最新文章