深切懂得子类和父类之间关系

    添加时间:2013-6-11 点击量:

    Java进修的第二篇总结!——子类和父类 深切解析,大师多多支撑!    



    从内存角度去解析代码,可以从本质上懂得一门说话!



    子类从父类持续分成两种:




    1.办法的持续:


    办法的持续,父类直接把本身的办法转移到子类中去,当然前提是父类的办法润饰符的接见局限是子类可以接见的局限,然则若是子类已经重写了父类的办法,这时辰这个办法就不克不及重父类转移到子类中。




    2.成员变量的持续 :


    成员变量就会有点奇妙了,它不会从父类转移到子类,而是保存在父类中,这就会呈现,子类和父类可能同时拥有两个雷同名字的变量。



    下面用一段代码来申明这种相对斗劲错杂的关系:






    package com.text;
    

    public class Test {

    public static void main(String[] args) {
    Father a = new Father();
    Chilren b = new Chilren();
    Father c = new Chilren();
    a.getAge();
    System.out.println(a.age);
    b.getAge();
    System.out.println(b.age);
    c.getAge();
    System.out.println(c.age);
    }
    }

    class Father {
    int age = 40;

    public void getAge() {
    System.out.println(age);
    }
    }

    class Chilren extends Father {
    int age = 18;

    public void getAge() {
    System.out.println(age);
    }
    }
    输出

    40
    40
    18
    18
    18
    40


      



    前四个成果可以懂得,然则最后两个成果有人可能会问为什么成果会不一样,这段代码就表现了,成员变量持续和办法持续的差别。



    可以得出结论: 


    Father c = new Chilren();


     在以上父类引用指向子类对象景象下,接见变量看的是引用类型,所以c.age是父类的成员变量,而c.getAge()接见到的是子类Chilren的办法,所以在这个办法顶用到的age变量是Chilren的变量




    反正一句话,接见变量看声明,接见办法看实际对象类型(new出来的类型)




    接下来对代码做项目组批改




    public static void main(String[] args) {
    

    Chilren b = new Chilren();
    Father c = b
    System.out.println(b.age);
    System.out.println(c.age);
    }


    输出
    18
    40



      


         b 和c 两个引用都是指向内存中同一个对象,然则打印出来的成果倒是不合,这就说了然,内存中保存了两个 age的值,一个是18 一个是40 。



         这里就会产生一些疑问,在内存中他们是怎么存储的?这时辰会想到有个super关键字,经由过程super. 可以接见到父类的变量和办法,这里有人会说:“super.代表的就是一个父类对象,因为他指向父类”  之前我也是这么想,然则看过一些书后知道其实不是如许



          其实super.不是“器材”,说道super.天然会想到this.,有人把他们归为同类,其实他们大大不合



    this:是一个真真实实对象,代表的就是当前对象,可以用 return this;  去返回一个对象。



    super:不克不及一个对象,不是指向父类对象的意思,super只是润饰了他后边的内容,告诉JVM,后面这项目组内容不是当前对象所属类的内容罢了,若用return super,JVM是不容许的,是一种错误的语法。



    public static void main(String[] args) {
    

    Chilren b = new Chilren();
    Father c = b
    System.out.println(b.age);
    System.out.println(c.age);
    }


    输出
    18
    40



      


     回归到上方这段代码,这里并不是说内存中有两个对象 b 和 c ,内存中其实就只有一个 b对象 ,只是c 不仅有本身的实例 变量,同时也存在父类所定义的全部实例变量。



            所以可以得出结论:在实例化一个子类的同时,体系会给子类所有实例变量分派内存,也会给他的父类的实例变量分派内存,及时父子类中存在重名的实例变量,也会两个都分派内存的,这个时辰子类只是隐蔽了父类的这个变量,但还是会给它分派内存,然后可以用super来接见属于父类的变量。





     

    我们永远不要期待别人的拯救,只有自己才能升华自己。自己已准备好了多少容量,方能吸引对等的人与我们相遇,否则再美好的人出现、再动人的事情降临身边,我们也没有能量去理解与珍惜,终将擦肩而过。—— 姚谦《品味》
    分享到: