Java/java程序设计:要求面向对象思想利用多态、对象数组、instanceof;完成问题
- 1. 引入问题:
- 2. 分析需求:
- 2.1父类Person类分析:
- 2.1.1 父类Person代码如下:
- 2.2 子类Student类分析:
- 2.2.1 子类Student代码如下:
- 2.3 子类Teacher类分析:
- 2.3.1 子类Teacher代码如下:
- 3. 回到主文件:
- 3.1 创建对象数组保存引用这五个对象:
- 3.2 向下强转类型实现调用子类特殊方法:
- 3.3 主文件代码如下:
- 3.4 代码实现效果:
- 4.写在最后:
1. 引入问题:
继承关系如下图:父类为Person类其拥有Student类与Teacher类,子类中都含有say()方法,要求创建一个Person,两个Student,两个Teacher,统一存放数组中,并调用每个对象的say方法;最后还要实现调用子类中的特有方法Student类的Study,Teacher类中的teach;
2. 分析需求:
由上继承图可知:
2.1父类Person类分析:
Person类中属性有:private String name; private int age;
public String say(){return “人名为:” + name + " 年龄:" + age + " 找工作ing…";}
2.1.1 父类Person代码如下:
package com.MustPreson;
public class Person {
private String name; //定义私有变量 姓名 和 年龄;
private int age;
//构造器
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String say() { //父类中的say方法返回姓名和年龄;
return "人名为:" + name + " 年龄:" + age + " 找工作ing...";
}
//封装
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;
}
}
2.2 子类Student类分析:
子类Student具有特有属性成绩 private double score;
重写父类
public String say() { return “学生姓名为:” + getName() + " 学生年龄:" + getAge() + " 学生成绩:" + getScore(); }
在设置构造器赋值时可以调用super(name,age);加上this.score = score;
2.2.1 子类Student代码如下:
package com.MustPreson;
public class Student extends Person {
private double score;
public Student(String name, int age, double score) {
super(name, age);
this.score = score;
}
public String say() { //Student类中的say具有特殊score属性,需要重写父类中的方法;
return "学生姓名为:" + getName() + " 学生年龄:" + getAge() + " 学生成绩:" + getScore();
}
public void Study() { //子类Student中特有方法Study
System.out.println("学生 " + getName() + " 学习Java课程中...");
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
2.3 子类Teacher类分析:
子类Teacher具有特有属性薪水 private double salary;
同上Student一样重写父类
public String say() { return “老师姓名为:” + getName() + " 老师年龄:" + getAge() + " 老师薪水:" + getSalary(); }
2.3.1 子类Teacher代码如下:
package com.MustPreson;
public class Teacher extends Person {
private double salary;
public Teacher(String name, int age, double salary) {
super(name, age);
this.salary = salary;
}
public String say() { //Teacher类中的say具有特殊salary属性,需要重写父类中的方法;
return "老师姓名为:" + getName() + " 老师年龄:" + getAge() + " 老师薪水:" + getSalary();
}
public void Teach() { //子类Teacher中特有方法Teach
System.out.println(" 老师" + getName() + " 正在讲Java课程中...");
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
3. 回到主文件:
3.1 创建对象数组保存引用这五个对象:
主要代码片段为:
Person[] people = new Person[5];
people[0] = new Person(“jack”, 23);
people[1] = new Student(“Tom”, 18, 99.0);
people[2] = new Student(“childjack”, 17, 89.5);
people[3] = new Teacher(“smith”, 36, 8000);
people[4] = new Teacher(“oldsmith”, 50, 10000);3.2 向下强转类型实现调用子类特殊方法:
主要代码片段为:
其中使用到(A instanceOf B)来判断A是否为B的子类再确定是否转换类型;
3.3 主文件代码如下:
package com.MustPreson;
public class PolyArry {
public static void main(String[] args) {
Person[] people = new Person[5];
people[0] = new Person("jack", 23);
people[1] = new Student("Tom", 18, 99.0);
people[2] = new Student("childjack", 17, 89.5);
people[3] = new Teacher("smith", 36, 8000);
people[4] = new Teacher("oldsmith", 50, 10000);
for (int i = 0; i < people.length; i++) {
//此处注意:people[i] 编译类型均为Person, 但是运行类型调用方法时要动态对应不同的方法;
System.out.println(people[i].say()); //动态绑定机制,由jvm虚拟机自行判断;
if(people[i] instanceof Student){ //判断people[i]是否为Student类
((Student)people[i]).Study();
}else if(people[i] instanceof Teacher){ //判断people[i]是否为Teacher类
((Teacher)people[i]).Teach();
}else{ // 两者都不是则输出相应语句;
System.out.println(people[i].getName() + " 不是学生或老师,不需要Study 或者 Teach");
}
}
}
}
3.4 代码实现效果:
4.写在最后:
此题通过简单的三种生活中常见的类,人类包含学生类与老师类,每一个类都有自己 的方法,属性,创建多个对象时的对象数组,判断类的继承关系的instanceof再由父类向下转换 ,本题通过较简单的思路与题解,使用到了还要多文件实现项目、封装、重写、多态、面向对象的思想,在小编看来很经典,虽然实现起来简单但是知识点覆盖全面,练练手熟悉知识点还是不错的,建议跟着敲一遍或者加强代码的健壮性和完整性完成一个小项目吧 ^ - ^
蟹蟹 阅读…