Java面向对象编程(中)

主要讲解宋老师里面课后题(无答案的),以便后期复习使用。(可以私信我要文档资料

简答题

Object类的使用说明:

  1. 为什么要重写toString()方法?
    在Object类里面定义toString()方法的时候返回的对象的哈希code码,这个hashcode码不能简单明了的表示出对象的属性。所以要重写toString()方法。比如我前面数组那一篇文章用的Arrays.toString()方法就是调用重写的toString方法。

  2. 为什么要重写equals()方法?
    判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象(相当于比较的是存在堆里的地址值)。这样我们往往需要重写equals()方法来判断里面的数据是否相等。

  3. 写出“==”和equals的区别(重点)
    == :运算符
    1.可以使用在基本数据类型变量和引用数据类型变量中
    2.如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同)
    如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体
    补充: == 符号使用时,必须保证符号左右两边的变量类型一致。

    equals()方法的使用:

    1. 是一个方法,而非运算符

    2. 只能适用于引用数据类型

    3. Object类中equals()的定义:
      public boolean equals(Object obj) {
      return (this == obj);
      }
      说明:Object类中定义的equals()和==的作用是相同的:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体

    4. 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是
      两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。

    5. 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同。那么,我们
      就需要对Object类中的equals()进行重写.
      重写的原则:比较两个对象的实体内容是否相同.

编程题

  1. 按要求实现下列问题:实现一个名为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("本科");}}
}
  1. 创建一个汽车类(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;@Overridepublic 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;}@Overridepublic 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);}@Overridepublic int hashCode() {                    //可以不用重新这个方法,集合时用到return Objects.hash(color, model);}
}
  1. 编写一个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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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());}
}
  1. 定义员工类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);}}
  1. 定义一个交通工具类,并定义抽象方法,说明交通工具可以移动。继承交通工具而产生汽车、飞机、轮船类,并实现其移动方法。
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. (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;}@Overridepublic 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;}}
  1. 封装一个西游记人物类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("九阴白骨爪");}@Overridepublic String toString() {return"姓名:" + name  +"; 种族:" + race;}@Overridepublic 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;elsereturn false;}}

Java基础(四)(根据尚硅谷宋红康老师Java基础第四部分)(重点)相关推荐

  1. 尚硅谷 宋红康老师 Java视频全程课程目录

    尚硅谷 Java 语言全程课程目录, 尚硅谷 Java&大数据研究院 宋红康 B站视频链接 已看完,感谢宋红康老师! [视频很长,但看完你一定会收获很多] 30天课程目录 Java 编程基础部 ...

  2. 【MySQL入门到高级之基础篇(参考尚硅谷宋红康老师2022版)】

    文章目录 第一章数据库概述 为什么要使用数据库 数据库与数据库管理系统 数据库的相关概念 数据库与数据库管理系统的关系 常见的数据库管理系统排名(DBMS) 常见的数据库介绍 MySQL介绍 概述 M ...

  3. JVM学习笔记汇总:结合尚硅谷宋红康老师视频教程及PPT

    JVM学习笔记汇总:结合尚硅谷宋红康老师视频教程及PPT 第一章:JVM虚拟机的介绍 1.1虚拟机的分类 虚拟机通常分为两类:系统虚拟机和程序虚机.其中,系统虚拟机是指完全对物理计算机的仿真,而程序虚 ...

  4. 尚硅谷 宋红康 JVM教程_01_内存与垃圾回收篇——02

    本系列相关链接 尚硅谷 宋红康 JVM教程_01_内存与垃圾回收篇--01 (20210103-20210110) https://blog.csdn.net/wei198621/article/de ...

  5. 尚硅谷-宋红康-JVM上中下篇完整笔记-JVM上篇_内存与垃圾回收篇

    前言 一.jvm及java体系结构 1. Java及JVM简介 TIOBE语言热度排行榜 https://www.tiobe.com/tiobe-index/ 世界上没有最好的编程语言,只有最适用于具 ...

  6. JDBC学习笔记(1)---B站尚硅谷宋红康

    JDBC学习笔记(1)-B站尚硅谷宋红康 JDBC学习笔记(2)-B站尚硅谷宋红康 文章目录 软件架构方式介绍 JavaWeb技术概览 第1章:JDBC概述 1.1 数据的持久化 1.2 Java中的 ...

  7. 尚硅谷 宋红康 JVM教程_02_字节码与类的加载篇

    本系列相关链接 尚硅谷 宋红康 JVM教程_01_内存与垃圾回收篇--01 (20210103-20210110) https://blog.csdn.net/wei198621/article/de ...

  8. 尚硅谷-宋红康-MySQL高级性能篇

    尚硅谷-宋红康-MySQL高级性能篇 第1章 Linux下MySQL的安装与使用 1. 安装前说明 1.1 Linux系统及工具准备 二级目录 三级目录 第1章 Linux下MySQL的安装与使用 1 ...

  9. JVM从入门到精通(尚硅谷宋红康)

    不动笔墨不读书,先把书读厚,再把书读薄是我学习方式. 所以等理解了再整理一次笔记,目前笔记和视频一一对应. 笔记连载中 <尚硅谷2020最新版宋红康JVM> 第1章:JVM与Java体系结 ...

最新文章

  1. 如何让li中的标签内容横向排列
  2. 基于python的快速傅里叶变换FFT(一)
  3. 第一个使用Spring Tool Suite(STS)和Maven建立的Spring mvc 项目
  4. Porter Stemming Algorithm
  5. Introduction to algrithms exercise2.3-7
  6. Selenium中文手册
  7. 用pyinstaller把python脚本编译成可执行程序(windows系统)
  8. 吴恩达深度学习——自然语言处理与词嵌入
  9. Wireshark系列之5 显示过滤器
  10. linux 信号量_SystemV IPC通信信号量
  11. c语言 什么是指针变量,c语言指针详解:什么是指针?
  12. wps中的word删除空白页
  13. Win7 和 xp 双系统安装
  14. 微信小程序文本超出自动换行解决方案
  15. LaTeX--5--一个文档的基本结构/导言区/标题_作者_日期
  16. 戴尔Precision工作站 为元宇宙打造稳定高效创作基石
  17. AdaptiveAvgPool1D内部实现
  18. DataGridView控件使用大全
  19. 永磁同步电机模型预测控制(PMSM-MPC)Simulink仿真教程
  20. 网管用计算机上岗证书,普通高中校园网计算机教室建设标准

热门文章

  1. 围观设计模式(5)--迪米特法则(Lod,Law of Demeter)或最少知道原则(Least Knowledge Principle)
  2. 如何将手机中的照片做成视频?想不到方法这么简单
  3. 【一文带你解决跨域问题】
  4. 【字王看“字体的故事”】(字体的故事 《南方周末》)
  5. 实现将Excel中的行、列内容互转
  6. Unity实战篇:读取Excel数据并转换成Asset
  7. ChatGPT团队中,3个清华学霸,1个北大学霸,共9位华人
  8. 第7章 Linux下的文件编程(一)
  9. 重访马尔可夫生成式任务型对话 Revisiting Markovian Generative Architectures for Efficient Task-Oriented Dialog Sys
  10. 手写字符串 trim 方法,保证浏览器的兼容性