面向对象05多态

多态

多态即同一方法可以根据发生对象的不同而采用多种不同的行为方式,可以实现动态编译,增强可扩展性

一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多

多态存在的条件:

  1. 有继承关系
  2. 子类重写父类的方法
  3. 父类引用指向子类对象

多态是方法的多态,属性没有多态性

instanceof (类型转换) 引用类型

package com.oop.demo06;

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


/*
注意事项:
1.多态是方法的多态,属性没有多态
2.父类和子类有联系
3.多态存在条件:继承关系,方法需要重写,父类引用指向子类对象  Father f1 = new Son

不能重写的方法:
1.static方法属于类,不属于实例
2.final常量
3.private方法
 */
package com.oop.demo06;

public class Student extends Person{
    @Override
    public void run() {
        System.out.println("son");
    }

    public void eat() {
        System.out.println("ear");
    }
}
package com.oop;

import com.oop.demo06.Person;
import com.oop.demo06.Student;


public class Application {
    public static void main(String[] args) {
        //一个对象的实际类型是确定的,但可以指向的引用类型就不确定了
        //new Student();
        //new Person();

        //子类能调用的方法都是自己的或者是父类的,父类的类型可以指向子类,但是不能调用子类独有的方法。
        Student s1 = new Student();
        Person s2 = new Student();//父类的引用指向子类的类型
        Object s3 = new Student();
        //对象能执行哪些方法,主要看对象左边的类型,和右边关系不大

        s2.run();//son,子类重写了父类的方法,执行子类的方法
        s1.run();

instanceof (类型转换) 引用类型:

public static void main(String[] args) {
        //Object>String
        //Object>Person>Teacher
        //Object>Person>Student

        //System.out.println(x instanceof y);能不能编译通过,取决于x、y之间存不存在父子类关系,若x是父类,y是子类,则编译通过
        //编译正确与否,则看x指向的对象是否是y的子类或本身,若是,则true
        Object object = new 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 void go(){
        System.out.println("go");
    }
}
package com.oop;

import com.oop.demo06.Person;
import com.oop.demo06.Student;
import com.oop.demo06.Teacher;


public class Application {
    public static void main(String[] args) {
        //类型之间的转化:父类   子类

        //高                   低
        Person s = new Student();

        //s.go();编译报错

        //将Person类的s这个对象转换为Student类型我们就可以使用Student类型的方法了
        Student student = (Student) s;
        student.go();//或者如以下强转类型
        ((Student) s).go();
    }

}

/*
1.父类的引用指向子类的对象
2.把子类转换为父类,向上转型,需要强制转换,可能会丢失一些子类独有的方法
3.把父类转化子类,向下转型
4.方便方法的调用,减少重复代码;
抽象:  封装、继承、多态
 */
上一篇:instanceof


下一篇:源码5——const/new/instanceof/函数柯里化