Java面向对象编程(中)
主要讲解宋老师里面课后题(无答案的),以便后期复习使用。(可以私信我要文档资料
简答题
Object类的使用说明:
-
为什么要重写toString()方法?
在Object类里面定义toString()方法的时候返回的对象的哈希code码,这个hashcode码不能简单明了的表示出对象的属性。所以要重写toString()方法。比如我前面数组那一篇文章用的Arrays.toString()方法就是调用重写的toString方法。 -
为什么要重写equals()方法?
判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象(相当于比较的是存在堆里的地址值)。这样我们往往需要重写equals()方法来判断里面的数据是否相等。 -
写出“==”和equals的区别(重点)
== :运算符
1.可以使用在基本数据类型变量和引用数据类型变量中
2.如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同)
如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体
补充: == 符号使用时,必须保证符号左右两边的变量类型一致。equals()方法的使用:
-
是一个方法,而非运算符
-
只能适用于引用数据类型
-
Object类中equals()的定义:
public boolean equals(Object obj) {
return (this == obj);
}
说明:Object类中定义的equals()和==的作用是相同的:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体 -
像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是
两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。 -
通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同。那么,我们
就需要对Object类中的equals()进行重写.
重写的原则:比较两个对象的实体内容是否相同.
-
编程题
- 按要求实现下列问题:实现一个名为Person的类和它的子类Employee,Employee有两个子类Faculty和Staff。具体要求如下:
1) Person类中的属性有:姓名name(String类型),地址address(String类型),
电话号码telphone(String类型)和电子邮件地址email(String类型);
2) Employee类中的属性有:办公室office(String类型),工资wage(double
类型),受雇日期hiredate(String类型);
3) Faculty类中的属性有:学位degree(String类型),级别level(String类型);
4) Staff类中的属性有:职务称号duty(String类型)。
5) 现有对象Person p1 =new Faculty()和Person p2 =new Staff (),请分别为p1的属性赋值“本科”和Staff类的duty赋值“职员”
public class Person {
private String name;
private String address;
private String telphone;
private String email;
public Person() {
}
public Person(String name, String address, String telphone, String email) {
this.name = name;
this.address = address;
this.telphone = telphone;
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getTelphone() {
return telphone;
}
public void setTelphone(String telphone) {
this.telphone = telphone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
public class Employee extends Person{
private String office;
private double wage;
private String hiredate;
public Employee(){
}
public Employee(String name, String address, String telphone, String email, String office, double wage, String hiredate) {
super(name, address, telphone, email);
this.office = office;
this.wage = wage;
this.hiredate = hiredate;
}
public String getOffice() {
return office;
}
public void setOffice(String office) {
this.office = office;
}
public double getWage() {
return wage;
}
public void setWage(double wage) {
this.wage = wage;
}
public String getHiredate() {
return hiredate;
}
public void setHiredate(String hiredate) {
this.hiredate = hiredate;
}
}
public class Staff extends Employee{
private String duty;
public Staff() {
}
public Staff(String name, String address, String telphone, String email, String office, double wage, String hiredate, String duty) {
super(name, address, telphone, email, office, wage, hiredate);
this.duty = duty;
}
public String getDuty() {
return duty;
}
public void setDuty(String duty) {
this.duty = duty;
}
public static void main(String[] args) {
Person p1 = new Staff();
if(p1 instanceof Staff){
Staff staff = (Staff)p1; //因为父类里面没有duty这个属性,所以只能向下转型才能进行赋值操作.
staff.setDuty("职员");
}
}
}
public class Faculty extends Employee{
private String degree;
private String level;
public String getDegree() {
return degree;
}
public void setDegree(String degree) {
this.degree = degree;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public Faculty() {
}
public Faculty(String name, String address, String telphone, String email, String office, double wage, String hiredate, String degree, String level) {
super(name, address, telphone, email, office, wage, hiredate);
this.degree = degree;
this.level = level;
}
public static void main(String[] args) {
Person p2 = new Faculty();
if(p2 instanceof Faculty){
Faculty faculty = (Faculty)p2; //因为父类里面没有degree这个属性,所以只能向下转型才能进行赋值操作.
faculty.setDegree("本科");
}
}
}
- 创建一个汽车类(Car)
(1)为其定义两个属性:颜色和型号。每个属性都使用private进行封装,为每个属性设置set、get方法。
(2)为该类创建两个构造方法。第一个为无参的构造方法。第二个为带参构造方法
(3)重写toString方法,通过toString输出汽车信息。
(4)重写equals方法,如果汽车的颜色和型号相同就认为是同一辆车。
(5)实例化两个对象,输出两个对象的信息,比较两个对象是否是同一个对象。
public class Car {
public static void main(String[] args) {
Car c1 = new Car();
c1.setColor("red");
c1.setModel("宝马");
Car c2 = new Car();
c2.setColor("red");
c2.setModel("宝马");
System.out.println(c1.equals(c2));
}
private String color;
private String model;
@Override
public String toString() {
return "Car{" +
"color='" + color + '\'' +
", model='" + model + '\'' +
'}';
}
public Car() {
}
public Car(String color, String model) {
this.color = color;
this.model = model;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Car car = (Car) o;
return Objects.equals(color, car.color) &&
Objects.equals(model, car.model);
}
@Override
public int hashCode() { //可以不用重新这个方法,集合时用到
return Objects.hash(color, model);
}
}
- 编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。
(1)每个类都有构造方法进行属性初识化
(2)每个类都输出相关数据的toString方法
(3)使用Test类中的main方法定义各类初始化数据后台打印相关数据
public class Truck extends Car{
private int payload;
public Truck(){
}
public Truck(int payload) {
this.payload = payload;
}
public int getPayload() {
return payload;
}
public void setPayload(int payload) {
this.payload = payload;
}
@Override
public String toString() {
return "Truck{" +
"payload=" + payload +
",loader=" + getLoader() +",wheels=" + getWheels() +
", weight=" + getWeight() +
'}';
}
}
class Car extends Vehicle{
private int loader;
public Car(){
}
public Car(int loader) {
this.loader = loader;
}
public int getLoader() {
return loader;
}
public void setLoader(int loader) {
this.loader = loader;
}
@Override
public String toString() {
return "Car{" +
"loader=" + loader +",wheels=" + getWheels() +
", weight=" + getWeight() +
'}';
}
}
class Vehicle{
private int wheels;
private int weight;
public Vehicle() {
}
public Vehicle(int wheels, int weight) {
this.wheels = wheels;
this.weight = weight;
}
public int getWheels() {
return wheels;
}
public void setWheels(int wheels) {
this.wheels = wheels;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
@Override
public String toString() {
return "Vehicle{" +
"wheels=" + wheels +
", weight=" + weight +
'}';
}
}
public class Test {
public static void main(String[] args) {
Truck truck = new Truck();
truck.setWheels(4);
truck.setWeight(4000);
truck.setPayload(8);
truck.setLoader(40000);
System.out.println(truck.toString());
}
}
- 定义员工类Employee,包含姓名、工号和工资,包含计算奖金方法bonus,普通员工和经理都是员工,
计算奖金的方法为工资*奖金系数,普通员工的奖金系数为1.5(常量),经理为2(常量),分别实现bonus方法,创建对象测试。
public class Employee {
public static void main(String[] args) {
Employee employee = new Employee("张三","1001",2000);
employee.bonus(2);//经理
employee.bonus(1.5);//职员
}
private String name;
private String id;
private double salary;
public Employee() {
}
public Employee(String name, String id, int salary) {
this.name = name;
this.id = id;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public void bonus(double n){
double bonus = salary * n;
System.out.println(bonus);
}
}
- 定义一个交通工具类,并定义抽象方法,说明交通工具可以移动。继承交通工具而产生汽车、飞机、轮船类,并实现其移动方法。
public abstract class Vehicle {
public abstract void move();
}
class Car extends Vehicle{
public void move(){
System.out.println("汽车移动速度");
}
}
class Airplane extends Vehicle{
public void move(){
System.out.println("飞机移动速度");
}
}
class Ship extends Vehicle{
public void move(){
System.out.println("轮船移动速度");
}
}
- (1)编写一个人类Person,其中包含姓名、性别和年龄的属性,包含构造方法以及显示姓名、性别和年龄的方法。(10分)
(2)再编写一个学生类Student,它继承Person类,其中包含学号属性,包含构造方法以及显示学号的方法。(10分)
(3)在Student类里面重写equals方法,只要是学号和姓名一致就认为是同一个学生。(20分)
(4)最后编写一个测试类,此类里面包含main()方法,在main()方法中定义两个学生s1和s2并给他们赋值,
最后显示他们的学号、姓名、性别以及年龄,以及判断两个学生是否是同一个学生。(10分)
public class Person {
private String name;
private String gender;
private int age;
public Person(String name, String gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Student extends Person {
public static void main(String[] args) {
Student s1 = new Student("张三","女",11,"1001");
Student s2 = new Student("张三","男",12,"1001");
System.out.println(s1.equals(s2));
}
private String ID;
public Student(String name, String gender, int age, String ID) {
super(name, gender, age);
this.ID = ID;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
if(ID != student.ID)
return false;
if(this.getName() != ((Student) o).getName())
return false;
return true;
}
}
- 封装一个西游记人物类Person:包含私有属性:姓名(name)、身高(height)、武器(weapon)、种族(race),
并提供访问器(get方法)和修改器(set方法)
2) 在测试类中实例化三个对象:tangseng(唐僧)、sunwukong(孙悟空)、baigujing(白骨精),
分别设置他们的种族为:人族、仙族、妖族
3) 在打印对象时,按照例如:“姓名:孙悟空;种族:仙族”的格式在控制台输出信息。
4) 提供一个技能方法void skill(),这个方法根据当前对象name属性判断技能, 如果是孙悟空,就打印“七十二变”,如果是唐僧,就打印“紧箍咒”,如果是白骨精,就打印“九阴白骨爪”,在测试类中调用这个方法。
5) 重写equals方法进行判断,如果种族属性是人族或者仙族,则返回true,如果是妖族,
则返回false,在测试类中对孙悟空和唐僧进行比较,打印结果,对唐僧和白骨金进行比较,并打印结果。
public class Test{
public static void main(String[] args) {
Person tangsheng = new Person();
tangsheng.setName("唐僧");
tangsheng.setRace("人族");
Person sunwukong = new Person();
sunwukong.setName("孙悟空");
sunwukong.setRace("仙族");
System.out.println(tangsheng.equals(sunwukong));
Person baigujing = new Person();
baigujing.setName("白骨精");
baigujing.setRace("妖族");
System.out.println(tangsheng.equals(baigujing));
}
}
class Person {
private String name;
private int height;
private String weapon;
private String race;
public Person() {
}
public Person(String name, int height, String weapon, String race) {
this.name = name;
this.height = height;
this.weapon = weapon;
this.race = race;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public String getWeapon() {
return weapon;
}
public void setWeapon(String weapon) {
this.weapon = weapon;
}
public String getRace() {
return race;
}
public void setRace(String race) {
this.race = race;
}
public void skill(){
if(name.equals("孙悟空") )
System.out.println("七十二变");
if(name.equals("唐僧"))
System.out.println("紧箍咒");
if(name.equals("白骨精"))
System.out.println("九阴白骨爪");
}
@Override
public String toString() {
return
"姓名:" + name +
"; 种族:" + race;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
if(race.equals(person.race) || (race.equals("仙族") && person.race.equals("人族")) || (race.equals("人族") && person.race.equals("仙族")))
return true;
else
return false;
}
}