多态

多态

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

  • 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类、有关系的类:object)。

  • 多态存在的条件

    • 有继承关系(父类、有关系的类:object)
    • 子类重写父类的方法
    • 父类的引用指向子类对象
  • 注意事项:

    • 多态是方法的多态,属性是没有动态的(静态的属性,动态的方法)。

    • 父类和子类有联系的 类型转换异常:ClassCastExCeption!

    • 存在条件:继承关系、方法需要重写、父类引用指向子类对象! Father fa = new Son();

      • 方法重写注意事项:
        • static 方法:属于类,它不属于实例;
        • final :常量;
        • private 方法;
public class Person {
    public void run(){
        System.out.println("father");
    }
}

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

public class Application {
    public static void main(String[] args) {

        //一个对象的实际类型是确定的
        //new Student();
        //new Person();

        //可以指向的类型就不确定了:父类的引用指向子类的对象
        //Student 子类能调用的方法都是自己的或者是继承父类的
        Student s1 = new Student();//子类引用指向子类对象

        //person 父类,可以指向子类,但是不能调用独有的方法
        Person s2 = new Student();//父类引用指向子类对象
        Object s3 = new Student();//父类的父类引用指向子类对象

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

        //对象能执行那些方法,主要看对象左边的类型,和右边关系不大!
        s1.eat();
        //s2.eat();父类可以通过转换使用子类的独有的方法
        ((Student)s2).eat();
    }
}

  • 关键字:instanceof
        //instaceof 判断父类和子类是否有关系
        Object obj = new Student();
        //System.out.println(x instanceof y); x和y没有关系编译会报错 判断它们的结果就是要看(x变量实际指向的类型和y的子类型)
        /*
        Object > Person > Student
        Object > Person > Teacher
        Object > String
         */
        System.out.println(obj instanceof Student);//true 它是Student的父类的父类 有继承关系
        System.out.println(obj instanceof Person);//true 它是Person的父类 也是有继承关系
        System.out.println(obj instanceof Object);//true 
        System.out.println(obj instanceof Teacher);//false 从关系图上就可以看出Teacher和我们没有关系
        System.out.println(obj 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 stu = new Student();
        System.out.println(stu instanceof Student);//true
        System.out.println(stu instanceof Person);//true
        System.out.println(stu instanceof Object);//true
        //System.out.println(stu instanceof Teacher); 编译报错
        //System.out.println(stu instanceof String); 编译报错
  • 类型转换

    • 把子类转为父类:向上转型,缺失方法
    • 把父类转向子类:向下转型(强制转换),缺失精度
    public class Application {
        public static void main(String[] args) {
    
            //类之间的转换: 父 子
            //高             低
            Person s1 = new Student();
            //将s1这个对象转换为Student类型,就可以使用Student类型的方法
            Student s2 = (Student)s1;
            //或者这样表示也是一样的 ((Student)s1).say()
            s2.say();
    
            //子类转换为父类时,会丢失原来本身的方法
            Student student = new Student();
            student.say();
            Person person = student;
            //person.say();
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值