《Java基础入门》第三版--黑马程序员课后习题(编程部分)

article/2025/9/23 15:48:18

第 1 章 Java 开发入门

第 2 章 Java 编程基础

1. 编写程序,计算1+3+…+99的值,要求如下:

(1)使用循环语句实现1~99的遍历

(2)在遍历过程中,通过条件判断当前的数是否为奇数,如果是就累加,否则不加。

 public class getSum {
2 public static void main(String[] args) {
3 int sum = 0;
4 for (int i = 1; i < 100; i++) {
5 if (i % 2 != 0)
6 sum += i;
7 }
8 System.out.println(sum);
9 }
10 }

2.使用do… while循环语句计算正数5的阶乘。

1 public class Test {
2 public static void main(String[] args) {
3 int i = 1;
4 long sum = 1;
5 do {
6 sum *= i;
7 i++;
8 } while (i <= 5);
9 System.out.println(sum);
10 }
11 }

第 3 章 面向对象(上)

某公司正在进行招聘工作,被招聘人员需要填写个人信息,编写个人简历的封装类Resume,并编写测试。Resume类图及输出效果

Example.java


class Resume {private String name;private String sex;private int age;public Resume(){}public Resume(String name,String sex,int age){this.name = name;this.sex = sex;this.age = age;}public String getName(){return name;}public String getSex(){return sex;}public int getAge(){return age;}public void introduce(){System.out.println(" 姓 名 : "+this.getName()+"\n 性 别 :
"+this.getSex()+"\n 年龄:"+this.getAge());}
}
public class Example{public static void main(String[] args){Resume re = new Resume("李四","男",20);re.introduce();}
}

第 4 章 面向对象(下)

某公司的员工分为5类,每类员工都有相应的封装类,这5个类的信息如下。

(1) Emplovee:这是所有员工的父类。

①属性:员工的姓名、员工的生日月份

②方法: Salary int month)根据参数月份确定工资。如果该月员工过生日,则公司会额外发放100元。

(2) Salariedemployee: Employee的子类,拿固定工资的员工。

属性:月薪

(3) Hourlyemployee: Employee的子类,按小时拿工资的员工,每月工作超出160h部分按照1.5倍工资发放。

属性:每小时的工资、每月工作的小时数。

(4) Salesemployee: Employee的子类,销售人员,工资由月销售额和提成率决定。

属性:月销售额、提成率。

(5) Baseplussalesemploye: Salesemployee的子类,有固定底薪的销售人员,工资底薪加上销售提成。

属性:底薪。

本题要求根据上述员工分类(编写一个程序,实现以下功能:

(1)创建 Employee,分别创建若干不同的 Employee对象,并打印某个用

(2)每个类都完全封装,不允许有非私有化属性。

Employee.java


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.java

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.java

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*(hours160)+super.getSalary(month);
}
}

SalesEmployee.java

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.java

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.java
//定义一个测试类
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)));
}
}

第 5 章 异常

一.简答题

1.写出处理异常的五个关键字

答:1. try、catch、finally、throw、throws。

2.简述try...catch语句的一场处理流程并画出流程图

答:2. 程序通过 try 语句捕获可能出现的异常,如果 try 语句没有捕获到异常,则直接跳出 try…catch 语句块执行其他程序;如果在 try 语句中捕获到了异常,则程序会自动跳转到 catch 语句中找到匹配的异常类型进行相应的处理。如果 try 语句捕获到的异常与 catch 语 句例的异常匹配,则先执行 catch 中的语句,最后执行其他程序语句。

3.简述处理编译异常的两种方法

答:3. 处理编译时期的异常有两种方式如下: (1)使用 try…catch 语句对异常进行捕获处理。 (2)使用 throws 关键字声明抛出异常,调用者对异常进行处理。

第 6 章 Java API

五、1.每次随机生成10个0~100的随机正整数。

2.计算从今天算起100天以后是几月几日,并格式化成×××X年X月×日的形式打印出来。

提示:

(1)调用Calendar类的add()方法计算100天后的日期。

(2)调用Calendar类的getTime()方法返回Date类型的对象。

(3)使用FULL格式的DateFormat对象,调用format()方法格式化Date对象。

Example.java

import java.util.Random;
2 public class Example {
3 public static void main(String[] args) {
4 for(int i=0;i<10;i++){
5 System.out.println(new Random().nextInt(100));
6 }
7 }
8 }

Test.java

1 import java.text.DateFormat;
2 import java.util.Calendar;
3 import java.util.Date;
4 public class Test {
5 public static void main(String[] args) {
6 Calendar calendar = Calendar.getInstance();
7 calendar.add(Calendar.DATE, 100);
8 Date date = calendar.getTime();
9 DateFormat format = DateFormat.getDateInstance(DateFormat.FULL);
10 String string = format.format(date);
11 System.out.println(string);
12 }
13 }

第 7 章 集合类

1.编写程序,向ArmsList集合中添加元素,然后遍历并输出这些元素。

1 public class Example {
2 public static void main(String[] args) {
3 ArrayList list = new ArrayList<>();
4 list.add("a");
5 list.add("b");
6 list.add("c");
7 list.add("a");
8 for(Iterator it = list.iterator();it.hasNext();){
9 System.out.println(it.next());
10 }
11 }
12 }

2.请发照下列要求编写程序。

(1)写一个Student类,包含name和age属性,提供有参构造方法。

(2)在Snudent 类中,重写 toString()方法,输出age和name的值。

(3)在Student类中,重写hashCode()和equals()方法。

.hshCode()的返回值是name的哈希值与age的和。

.equals()判断对象的name和age是否相同,相同则返回true,不同则返回false。

4)编写一个测试类,创建一个HashSet<Student>对象hs,向hs中添加多个sat对象,假设有两个Student对象相等。输出HashSet集合,观察Student对象是否添加成功。

Test.java

1 import java.util.*;
2 class Student {
3 private int age;
4 private String name;
5 public Student(int age, String name) {
6 this.age = age;
7 this.name = name;
8 }
9 public String toString() {
10 return age + ":" + name;
11 }
12 public int hashCode() {
13 return name.hashCode() + age;
14 }
15 public boolean equals(Object obj) {
16 if (this == obj)
17 return true;
18 if (!(obj instanceof Student))
19 return false;
20 Student stu = (Student) obj;
21 return this.name.equals(stu.name) && this.age == stu.age;
22 }
23 }
24 public class Test {
25 public static void main(String[] args) {
26 HashSet<Student> hs = new HashSet<Student>();
27 hs.add(new Student(18, "zhangsan"));
28 hs.add(new Student(20, "lisa"));
29 hs.add(new Student(20, "lisa"));
30 System.out.println(hs);
31 }
32 }

第 8 章 泛型

按照下列提示编写一个泛型接口以及其实现类

(1)创建泛型接口Generic<T>,并创建抽象方法get(T t)。

(2)创建实现类GenericImpl<T> , 并实现get(T t)方法。

1 interface Generic<T>{ 
2 public abstract void get(T t){} 
3 } 
4 class Generic<T> implements Generic{ 
5 public void get(T t){} 
6 }

第 10 章 IO(输入输出)    

编写一个程序,分别使用字节流和字符流复制一个文本文件。要求如下:
(1)使用 FilelnputStream , FileOutputStreaem 和 FileReader , FileWriter 分别进行
复制。
(2)使用字节流复制时,定义一个长度为1024的字节数组作为缓冲区,使用字符流
复制。

Test01.Java

1 import java.io.*;
2 public class Test01 {
3 public static void main(String[] args) throws Exception {
4 // 字节流拷贝
5 FileInputStream in = new FileInputStream("E:/src.txt");
6 FileOutputStream out = new FileOutputStream("E:/des1.txt");
7 byte[] buf = new byte[1024];
8 int len;
9 while ((len = in.read(buf)) != -1) {
10 out.write(buf, 0, len);
11 }
12 in.close();
13 out.close();
14 // 字符流拷贝
15 BufferedReader bf = new BufferedReader(new 
16 FileReader("E:/src.txt"));
17 BufferedWriter bw = new BufferedWriter(new 
18 FileWriter("E:/des2.txt"));
19 String str;
20 while ((str = bf.readLine()) != null) {
21 bw.write(str);
22 bw.newLine();
23 }
24 bf.close();
25 bw.close();
26 }
27 }

第 12 章 多线程

编写一个多线程程序,模拟火车售票窗口的售票功能。创建线程1和线程2,通过这
两个线程共同售出100张票。

 Example.java

Example.java
1 public class Example {
2 public static void main(String[] args) {
3 TicketWindow tw = new TicketWindow();
4 new Thread(tw, "线程 1").start();
5 new Thread(tw, "线程 2").start();
6 }
7 }
8 class TicketWindow implements Runnable {
9 private int num = 100;
10 public void run() {
11 while (num > 0) {
12 Thread th = Thread.currentThread();
13 String th_name = th.getName();
14 System.out.println(th_name + " 正在发售第 " + num-- + " 张票 ");
15 }
16 }


http://chatgpt.dhexx.cn/article/GMC1l4Qc.shtml

相关文章

《Java基础入门》笔记——01 Java初步

1 关于Java 1.1 Java的发展简史 Java之父——Gosling(高司令)98年&#xff0c;Java2企业平台J2EE发布99年发布J2SE(标准版)、J2EE(企业版)、J2ME(微型版)04年&#xff0c;发布JavaSE5.009年&#xff0c;Oracle收购Sun14年&#xff0c;发布JavaSE8 1.2 Java语言的特点 简单。…

java基础入门(完整详细版)

前言&#xff1a; 这篇教程对没学过java的完全适用这篇教程是一个学习方向的引导&#xff0c;且只针对基础入门。 一.入门篇 1.安装JDK的运行环境 1.1 下载JDK 直接官网下载&#xff1a;http://www.oracle.com/&#xff1b;链接&#xff1a;网盘安装JDK点击就可以下载(推荐…

Linux udev规则编写

编写本文的目的: 看完本章,朋友们可以进行随心所欲的运用udev,编写udev规则,更好的管理Linux设备。例如,把硬盘sda根据盘的SN码生成一个软连接,使得SN码当做sda一样使用。 在文章结束后,既可以有方案可以实现。 udev是什么? udev 是 Linux2.6 内核里的一个功能,它替代…

udev的rules编写

1.综述 本文简单介绍udev机制&#xff0c;并编写udev规则&#xff0c;实现手机即U盘自动挂载 2.udev介绍 udev 是 Linux2.6 内核里的一个功能&#xff0c;它替代了原来的 devfs&#xff0c;成为当前 Linux 默认的设备管理工具。udev 以守护进程的形式运行&#xff0c;通过帧听内…

[Linux 基础] -- udev 和 rules 使用规则

前言&#xff1a; 本文以通俗的方法阐述 udev 及相关术语的概念、udev 的配置文件和规则文件&#xff0c;然后以 Red Hat Enterprise Server 为平台演示一些管理设备文件和查询设备信息的实例。本文会使那些需要高效地、方便地管理 Linux 设备的用户受益匪浅&#xff0c;这些用…

linux udev

了解udev (Linux dynamic device management) 1.概述 Udev is the device manager for the Linux kernel. Udev dynamically creates or removes device node files at boot time in the /dev directory for all types of devices. udev is a replacement for the Device File…

udev(六):udev

原创文章&#xff0c;转载请注明出处&#xff0c;谢谢&#xff01; 作者&#xff1a;清林&#xff0c;博客名&#xff1a; 飞 空静渡 <!-- page { margin: 2cm } P { margin-bottom: 0.21cm } --> 基于上面提到的问题&#xff0c;便开始了 udev 的项目。 …

udev(八):实战:使用udevadm修改usb优盘在/dev下的名字

原创文章&#xff0c;转载请注明出处&#xff0c;谢谢&#xff01; 作者&#xff1a;清林&#xff0c;博客名&#xff1a; 飞 空静渡 udev的规则的编写&#xff0c;我这里就不说了&#xff0c;大家可以在udev的文档中可以了解&#xff0c;有时间的话我在安排一…

Linux下udev规则详解

如何运用udev&#xff1f;编写udev规则&#xff1f;通过udev更好的管理Linux设备? udev是什么&#xff1f; udev 是 Linux2.6 内核里的一个功能&#xff0c;它替代了原来的 devfs&#xff0c;成为当前 Linux 默认的设备管理工具。udev 以守护进程的形式运行&#xff0c;通过侦…

Udev设备管理器

udev 引入 在2.4内核中 引入了 devfs&#xff0c;他支持设备节点的动态创建。devfs提供了在内存中的文件系统中创建设备节点的能力。设备驱动程序能够自主的管理自己的设备文件。而命名节点的任务还是落到了设备驱动程序头上。但是&#xff0c;设备命名策略是可管理的&#xf…

linux下udev详解

一.udev简介 udev是一个设备管理工具&#xff0c;udev以守护进程的形式运行&#xff0c;通过侦听内核发出来的uevent来管理/dev目录下的设备文件。udev在用户空间运行&#xff0c;而不在内核空间 运行。它能够根据系统中的硬件设备的状态动态更新设备文件&#xff0c;包括设备…

[2020.1.14][udev] udev介绍

1 什么是udev udev是一种工具&#xff0c;它能够根据系统中的硬件设备的状态动态更新设备文件&#xff0c;包括设备文件的创建&#xff0c;删除等。 设备文件通常放在/dev目录下。使用udev后&#xff0c;在/dev目录下就只包含系统中真正存在的设备。 设备访问控制udev:user …

LINUX下 Udev详解

如果你使用Linux比较长时间了&#xff0c;那你就知道&#xff0c;在对待设备文件这块&#xff0c;Linux改变了几次策略。在Linux早期&#xff0c;设备文件仅仅是是一些带有适当的属性集的普通文件&#xff0c;它由mknod命令创建&#xff0c;文件存放在/dev目录下。后来&#xf…

wmic bug

今天尝试用wmic进行横向移动&#xff0c;老是出现 , - Alias not found&#xff0c;再三确认不是命令的问题&#xff0c;尝试修改域控用户的密码后成功解决&#xff0c;难道这时wmic的bug&#xff1f;&#xff1f;&#xff1f; 猜测是因为密码种含有 , . 这样的符号导致命令产生…

wmic命令学习

我目前知道wmic可以查询进程&#xff0c;还可以查询服务。查询进程使用wmic process,如果想知道进程的名字、进程号、执行文件路径可以通过get来获取&#xff0c;还可以根据where筛选进程进行查询。 wmic process get name, processid,executablepath 查询主机进程信息&#xf…

Windows 命令 WMIC 使用详解

WMIC扩展WMI&#xff08;Windows Management Instrumentation&#xff0c;Windows管理工具&#xff09; &#xff0c;提供了从命令行接口和批命令脚本执行系统管理的支持。在WMIC出现之前&#xff0c;如果要管理WMI系统&#xff0c;必须使用一些专门的WMI应用&#xff0c;例如S…

wmic java_Java执行wmic命令获取系统环境变量

1.首先编写文件setenv.bat设置系统环境变量&#xff1a; echo %cd% set framework_home%cd% echo %framework_home% wmic ENVIRONMENT create name"framework_home",username"",VariableValue"%framework_home%" Note: 此处假设framework_home为…

wmic命令

友情链接&#xff1a;wmic命令 目录 一、如何获取帮助文档 &#xff08;1&#xff09;wmic /? &#xff08;2&#xff09;wmic nic /? &#xff08;3&#xff09;wmic nic get ##获取网卡所有信息&#xff0c;如下只列出部分列 &#xff08;4&#xff09;信息筛…

内网渗透 | powershellwmic详解

文章目录 引子PowerShell0x001基本概念0x002命令格式0x003基本使用0x004常用命令0x005powershell脚本0x006参考文章 WMIC0x001基本概念0x002命令格式0x003常用命令1、目标系统相关2、用户管理 0x004参考文章 引子 之前在内网渗透&#xff0c;免杀中到处能看到powershell和wmic的…

wmic横向

WMI&#xff0c;是Windows 2K/XP管理系统的核心&#xff1b;对于其他的Win32操作系统&#xff0c;WMI是一个有用的插件。WMI以CIMOM为基础&#xff0c;CIMOM即公共信息模型对象管理器&#xff08;Common Information Model Object Manager&#xff09;&#xff0c;是一个描述操…