Java面向对象--多态详解、instanceof、强制类型转换

  • 多态:同一方法可以根据发送对象的不同而采用多种不同的行为方式。
  • 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。(父类,等等)
  • 例子:
//父类Person
public class Person {
    public void run(){
        System.out.println("run");
    }
    public void A(){
        System.out.println("Person");
    }
}
//子类Student
public class Student extends Person {
    //重写
    @Override
    public void run() {
        System.out.println("son run");
    }

    public void eat(){
        System.out.println("son eat");
    }
}
//运行实现类
public class Start {
    public static void main(String[] args) {
        Student s1 = new Student();
        //Person父类,可以指向子类,但是不能调用子类独有的方法,如果想调用强制转换为Student类型
        Person s2 = new Student();
        Object s3 = new Student();

        //对象能执行哪些方法,主要看对象左边的类型,和右边关系不大
        s2.run();//子类重写了父类的方法,执行子类的方法
        s1.run();
        s1.A();

        //强制转换为Student类型
        ((Student) s2).eat();
        s1.eat();
    }
}
  1. 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多:指的就是Student,Person,Object s1的类型;
  2. Student类可以调用父类,祖父类和以上的类里的方法;
  3. Student没有重写父类方法时,Student s1可以调用父类方法,如s1.A(),Person s2调用父类方法执行父类方法,如s2.run()//此时结果:run;Student里重写了父类方法时Person s2、Student s1就调用重写后的方法,如:s2.run()//此时结果:son run、s1.run()//结果:son run;
  4. Person父类,可以指向子类,但是不能调用子类独有的方法,如果想调用强制转换为Student类型,如eat()方法。
  • 注意事项:

    • 多态是方法的多态,属性没有多态性。
    • 父类和子类要有联系!! 没有联系会报错:类型转换异常!!(ClassCastException!)
    • 存在条件:有继承关系,大部分方法需要重写,父类引用指向子类对象!Father f1 = new Son();
    • 不能重写的方法:
      • static:静态方法,属于类,不属于实例,
      • final:常量;
      • private:私有的方法。
  • 类的强制类型转换:

    和数据的强制类型转换类似

    Person per = new Teacher();
    /*
    Teacher i = (Teacher) per;
    i.eat();
     */
    ((Teacher) per).eat();
    

    Person是Teacher的父类

    把子类转换成父类,向上转型,是自动转换;

    把父类转换为子类,向下转型,是强制转换;

    在转换的时候可能会丢失一些方法!!!

    方便方法的调用,减少重复的代码。

  • instanceof:

    • 作用:判断一个对象是什么类型,是否存在父子关系,某个变量是否属于某个类型!

    • 语法:变量 instanceof B

      //例子:
      //Object->Person->Teacher   父子关系树分支
      Object object = new Teacher();
      System.out.println(object instanceof Student);//false
      System.out.println(object instanceof Person);//true
      System.out.println(object instanceof Object);//true
      System.out.println(object instanceof Teacher);//true
      System.out.println(object instanceof String);//false
      //Object->Person->Student   父子关系树分支
      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);//编译报错!!!
      //Object->Person->Student   父子关系树分支
      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);//编译报错!!!
      
    • 根据 new的类 判断属于哪个父子关系树分支,在分支内的结果为true;没在分支内但有父子关系的结果为false;既没在分支内又没有父子关系的编译时会报错!!!

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值