向上转型
以统计学生和老师信息为目的
多态(左编译右运行)类型
多态 由 继承 重构组成
动态绑定机制 属性随编译 方法随运行
package PolymorphicArray;
public class TestPolyA {
public static void main(String[] args) {
Basic[] basic=new Basic[4];
basic[0]=new Basic("tom",18);
basic[1]=new Student("jim",10);
basic[2]=new Teacher("miko",14);
basic[3]=new Student("jack",16);
for (int i = 0; i < 4; i++) {
System.out.println(basic[i].say());
}
}
public static class Basic {
private String name;
private int age;
public Basic(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
public String say(){
return "name-> "+name+"\t"+"age-> "+age;
}
}
public static class Student extends Basic {
public Student(String name, int age) {
super(name, age);
}
public String say(){
return super.say()+"我是学生";
}
}
public static class Teacher extends Basic {
public Teacher(String name, int age) {
super(name, age);
}
public String say(){
return super.say()+"我是老师";
}
}
}
多态增加了代码的可维护性,和简洁性
若要调用子类内部特有方法就要用到向下转型
public static class Student extends Basic {
public Student(String name, int age) {
super(name, age);
}
public String say(){
return super.say()+"我是学生";
}
public void say_1(){
System.out.println("我是学生的特有方法");
}
}
public static class Teacher extends Basic {
public Teacher(String name, int age) {
super(name, age);
}
public String say(){
return super.say()+"我是老师";
}
public void say_1(){
System.out.println("我是老师的特有方法");
}
}
}
直接调用会显示该类中找不到此方法
是因为编译类型为父类Basic中没有这种方法
而之前所用的是向上转型不能从父类找向子类的
此时就要用到向下转型
若要调用这种父类为编译类型子类为编译类型的多态时
应当进行类型强制转换只能子父类转子类,不能子类转子类
instanceof函数(先有继承后又instanceof)
- 当该测试对象创建时右边的声明类型和左边的类其中的任意一个跟测试类必须得是继承树的同一分支或存在继承关系,否则编译器会报错。
向下转型
转换类型后可使用特有方法
因此我们可以通过判断语句来进行分类向下转型
通过if(通过判断instanceof返回的结果来判断是否进行类型转换)判断
package PolymorphicArray;
import polymorphic.Basic;
import testWork01.Student;
public class TestPolyA {
public static void main(String[] args) {
Basic[] basic=new Basic[4];
basic[0]=new Basic("tom",18);
basic[1]=new Student("jim",10);
basic[2]=new Teacher("miko",14);
basic[3]=new Student("jack",16);
for (int i = 0; i < 4; i++) {
System.out.println(basic[i].say());
if (basic[i] instanceof Student) {
Student student = (Student) basic[i];
student.say_1();
} else if (basic[i] instanceof Teacher) {
Teacher teacher = (Teacher)basic[i];
teacher.say_1();
}
}
/*basic[1].say_1();//学生
basic[2].say_1();//老师*/
/*Student student = new Student("jim",10);
Teacher teacher1 = (Teacher) student;*/
}
public static class Basic {
private String name;
private int age;
public Basic(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
public String say(){
return "name-> "+name+"\t"+"age-> "+age;
}
}
public static class Student extends Basic {
public Student(String name, int age) {
super(name, age);
}
public String say(){
return super.say()+"我是学生";
}
public void say_1(){
System.out.println("我是学生的特有方法");
}
}
public static class Teacher extends Basic {
public Teacher(String name, int age) {
super(name, age);
}
public String say(){
return super.say()+"我是老师";
}
public void say_1(){
System.out.println("我是老师的特有方法");
}
}
}