从java内存角度分析java三大特性

2019-08-27  本文已影响0人  只会写一点点代码

一、背景

上一篇文章记录了鄙人学习java的内存结构的一点小感想,现在回到刚接触java的时候,对java的三大特性,继承,封装,多态好像有了新的认识,用jvm的内存分布来解释一下这三大特性会不会是一件很有意思的事情。

二、分析

一、java封装性
1、字面意思就是包装,专业一点了,我参照维基百科,也就是一种信息的隐藏吧,就是使用抽象的数据类型将属性,数据和一些基于数据的操作进行包装起来,形成一个整体,实现java的万物皆对象的中心思想,数据和方法尽可能的隐藏了内部的细节,只是提供一些对外的接口,供其使用,比如常见的get/set方法等,对于使用者来说呢,他不需要知道也无法知道内部的一些细节,但是压根也不影响使用。

二、java的继承

      public class Person {
         private String think;
         private String name;
         public  String age;
         public String gender;
         public Person(){
            System.out.println("I am father");
        }
         public void say(){
           System.out.println("人会说话的");
       }
       public void walk(){
             System.out.println("人会走路的");
       }
       public class Student extends Person{
            privite String school;
              public Student(){
                   System.out.println("I am son");
                }
                public void say(){
                      System.out.println("学生也会说话");
                  }
                public void run(){
                         System.out.println("学生一般跑");
                }
       }
        
        //执行测试类代码
          1、Student s=new Student();
          2、Person person=new Person();
          3、person.say();
          4、s.age="22';
          5、s.gender="男";
          6、s.say();
          7、Person p =new Student();
          8、p.say()
     --------------------------------------------------------------------------------------------------
       1、当新建对象Student时,运行代码发现父类构造方法被执行,因为在student继承父类Person,虚拟机首先加载Person类
       到方法区,并在堆空间中为父类的成员变量在子类的空间中初始化,然后加载Student类到方法区,为student类的成员变
       量在堆空间中分配空间,默认初始化,并且将栈中的引用s指向堆,可以看到上述的内存结构图中,s指向的区域是包含p+s的。 
          
       2、子类继承了父类的非privte方法和属性,如果我们给s的age和gender属性赋值,这些值会被保存在子类区域的父类空
           间,所以可以根据栈中的引用s可以找到s+p的那一块区域,然后给age和gender赋值。
           
       3、当调用上述3,5和8方法时,会发现控制台输出的都是分别是,父类的方法,子类的方法,子类的方法,第一个方法,第二个
          方法,执行的操作很容易想到,该对象的引用指向对应堆内存相应的方法,但是第三步执行为什么会输出子类的方法。

方法的重写:
上述被称为方法的重写,java规定子类和父类中有两个名称,参数列表和返回值均相同,子类中的新方法会覆盖父类中
原有的方法。

解释:
当执行上述第8行代码的时候,其实是有一步指针改写的操作,调用p.say()时,指针发生了改变,直接指向了子类的方法。
注意:重写是一个运行期间的概念,在运行的时候,会根据p真正指向的实际对象类型进行调用方法,实现这一步指针的
改写。是属于第三点需要讲的java第三特性多态的。

三、总结

个人的一次总结,希望能记录一下学习和思考后的收获,看得不够仔细,纰漏之处还请指出。谢谢。

上一篇下一篇

猜你喜欢

热点阅读