关于多态(内存分析)

public class A {
    public void set() {
        System.out.println("----a------");
    }
}

public class B extends A {
    public void set() {
        System.out.println("----b------");
    }

    public static void main(String[] args) {
        A a = new A();
        A b = new B();
        a.set();
        b.set();
    }
}

当A中没有定义和B方法中相同的签名方法时,A调用B的方法,那么编译报错;如果满足了继承、重写、引用子类类型,那么调用的是子类方法;也就是new了谁的对象就调用谁的方法;

在内存中可以理解为:子类有父类的指针,而父类没有子类的指针(这里的指针指C++在底层的实现,Java并没有指针),继承才有

父类的引用可以指向子类的实列,那为什么不能调用子类独有的方法呢

Java代码在运行的时候,会有维护相应的方法表,多态在Java里的体现主要是重载和覆盖,如下:

public class DynasicDispath {
    static abstract class Human{
        protected abstract void sayHello();
    }
    static class Man extends Human{ 
        protected void sayHello() {
            System.out.println("man say hello");
        };
    }
    static class WoMan extends Human{ 
        protected void sayHello() {
            System.out.println("woman say hello");
        };
    }
    
    public static void main(String[] args) {
        Human man = new Man();
        Human woman = new WoMan();
        man.sayHello();
        woman.sayHello();
        man = new Man();
        man.sayHello();
        
    }
}
父类有一个方法,在子类可以覆盖对应的方法,使得父类有多个不一样的实现形式

--->你有没有试过springmvc多个impl实现一个service

在Java代码实际运行的时候,Java虚拟机里面有一个叫方法区的内存空间,方法区里面就维护了子类相对应的方法表,如果在子类找不到对应的方法就会去父类找(Java里面的多态又不仅仅是继承,我们现在解决的是,Java编译和运行时,方法引用的不同,影响结果),会有各种指针指向方法区里面的常量,比如一个类Person,那这个类的Java文件编译成class文件之后,在class文件里面会有一个符号引用,这个符号引用会指向一个常量“Person”,在真正运行的时候,这个符号引用就是C++里面的指针,在编译的时候,还不知道那个字符串的地址,在真正运行的时候,这个字符串会在方法区域里面初始化,在类加载的时候,首先会在对应的内存里面,有一个指针指向字符串对应的地址(Java虚拟机就是C++实现的),在Java里面,创建对象要分配内存,另一种分配方式就是根据线程来的,Java虚拟机会给每一个线程预留内存用作对象分配;

猜你喜欢

转载自blog.csdn.net/GodPluto/article/details/82918715
今日推荐