这几天,我整理了一些面向对象的练习题进行编程,学习内容如下:
1.声明员工类Employee,包含属性:编号、姓名、年龄、薪资;声明Test1测试类,并在main方法中,创建一个员工对象,并为属性赋值,并打印员工的信息。
public class Employee extends Object { // extends Object可以不写,等价
private Long id;
private String name;
private int age;// 简单类型,默认值为0
private double salary;
@Override // 注解,用于告知IDE工具,这个方法是一个覆盖的方法
public String toString() {
// return String.format("员工%d的编号为:%d,姓名:%s,年龄:%d,薪资:%.1f", this.id, this.id, this.name, this.age, this.salary);
return "员工"+this.id+"的编号为:"+this.id+",姓名:"+this.name+",年龄:"+this.age+",薪资:"+salary;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
public class Test1 {
public static void main(String[] args) {
Employee e1 = new Employee();
e1.setId(1L); // L用于表示长整型
e1.setName("王肖博"); // “”表示字符串类型
e1.setAge(23);
e1.setSalary(9785.83);
System.out.println(e1);
}
}
2.声明一个日期类MyDate,包含属性:年、月、日;声明一个Test2测试类,并在main方法中,创建一个日期对象并打印显示
public class MyDate {
int year;
int month;
int date;
@Override
public String toString() {
return year+"年"+month+"月"+date+"日";
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDate() {
return date;
}
public void setDate(int date) {
this.date = date;
}
}
public class Test2 {
public static void main(String[] args) {
MyDate d1 = new MyDate();
d1.year = 1991; //默认范围限定词同包可见
d1.month = 10;
d1.date = 5;
System.out.println(d1);
}
}
3.进行折半查找
public class MyArrays {
private MyArrays() {
}
// 可以为任意一维整型数组arr实现从小到大排序
/*
* 冒泡排序: 时间复杂度 空间复杂度 稳定性
* 时间复杂度 O(n**2) 空间复杂度 O(1) 稳定性 true
* 优化算法:可能有多余的比较
*/
public static void sort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
for (int k = 0; k < arr.length - i; k++) {
if (arr[k] > arr[k + 1]) {
int tmp = arr[k];
arr[k] = arr[k + 1];
arr[k + 1] = tmp;
}
}
}
}
// 可以在任意一维整型数组arr中查找value值的下标,如果不存在返回-1
public static int indexOf(int[] arr, int value) {
// 折半查找的前提是有序
sort(arr);
return binarySearch(arr, value, 0, arr.length-1);
}
private static int binarySearch(int[] arr, int target, int begin, int end) {
if (begin > end)
return -1;
int mid = (begin + end) / 2;
if (arr[mid] < target) {
begin = mid + 1;
} else if (arr[mid] > target) {
end = mid - 1;
} else
return mid;
return binarySearch(arr, target, begin, end);
}
//可以实现从任意一维数组arr中复制一个新数组返回,新数组的长度为len,从arr[0]开始复制
public static int[] copy(int[] arr, int len) {
int[] res=new int[len];
// for(int i=0;i
// res[i]=arr[i];
// }
// return res;
int newLen=Math.min(arr.length, len);
System.arraycopy(arr, 0, res, 0, newLen);
return res;
}
}
4.声明一个常识工具类DateCommonsTools,包含五个方法
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class DateCommonsTools {
private DateCommonsTools() {
}
// 根据星期值,返回对应的英语单词
public static String getWeekName(int week) {
String[] arr = new String[] { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
if (week < 0 || week > 6)
return "";
return arr[week];
}
//根据月份值,返回对应的英语单词
public static String getMonthName(int month) {
String[] arr = new String[] { "January", "February", "March", "April", "May", "June", "July", "", "", "",
"November", "" };
if (month < 0 || month > 11)
return "";
return arr[month];
}
//返回某年某月的总天数
public static int getTotalDaysOfMonth(int year, int month) {
int res = 0;
switch (month) { //表达式可以是byte/short/int/char/String/enum
case 1: //必须是确定的值
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
res = 31;
break;
case 4:
case 6:
case 9:
case 11:
res = 30;
break;
case 2:
if(isLeapYear(year))
res=29;
else
res=28;
default:
res=0;
break;
}
return res;
}
//获取某年的总天数
public static int getTotalDaysOfYear(int year) {
if (isLeapYear(year))
return 366;
else
return 365;
}
//判断某年是否是闰年,定义为private的目的在于只供当前类中的另外2个方法进行调用
private static boolean isLeapYear(int year) {
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
public static void main(String[] args) {
Date now = new Date(2021 - 1900, 11 - 1, 21);
int week = now.getDay();// 获取星期几
System.out.println(getWeekName(week));
// 格式化输出 yyyy-MM-dd HH:mm:ss 年-月-日 小时-分钟-秒
DateFormat df = new SimpleDateFormat("E");
System.out.println(df.format(now)); // 周日
// 使用的是中文版的win,所以默认国别为中国
Locale loc = new Locale("en", "us");// 用于封装国别和语言信息
// zh-CN 简体中文-中国 en-US 英语-美国
df = new SimpleDateFormat("E", loc);
System.out.println(df.format(now)); // 指定国别的格式 Sun
System.out.println(now.getMonth()); // 获取月份值,月份差1
System.out.println(getMonthName(now.getMonth()));
df = new SimpleDateFormat("M", loc);
System.out.println("月份:" + df.format(now));
df = new SimpleDateFormat("MMMM", loc);
System.out.println(df.format(now));
System.out.println(now.getYear());// 获取年份,年份差1900
}
}
5.学生继承人类,并声明Test测试类
import java.util.Date;
public class Person {
// 成员属性
private Long id;
String name;
protected int age;
public Date birth;
public Long getId() {
return id;
}
}
public class Student extends Person {
private String id="id123";//覆盖定义
@Override
public String toString() { //重新定义toString方法
return "年龄:"+age //protected表示同包或者子类中可见
// +"编号:"+id; //因为父类中的id是private的,所以不能直接访问
// +"编号:"+getId()
+"编号:"+id //是当前类中重新定义的id,不是从父类中继承的id
+"姓名:"+name//默认package表示同包可见
+"出生日期:"+birth; //public表示到处可见
}
}
public class Test {
public static void main(String[] args) {
Person p1 = new Person();
//is-a关系
Person p2=new Student();
System.out.println(p2.toString());
}
}