JAVA多态(instance of与类型转换)

多态

1. 同一个方法可以根据发送对象不同而采用多种不同的行为方式
2. 一个对象的实际类型是确定的,但可以指向对象的引用类型有很多(父类或者有关系的类)
3. 多态存在的条件:
- 有继承关系
- 子类重写父类的方法
- 父类引用指向子类对象(Father f1 = new  son();)
4. 注意:
- 多态是方法的多态,属性没有多态性
- instance   of        类型转换     引用类型
- 父类和子类有联系,转换异常(ClassCastEeception!)

示例1

测试类
public class Application {
    public static void main(String[] args) {
        /*
        一个对象的实际类型是确定的
        new Student();
        new Person();
        可以指向的引用类型就不确定,父类的引用指向子类
         */
        // student  能调用的方法都是自己的或者继承父类的!
        Student s1 = new Student();
        //Person 父类型,可以指向子类,但不能调用子类独有的方法
        Person s2 = new Student();
        //  Object  祖宗类
        Object s3 = new Student();
        s1.run();
        s1.eat();
        //子类重写了父类的方法,执行子类的方法
        s2.run();
        //对象能执行哪些方法,主要看对象左边的类型,和右边关系不大!
        //强制转换
    }
}
输出结果:
student run
student eat
student run
学生类(子类)
public class Student extends Person {
    //alt+insert 方法重写
    @Override
    public void run() {
        System.out.println("student run");
    }

    public void eat(){
        System.out.println("student eat");
    }
}

person (父类)
public class Person{
    public void run(){
        System.out.println("person run");
    }
}

instance of

测试类
public class Application {
    public static void main(String[] args) {
        //object > string(lang类)
        //object > person > student
        //object > person > teacher
        // System.out.println(x instanceof y);看能不能编译通过!
        Object object = new Student();
        //让引用类型object = 直接类型student,
        //student将这个对象转化为Student类型,我们就可以使用Student类型的方法了
        System.out.println(object instanceof Student);//true
        System.out.println(object instanceof Person);//true
        System.out.println(object instanceof Object);//true
        System.out.println(object instanceof Teacher);//false
        System.out.println(object instanceof String);//false
        System.out.println("=========================");
        Person person = new Student();
        System.out.println(person instanceof Student);//true
        System.out.println(person instanceof Person);//true
        System.out.println(person instanceof Object);//true
        System.out.println(person instanceof Teacher);//false
        // System.out.println(person instanceof String);编译报错
        System.out.println("===============================");
        Student student = new Student();
        System.out.println(student instanceof Student);//true
        System.out.println(student instanceof Person);//true
        System.out.println(student instanceof Object);//true
        //System.out.println(student instanceof Teacher);编译报错
        //System.out.println(student instanceof String);编译报错

    }
}

学生类(子类)
public class Student extends Person{

}
老师类(子类)
public class Teacher extends Person {
}

person类(父类)
public class Person {

}

类型转换

测试类
public class Application {
    public static void main(String[] args) {
        //类型之间的转换: 父----> 子   高--->低
        //Person student = new Student();
        //student将这个对象转化为Student类型,我们就可以使用Student类型的方法了
        //子类转化为父类,可能丢失自己的本来的一些方法
        Person obj = new Student();
        Student student =(Student) obj;
        student.go();
        //写成一句话是:
        ((Student)obj).go();
    }
}
输出结果:
go
go
person类
public class Person {
    public void go(){
        System.out.println("go");

    }
}
学生类(子类)
public class Student extends Person{

}