java笔记之多态

    xiaoxiao2026-01-11  8

    多态一个对象多种状态多态中父类的范围大于子类的范围相当于double大于int

    多态中成员属性以及方法的归属问题

    class Father{ int x=1; static int y =2; public void eat(){ System.out.println("Father eat ...."); } public static void speak(){ System.out.println("Father speak ...."); } } class Son extends Father{ int x=3; static int y=4; public void eat() { System.out.println("Son eat ...."); } public static void speak() { System.out.println("Son speak ...."); } public void write(){ System.out.println("Son write ...."); } } public class Demo2 { public static void main(String[] args) { // TODO 自动生成的方法存根 Father father = new Son(); System.out.println(father.x); System.out.println(Father.y); father.eat(); Father.speak(); System.out.println(((Son)father).x); ((Son)father).write(); } } 结果: 1 2 Son eat .... Father speak .... 3 Son write ....

    访问属性都是左边的类型的属性,不管是静态还是非静态的属性; 访问方法时静态方法要看左边的类型,因为静态都是类直接调用 访问非静态方法时是访问右边类型的方法 在没有强制转型时候不能够调用左边没有的方法,但是右边拥有,只有强制转换了后就可以调用 强制转换注意,编译看左边,运行看右边。怎么理解,看代码

    Father father2 = new Father(); ((Son)father2).eat(); ((Son)father2).write(); 结果: Exception in thread "main" java.lang.ClassCastException: java7_0.Father cannot be cast to java7_0.Son at java7_0.Demo2.main(Demo2.java:47)

    也就是左边为Father,编译通过但是在运行的时候看到右边还是Father类型的,转换为Son类型就是报错类型转换错误,就像double类型强制转换为int,会有精度的损失

    多态的instanceof应用

    class Animal{ String color ; public Animal() { // TODO 自动生成的构造函数存根 } public Animal(String color){ this.color=color; } public void run(){ System.out.println("Animal run ..."); } } class Dog extends Animal{ public Dog() { // TODO 自动生成的构造函数存根 } public Dog(String color){ super(color); } public void run(){ System.out.println("Dog run ..."); } public void ProtectHome(){ System.out.println("Dog ProtectHome"); } } class Fish extends Animal{ public Fish(){ } public Fish(String color){ super(color); } public void run(){ System.out.println("Fish run ...."); } public void swim(){ System.out.println("Fish swimming ...."); } } public class Demo3 { public static void main(String[] args) { // TODO 自动生成的方法存根 Animal animal = new Dog(); doSomething(animal); Animal animal2 = new Fish(); doSomething(animal2); Animal animal3 = new Animal(); doSomething(animal3); } public static void doSomething(Animal animal){ if(animal instanceof Dog){ ((Dog)animal).ProtectHome(); }else if (animal instanceof Fish) { ((Fish) animal).swim(); }else { animal.run(); } } } 结果: Dog ProtectHome Fish swimming .... Animal run ...

    多态的弊端就是只能使用左边的类型的方法,要使用右边的扩展的方法就需要强行转型

    转载请注明原文地址: https://ju.6miu.com/read-1305890.html
    最新回复(0)