Java/java程序设计:要求面向对象思想利用封装、重写、多态、对象数组、instanceof;完成项目:继承关系为Person夫类其拥有Student类与Teacher类,子类中都含有say方法。

该博客探讨了Java编程中的面向对象思想,通过一个实例展示了如何利用封装、重写、多态以及对象数组。文章创建了一个Person父类及其两个子类Student和Teacher,每个类都有say()方法。在主文件中,创建了一个Person对象数组,并通过instanceof关键字判断并调用了子类的特有方法,如Student的study()和Teacher的teach(),充分体现了Java的继承和多态特性。
摘要由CSDN通过智能技术生成

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 代码实现效果:

idea运行结果

4.写在最后:

此题通过简单的三种生活中常见的类,人类包含学生类与老师类,每一个类都有自己 的方法,属性,创建多个对象时的对象数组判断类的继承关系的instanceof再由父类向下转换 ,本题通过较简单的思路与题解,使用到了还要多文件实现项目、封装、重写、多态、面向对象的思想,在小编看来很经典,虽然实现起来简单但是知识点覆盖全面,练练手熟悉知识点还是不错的,建议跟着敲一遍或者加强代码的健壮性和完整性完成一个小项目吧 ^ - ^
蟹蟹 阅读…

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值