多态 && instanceof && 父类强制类型转换

多态

  • 一个对象的实际类型是确定的,但可以指向的引用类型就不确定了:父类可以指向子类

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

  • 一切类都继承与Object

  • 父类型可以指向子类,但是不能调用子类独有的方法

  • 子类重写父类的方法后,通过子类调用出来的这个方法是被重写后的方法

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

  • 类型异常转化:有时会强制将父类转化为子类,调用子类中独有的方法

  • 有static、final、private等关键字的方法都不能重写

instanceof & 父类强制类型转换

  • instanceof:instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。通俗点理解就是,用这个关键字来判断左边的这个对象是否是右边这个类的一个实例

  • 父类强制转换为子类:

    • 此类转换为向下转型,需要强制转换(向上转型则不需要强制转换)

    • 强制转换后便可以调用子类中特有的方法

package Test1;
​
public class Test1 {
​
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Person a = new Student();
        a.run();//run方法被子类Student重写,因此调用的是在子类重写后的方法。
        System.out.println();
        a.eat();
        System.out.println();
        ((Student)a).homework();//强制转换,将Person类型转换成Student类型,
        System.out.println();//因为方法homework是Student独有的,父类无法调用子类中独有的方法。
        int d;
        d = ((Student)a).Weight();
        System.out.print(d);
        System.out.println();
        
        System.out.println("==================");
        Person b = new Person();
        b.run();//这里因为new的是Person,所以调用的是父类中原来的方法.
        System.out.println();
        System.out.println("==================");
        Person s = new Person();
        System.out.println(s instanceof Student);//显然,s是属于Person的,不一定是Student的一个实例。
        System.out.println(s instanceof Person);
        System.out.print(s instanceof Object);//所有的类都继承与Objiect,所以返回的布尔值为true。
    }
}
public class Person {
    int age;
    int weight;
    int height;
    public void eat() {
        System.out.print("人要吃东西");
    }
    public void run() {
        System.out.print("人会跑步");
    }
    
}
​
public class Student extends Person{
    public void run() {
        System.out.print("学生会跑步");
    }
    public void homework() {
        System.out.print("学生得写作业");
    }
    public int Weight() {
        weight = 100;
        return weight;
    }
}
​

输出结果:

  1. 即同一方法可以根据发送的对象不同而采用不同的行为方式。

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

  3. 多态存在的条件

    • 有继承关系

    • 子类重写父类方法

    • 父类引用指向子类对象

  4. 注意:多态是方法的多态,属性没有多态性

猜你喜欢

转载自blog.csdn.net/weixin_54194783/article/details/117269107