先说一下代码结构,一共是老师、学生、管理员三个角色,是将他们共有的属性抽出来写了一个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();
其实这个问题还有一种解决方法。
方法二
那就是在父类中定义方法,然后在子类中进行重写,代码补全的时候也提供了这一种方法。
在父类中定义该方法。
子类重写
但是显然这种方法比较繁琐,除了写共有的属性和方法以外还要写不同的,再重写,因此以后还是使用强转吧!
以上为个人测试,如有不对,欢迎指正批评!