后端入门–java中多态情况下如何调用子类独有的方法?

先说一下代码结构,一共是老师、学生、管理员三个角色,是将他们共有的属性抽出来写了一个Person类,但是不同的部分没有写在Person类,也就是父类中,然后使用继承来使用共有的一部分东西。
先看一下代码

Person.java

package com.itppf.继承;

public class Person {
    private String name;
    private String sex;
    private int age;
    private double height;
    private double weight;

    public void setName(String name){
        this.name=name;
    }
    public String getName(){
        return this.name;
    }

    public void setSex(String sex){
        this.sex=sex;
    }
    public String getSex(){
        return this.sex;
    }

    public void setAge(int age){
        this.age=age;
    }
    public int getAge(){
        return this.age;

    }

    public void setHeight(double height){
        this.height=height;
    }
    public double getHeight(){
        return this.height;
    }

    public void setWeight(double weight){
        this.weight=weight;
    }
    public double getWeight(){
        return this.weight;
    }

}

Student.java

package com.itppf.继承;

public class Student extends Person {
    public void action(){
        System.out.println(this.getName()+"学生学习");
    }
}

Teacher.java

package com.itppf.继承;

public class Teacher extends Person{
    public void teach(){
        System.out.println(this.getName()+"老师教课");
    }
}

Administrator.java

package com.itppf.继承;

public class Administrator extends Person{
public void option(){
    System.out.println(this.getName()+"进行操作");
}
}

然后写了测试类。

package com.itppf.继承;

public class Test {
    public static void main(String[] args) {
        Person p1=new Student();
        Person p2=new Teacher();
        Person p3=new Administrator();

        p1.setName("学生1");
        p1.setAge(12);
        p1.setHeight(180.0);
        p1.setWeight(140.00);
        System.out.println("学生姓名:"+p1.getName());
        System.out.println("学生年龄:"+p1.getAge());
        System.out.println("学生身高:"+p1.getHeight());
        System.out.println("学生体重:"+p1.getWeight());
        p1.action();    //注意,这里是报错的
    }
}
注意,在这里报错了,我一直想这个问题是怎么回事?以前调用子类方法的时候没有出现过这种状态,我估计是多态的情况下出现了问题,于是我准备换种方式试一下。
Student p1=new Student();
果然不报错了。
但是多态的情况下没有办法解决的吗?

方法一

并不是,使用Alt+Enter可以解决这个问题。

补全后成为了这个样子

 ((Student) p1).action();
输出也没有问题,查询后可知是向上向下转型问题。

这里需要父类强转为子类,然后调用子类方法。

Person p1=new Student();
//现在开始
Student  s1=(Student)p1;
s1.action();
这个和上面的快捷键补全意思是一样的,但是我起码明白了是怎么一回事,这个叫做向下转型。
同理,肯定还有向上转型,子类强制转型成父类。
((Person)s1).action();
//拆开
Person p1=(Person)s1;
p1.action();
其实这个问题还有一种解决方法。

方法二

那就是在父类中定义方法,然后在子类中进行重写,代码补全的时候也提供了这一种方法。
在父类中定义该方法。
子类重写
但是显然这种方法比较繁琐,除了写共有的属性和方法以外还要写不同的,再重写,因此以后还是使用强转吧!
以上为个人测试,如有不对,欢迎指正批评!

【信息由网络或者个人提供,如有涉及版权请联系COOY资源网邮箱处理】

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容