一、简答题
继承的格式与好处
格式:class A extends B
好处:1.可以实现代码的复用,将共性的代码向上抽取,抽取到父类中。需要使用这些属性和行为的类,通过继承即可使用。
2.当需要添加新的功能时,可以通过扩展现有的类来实现,而不必修改现有的代码。这种通过继承实现的扩展方式称为“开放-封闭”原则,即对扩展开放,对修改封闭。
什么是方法重写
当父类的行为无法满足子类的需求,子类就需要重写父类的方法,来对现用的父类某一行为进行修改或者扩展。
抽象类和接口的区别
设计目的不同:接口用于不同类实现相同行为的规范和约束,抽象类还存在共性抽取的成员方法。用于具有相似行为的类的继承和代码复用。
继承限制:java只支持单继承,但可以多实现。一个类只能直接继承一个抽象类,但可以直接实现多个接口。
二、代码题
/*
分析以下需求并完成代码
请使用继承思想,实现程序员类(Coder)和项目经理类(Manager)
思路分析
共同属性有:工号、姓名、年龄
项目经理类有一个特有属性:奖金(bonus)
公共方法有:工作work()
测试类中创建程序员、项目经理对象,分别调用work方法
*/
/**
* @author windStop
* @version 1.0
* @description 共同父类-打工人
* @date 2024年07月18日20:53:51
*/
public class Worker {
private int id;//工号
private String name;//姓名
private int age;//年龄
public void work(){
System.out.println("id为:" + id + "年龄为:" + age + "的" + name + "正在工作");
}
public Worker() {
}
public Worker(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int 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;
}
}
/**
* @author windStop
* @version 1.0
* @description 程序员类
* @date 2024年07月18日20:53:16
*/
public class Coder extends Worker{
public Coder() {
}
public Coder(int id, String name, int age) {
super(id, name, age);
}
}
/**
* @author windStop
* @version 1.0
* @description 部门经理类
* @date 2024年07月18日20:53:32
*/
public class Manager extends Worker{
private double bonus;//奖金
public Manager() {
}
public Manager(int id, String name, int age, double bonus) {
super(id, name, age);
this.bonus = bonus;
}
public double getBonus() {
return bonus;
}
public void setBonus(double bonus) {
this.bonus = bonus;
}
}
/**
* @author windStop
* @version 1.0
* @description 继承思想的测试类
* @date 2024年07月18日20:52:52
*/
public class Test1 {
public static void main(String[] args) {
Coder coder = new Coder(2001,"小王",18);
Manager manager = new Manager(9001,"老李",41,9000.99);
coder.work();
manager.work();
System.out.println(manager.getBonus());
}
}
/*
分析以下需求并完成代码
请采用面向对象的思想,实现木门和报警门的案例,并在测试类中测试
思路分析
设计抽象类Door,成员变量包含width、height、brand,抽象方法包含open开门、close关门
设计接口Alarm, 其中包含抽象方法alarm(报警方法)
设计子类WoodDoor,继承Door,重写open开门、close关门方法
设计子类ElectricAlarmDoor,继承门Door,重写open、close方法,同时还具有报警功能,需实现Alarm报警接口,重写其alarm报警方法
调用方法查看结果
*/
/**
* @author windStop
* @version 1.0
* @description 警报器接口
* 报警器接口的作用是定义报警器应具备的行为和功能,从而提供一个标准的规范。
* 接口定义了报警器对象应该具备的方法签名
* 比如触发报警、停止报警、设置报警参数等功能。
* @date 2024年07月18日21:08:15
*/
public interface Alarm {
//报警方法
void alarm();
}
/**
* @author windStop
* @version 1.0
* @description 父类:门 ---抽象类
* @date 2024年07月18日21:04:30
*/
public abstract class Door {
private String width;//宽
private String height;//宽
private String brand;//品牌
public Door() {
}
public Door(String width, String height, String brand) {
this.width = width;
this.height = height;
this.brand = brand;
}
//开门
public abstract void open();
//关门
public abstract void close();
/**
* 获取
* @return width
*/
public String getWidth() {
return width;
}
/**
* 设置
* @param width
*/
public void setWidth(String width) {
this.width = width;
}
/**
* 获取
* @return height
*/
public String getHeight() {
return height;
}
/**
* 设置
* @param height
*/
public void setHeight(String height) {
this.height = height;
}
/**
* 获取
* @return brand
*/
public String getBrand() {
return brand;
}
/**
* 设置
* @param brand
*/
public void setBrand(String brand) {
this.brand = brand;
}
public String toString() {
return "Door{width = " + width + ", height = " + height + ", brand = " + brand + "}";
}
}
/**
* @author windStop
* @version 1.0
* @description 报警门
* @date 2024年07月18日21:28:05
*/
public class ElectricAlarmDoor extends Door implements Alarm{
public ElectricAlarmDoor() {
}
public ElectricAlarmDoor(String width, String height, String brand) {
super(width, height, brand);
}
@Override
public void alarm() {
System.out.println("触发报警、停止报警、设置报警参数设置已完成了");
System.out.println("报警功能以生成成功");
}
@Override
public void open() {
System.out.println(getBrand() + "的木门 —> 打开了");
}
@Override
public void close() {
System.out.println(getBrand() + "的木门 —> 关闭了");
}
}
/**
* @author windStop
* @version 1.0
* @description 子类:木门
* @date 2024年07月18日21:25:52
*/
public class WoodDoor extends Door{
public WoodDoor() {
}
public WoodDoor(String width, String height, String brand) {
super(width, height, brand);
}
@Override
public void open() {
System.out.println(getBrand() + "的木门 —> 打开了");
}
@Override
public void close() {
System.out.println(getBrand() + "的木门 —> 关闭了");
}
}
/**
* @author windStop
* @version 1.0
* @description 测试类
* @date 2024年07月18日21:29:51
*/
public class Test {
public static void main(String[] args) {
WoodDoor woodDoor = new WoodDoor("1500","100","新时代");
ElectricAlarmDoor electricAlarmDoor = new ElectricAlarmDoor("1800","200","啄木鸟");
woodDoor.close();
woodDoor.open();
System.out.println(woodDoor.getHeight());
electricAlarmDoor.open();
electricAlarmDoor.alarm();
}
}
/*
我们计划为一所体育学校设计一套系统,需要记录以下人员的信息:
教练员:
属性:员工编号、姓名、性别、年龄
行为:吃饭(吃工作餐)
运动员:
属性:学员编号、姓名、性别、年龄、所在班级
行为:吃饭(吃营养餐)
请根据需求,设计、并编码实现:父类“人员类”,子类“教练员类”、子类“运动员类”,并包含共有的属性和行为的定义,由于运动员和教练员的吃饭的内容不同,所以需要设计为“抽象方法”。
*/
/**
* @author windStop
* @version 1.0
* @description 运动员
* @date 2024年07月18日21:43:20
*/
public class Athletes extends Person{
private String ClassName;//所在班级
public Athletes() {
}
public Athletes(int id, String name, char sex, int age, String className) {
super(id, name, sex, age);
ClassName = className;
}
public String getClassName() {
return ClassName;
}
public void setClassName(String className) {
ClassName = className;
}
@Override
public void eat() {
System.out.println(getName() + "正在吃营养餐");
}
}
/**
* @author windStop
* @version 1.0
* @description 教练员的javabean
* @date 2024年07月18日21:36:24
*/
public class Coach extends Person{
public Coach() {
}
public Coach(int id, String name, char sex, int age) {
super(id, name, sex, age);
}
@Override
public void eat() {
System.out.println(getName() + "正在吃工作餐");
}
}
/**
* @author windStop
* @version 1.0
* @description 抽取的父类 --> 人
* @date 2024年07月18日21:41:29
*/
public abstract class Person {
private int id;//员工编号
private String name;//姓名
private char sex;//性别
private int age;//年龄
public abstract void eat();
public Person() {
}
public Person(int id, String name, char sex, int age) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
/**
* 获取
* @return id
*/
public int getId() {
return id;
}
/**
* 设置
* @param id
*/
public void setId(int id) {
this.id = id;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return sex
*/
public char getSex() {
return sex;
}
/**
* 设置
* @param sex
*/
public void setSex(char sex) {
this.sex = sex;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Coach{id = " + id + ", name = " + name + ", sex = " + sex + ", age = " + age + "}";
}
}
/**
* @author windStop
* @version 1.0
* @description 测试类
* @date 2024年07月18日21:45:33
*/
public class Test {
public static void main(String[] args) {
Coach coach = new Coach(8848,"张三",'男',48);
Athletes athletes = new Athletes(9999,"小红",'女',18,"体操一班");
coach.eat();
System.out.println(coach);
athletes.eat();
System.out.println(athletes );
}
}