java多态

多态

即同一方法可以根据发送对象的不同而采取多种不同的行为方式

注意:

  1. 多态是方法的多态,属性没有多态
  2. 父类和子类有联系(ClassCastException类型转换异常)
  3. 多态存在条件:
    • 继承关系
    • 方法重写
    • 父类引用指向子类对象 Father f1=new Son();

若方法是static、final、private修饰的则不能被重写

package com.yuanyu.Oop;

public class Application {
    public static void main(String[] args) {
        //一个对象的实际类型是确定的
        //new Person();
        //new Student();

        //可以指向的引用类型是不确定的
        Student  s1= new Student();
        Person s2 = new Student(); //父类的引用指向子类
        Object s3=new Student();
    }
}

一个对象实际类型(右边)是确定的但引用类型(左边)是不确定的

package com.yuanyu.Oop;

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

package com.yuanyu.Oop;

public class Student extends Person {
   
}

package com.yuanyu.Oop;

public class Application {
    public static void main(String[] args) {
        //一个对象的实际类型是确定的
        //new Person();
        //new Student();

        //可以指向的引用类型是不确定的
        Student  s1= new Student();
        Person s2 = new Student(); //父类的引用指向子类
        Object s3=new Student();

        s2.run(); //Run

    }
}

子类继承了父类的全部方法,因此可以输出Run

在子类中进行方法的重写

package com.yuanyu.Oop;

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

package com.yuanyu.Oop;

public class Application {
    public static void main(String[] args) {
        //一个对象的实际类型是确定的
        //new Person();
        //new Student();

        //可以指向的引用类型是不确定的
        Student  s1= new Student();
        Person s2 = new Student(); //父类的引用指向子类
        Object s3=new Student();
        
        s1.run(); //Son
        s2.run(); //Son
    }
}

子类一旦重写父类的方法,执行的是子类方法

在子类中添加新的方法

package com.yuanyu.Oop;

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

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

package com.yuanyu.Oop;

public class Application {
    public static void main(String[] args) {
        //一个对象的实际类型是确定的
        //new Person();
        //new Student();

        //可以指向的引用类型是不确定的
        Student  s1= new Student();
        Person s2 = new Student(); //父类的引用指向子类
        Object s3=new Student();

        s1.eat();
        s2.eat(); //报错
        ((Student) s2).eat();
    }
}

子类能调用的方法都是自己的或继承父类的方法

父类可以指向子类,但不能调用子类独有的方法,但是父类可以强制转换成子类调用

对象能执行哪些方法看对象左边的类型,与右边关系不大

posted @   原语  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示