【JavaSE】Java 练习专题(一)附完整代码+答案

本篇主要解决内容:

  • 提供一些Java练习题,供大家巩固基础知识⭐️
  • 本文题目参考bilibili平台韩顺平零基础30天学会Java视频 P343 ~ P358
    在这里插入图片描述


题目1:Person类

⭐️ 题目描述:

定义一个 Person类{name,age,job},初始化 Person 对象数组,有3个person对象,并按照 age 从大到小排序,使用冒泡排序

🍑 易错点: 注意是根据 age 信息排序,排序交换的是对象,并非只交换 age 这一属性!

🍌 参考代码:

public class test01 {
    public static void main(String[] args) {
        Person[] people = new Person[3];
        // 信息录入
        people[0] = new Person("黄小黄", 25, "程序员");
        people[1] = new Person("马小淼", 20, "网络安全工程师");
        people[2] = new Person("相小欣", 22, "视频剪辑师");
        // 排序 按照年龄 冒泡排序
        for (int i = 0; i < people.length - 1; i++) {
            for (int j = 0; j < people.length - i - 1; j++) {
                if(people[j].getAge() < people[j+1].getAge()){
                    Person temp = people[i];
                    people[i] = people[i+1];
                    people[i+1] = temp;
                }
            }
        }
        // 打印信息
        for (int i = 0; i < people.length; i++) {
            System.out.println(people[i]);
        }
    }
}

class Person{
    private String name;
    private int age;
    private String job;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getJob() {
        return job;
    }

    public void setName(String name) {
        this.name = name;
    }

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

    public void setJob(String job) {
        this.job = job;
    }

    // 重写toString便于查看结果
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", job='" + job + '\'' +
                '}';
    }
}

🍎 实现结果:
test1


题目2:写出四种访问修饰符及各自的权限

🍎 答案见下表:

访问修饰符本类同包子类不同包
public
protected×
default××
private×××

题目3:编写老师类

⭐️ 题目描述:

编写老师类,要求如下:
(1)要求有属性“姓名 name”,“年龄 age”,“职称 post”,“基本工资 salary”;
(2)编写业务方法,introduce(),实现输出一个教师的信息;
(3)编写教师类的子类:教授类(Professor),工资级别为:教授1.3 ,在子类中重写父类的introduce()方法;
(4)定义初始化一个老师对象,调用业务方法,实现对象基本信息的后台打印。

🍑 分析题目,发现子类都含有工资级别这一属性,因此我们可以将这一属性写到父类中。
🍌 参考代码:

  • Teacher类:
class Teacher{
    private String name;  // 姓名
    private int age;  // 年龄
    private String post;  // 职称
    private double salary;  // 基本工资
    private double grade;  // 工资级别

    public Teacher(String name, int age, String post, double salary, double grade) {
        this.name = name;
        this.age = age;
        this.post = post;
        this.salary = salary;
        this.grade = grade;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getPost() {
        return post;
    }

    public double getSalary() {
        return salary;
    }

    public double getGrade() {
        return grade;
    }

    public void setName(String name) {
        this.name = name;
    }

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

    public void setPost(String post) {
        this.post = post;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public void setGrade(double grade) {
        this.grade = grade;
    }
    
    // 输出教师信息的方法
    public void introduce(){
        System.out.println("name: " + name + " age: " + age 
                + " post: " + post + " salary: " + salary + " grade: " + grade);
    }
}
  • Professor类:
class Professor extends Teacher{
    public Professor(String name, int age, String post, double salary, double grade) {
        super(name, age, post, salary, grade);
    }
    // 重写 introduce
    public void introduce(){
        System.out.println("我是教授类的重写方法");
        super.introduce();
    }
}
  • 测试类
public class test03 {
    public static void main(String[] args) {
        Professor professor = new Professor("李强", 45, "教授", 15000, 1.3);
        professor.introduce();
    }
}

🍎 实现结果:
test3


题目4:继承员工类

⭐️ 题目描述:

父类:员工类
子类:部门经理类
(1)部门经理工资 = 1000 + 单日工资 * 天数 * 等级(1.2);
(2)员工工资 = 单日工资 * 天数 * 等级(1.0);
(3)员工属性:姓名、单日工资、工作天数;
(4)员工方法:打印工资;
(5)部门经理是员工子类,需要重写打印工资的方法;
(6)定义并初始化普通员工对象,调用打印工资方法输入工资,定义并初始化部门经理对象,调用打印工资方法输入工资。

🍑 易错点: 对比普通员工与经理,经理类应该多出一个奖金属性。并且由于奖金不是确定的,我们考虑不使用构造器,并非在创建经理对象时直接确定奖金,而是根据实际情况决定奖金数,使用set方法。

🍌 参考代码:

  • Empolyee类:
class Employee{
    // 属性:姓名,单日工资,工作天数,工资等级
    private String name;
    private double daySal;
    private int workDays;
    private double grade;
    
    // 打印工资
    public void printSal(){
        System.out.println(name + " 工资 = " + daySal*workDays*grade);    
    }
    
    // 构造器 get set
    public Employee(String name, double daySal, int workDays, double grade) {
        this.name = name;
        this.daySal = daySal;
        this.workDays = workDays;
        this.grade = grade;
    }

    public String getName() {
        return name;
    }

    public double getDaySal() {
        return daySal;
    }

    public int getWorkDays() {
        return workDays;
    }

    public double getGrade() {
        return grade;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setDaySal(double daySal) {
        this.daySal = daySal;
    }

    public void setWorkDays(int workDays) {
        this.workDays = workDays;
    }

    public void setGrade(double grade) {
        this.grade = grade;
    }
}
  • Manager类:
class Manager extends Employee{
    // 特有属性
    private double bonus;  // 奖金
    
    // 重写 printSal
    public void printSal(){
        System.out.println("经理 " + getName() + " 工资 = " + (getDaySal()*getWorkDays()*getGrade()+bonus));
    }

    public Manager(String name, double daySal, int workDays, double grade) {
        super(name, daySal, workDays, grade);
    }

    public void setBonus(double bonus) {
        this.bonus = bonus;
    }

    public double getBonus() {
        return bonus;
    }
}
  • 测试类:
public class test04 {
    public static void main(String[] args) {
        // 经理 顺便练习一下向下转型,你也可以直接使用 Manager 编译类型
        Employee employee = new Manager("漩涡鸣人", 100, 22, 1.2);
        if(employee instanceof Manager){
            Manager manager = (Manager) employee;
            manager.setBonus(1000);
        }
        employee.printSal();
        // 员工
        Employee employee1 = new Employee("宇智波佐助", 80, 25, 1.0);
        employee1.printSal();
    }
}

🍎 实现结果:
test4


题目5:可以调用吗?

⭐️ 题目描述:

假定 Grand、Father 和 Son 在同一包下,问:父类和子类中通过 this 和 super 都可以调用哪些属性和方法?

🍑 题目代码(问题见注释):

class Grand{// 超类
	String name = "AA";
	private int age = 100;
	public void g1(){}
}

class Father extends Grand{
	String id = "001";
	private double score;
	public void f1(){
	// super 可以访问哪些成员?
	// this 可以访问哪些成员?
	}
}

class Son extends Father{
	String name = "BB";
	public void g1(){}
	private void show(){
	// super 可以访问哪些成员?
	// this 可以访问哪些成员?
	}
}

🍎 参考答案:

答: 在 Father 类的 f1 方法中,super 可以访问 name 和 g1 两个成员; this 可以访问 id 、 score 、 f1 、name 、g1 五个成员。
在 Son 类的 show 方法中,super 可以访问 id 、 f1 、 name 、 g1四个成员;this 可以访问 name 、g1、show、id 、 f1 五个成员。
归根到底,我们需要明确:super 是从父类开始找,然后找父类的父类; 而 this 是从当前类开始找,然后找父类。其中,我们需要注意访问修饰符的限制,当一个成员被 private 修饰后,其他类不能直接访问该属性!


题目6:输出结果是什么?

⭐️ 题目描述:

阅读下列代码,写出程序的输出结果。

🍑 题目代码:

class Test{// 父类
    String name = "Rose";
    Test(){
        System.out.println("Test");
    }
    Test(String name){
        this.name = name;
    }
}

class Demo extends Test{//子类
    String name = "Jack";
    Demo(){
        super();
        System.out.println("Demo");
    }
    Demo(String s){
        super(s);
    }
    public void test(){
        System.out.println(super.name);
        System.out.println(this.name);
    }

    public static void main(String[] args) {
        new Demo().test();
        new Demo("john").test();
    }
}

🍎 参考答案:

Test
Demo
Rose
Jack
john
Jack

😎 解析:

  1. new Demo().test(): 先使用 Demo类的无参构造器创建对象,在无参构造器中,使用了 super() 调用了父类的无参构造器,因此先输出 Test,而后回到 Demo类 的无参构造器,输出 Demo。最后调用 test 方法,分别输出父类的属性和子类的属性,分别为 Rose 与 Jack;
  2. new Demo(“john”).test(): 先使用 Demo类的有参构造器创建对象,在有参构造器中,使用了 super(s) 调用了父类的有参构造器。由于属性不具备动态绑定机制,所以父类的属性 name 被设置为了 john,而子类的属性 name 保持默认值 Jack 不变。在调用 test 方法时,输出依次为 john、Jack。

题目7:重写 equals 方法

⭐️ 题目描述:

编写Doctor类{name,age,job,gender,sal},含有相应的get与set方法以及含有5个参数的构造器。请你重写 equals 方法,在测试类中创建两个对象,要求属性值均相同,请你判断两个对象是否相等。

🍌 考察: 本题考察点为 equals 方法的作用:(1)比较是否为同一对象; (2)比较属性值是否相同。
如果忘记了 equals,那就没有什么是一个传送门解决不了的!
❤️ 传送 ing ~~ 【JavaSE】面试高频考点,确定不来看看?深入源码解读 == 和 equals 的区别

🍑 参考代码:

  • Doctor类:
class Doctor{
    private String name;  // 姓名
    private int age;  // 年龄
    private String job;  // 工作
    private String gender;  // 性别
    private double sal;  // 工资

    // 重写 equals
    public boolean equals(Object obj){
        // 先判断是否为同一对象
        if(this == obj){
            return true;
        }
        // 判断 obj 是否为 Doctor 或者其派生类
        if(obj instanceof Doctor){
            Doctor doctor = (Doctor) obj;  // 向下转型
            // 属性判断
            return this.name.equals(doctor.name) && this.age == doctor.age
                    && this.job.equals(doctor.job) && this.gender.equals(doctor.gender)
                    && this.sal == doctor.sal;
        }
        // 不是就为 false
        return false;
    }

    public Doctor(String name, int age, String job, String gender, double sal) {
        this.name = name;
        this.age = age;
        this.job = job;
        this.gender = gender;
        this.sal = sal;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getJob() {
        return job;
    }

    public String getGender() {
        return gender;
    }

    public double getSal() {
        return sal;
    }

    public void setName(String name) {
        this.name = name;
    }

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

    public void setJob(String job) {
        this.job = job;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public void setSal(double sal) {
        this.sal = sal;
    }
}
  • 测试类:
public class test07 {
    public static void main(String[] args) {
        Doctor d1 = new Doctor("乔巴", 5, "船医", "不详", 50);
        Doctor d2 = new Doctor("乔巴", 5, "船医", "不详", 50);
        System.out.println(d1 == d2);  // false
        System.out.println(d1.equals(d2));  // true
    }
}

🍎 实现结果:

false
true


题目8:说出 == 与 equals 的区别

名称概念数据类型
==比较运算符用于基本数据类型(判断值是否相等)和引用数据类型(判断两个对象是否相等)
equalsObject类的方法只可用在引用数据类型,默认判断两个对象是否相等,但是一般对该方法进行重写,重写后判断对象的属性是否相等

题目9:什么是多态?具体体现在哪方面?

🍎 答:多态: 方法或者对象具有多种形态,是面向对象(OOP)的第三大特征,是建立在封装和继承基础之上的。
具体体现:
1.方法的多态: 方法的重载与方法的重写体现多态;前者主要是同一对象调用同名的不同方法,后者主要是不同对象调用同名的不同方法;
2.对象的多态 (1)对象的编译类型和对象的运行类型可以不一致,但编译类型在定义时就确定了,不能变化;(2)对象的运行类型是可以变化的,可以通过 getClass()来查看运行类型。


题目10:Java的动态绑定机制是什么?

🍎 答: 1.当调用对象的方法时,该方法会和对象的内存地址/运行类型绑定。 当其查找到对象的运行类型时,会在该类型中查找是否具有该方法,如果有则直接调用,如果没有则逐层向上,如果直到 Object(顶级父类)都没有,则编译器会报错。2.当调用对象的属性时,没有动态绑定机制。 遵守,哪里声明,哪里使用的原则,即由编译类型决定。如下代码块,输出结果为 10,因为编译类型是 A,所以查找的是 A中的属性。

public class test {
    public static void main(String[] args) {
        A b = new B();
        System.out.println(b.a);  // 10
    }
}

class A{
    int a = 10;
}

class B extends A{
    int a = 20;
}

写在最后

🌟以上便是本文的全部内容啦,后续内容将会持续免费更新,如果文章对你有所帮助,麻烦动动小手点个赞 + 关注,非常感谢 ❤️ ❤️ ❤️ !
在这里插入图片描述

如果有问题,欢迎私信或者评论区!
共勉:“你间歇性的努力和蒙混过日子,都是对之前努力的清零。”
在这里插入图片描述

  • 40
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 41
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴趣使然黄小黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值