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

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;
    @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);
    }
}
  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;
    }

    @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());
    }
}
  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;
    }

    @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;
    }


}
  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("九阴白骨爪");

    }

     @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;
     }



 }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值