- 封装
- “封装”这个概念,由两部分构成:一部分是封,一部分是装。
- “封装”这个动作,顺序应该是先装后封。
- 装:原本name、age、score是3个不同的、离散的数据,它们之间是有关系的是,都是用来描述一个学生的信息。因为是离散的,所以在做数据交互时不好传输,即可能要传3次,或者说一次要传3个数据。所以我们把name、age、score给装起来,装到自定义的Student.java这个类型里面去了。由原来的3个离散的数据,变成了一个Student.java数据,便于传输,也便于理解。
- 封:为什么要封?因为对于Student.java中的name、age、score,谁来都能改,谁来才能读,这是非常不好的。所以我们会把name、age、score都声明成私有的(private),这个过程就是把数据封起来了。
但Student.java数据本身还是用于展示给别人看的,如果把数据全部封死了,那么Student.java就意义了。所以我们还是得提供访问name、age、score的方式,所以最终我们会提供他们的get/set方法。如果我想让name、age、score有读的权限,就提供get方法。如果想让name、age、score有写的权限就提供了set方法。当然,我们还可以加上访问权限public、protect、private,控制想让哪些人具有读的权限或写的权限。
- 继承
- 继承是,子类继承了父类的什么?分两种
- 第1种:对成员变量的继承,堆内存空间增加
- 对成员变量的继承是数据的拷贝(内存空间 + 数值),不管你是私有还是公有的,统统拷贝。父类如果有id、name、age、score这4个属性,意味着在子类对象的堆内存里面也会分配这样的4个数据存储空间,并且子类还会把父类的数据一块拷贝过来进行填充。
- 此时,子类和父类所占用的内存空间 + 包括数据都是独立的,各管各的。
- 但是,对于私有的成员变量的访问,如果父类是私有的,那么子类不可以直接用"."进行访问,只可以间接访问(get、set方法)。这就回到了以前讲的那种继承了,对访问权限的继承。
- 注意事项:访问权限的内存空间是没有任何关系的:
- 现在的继承:而这里老师讲的是,子类对于父类的成员变量的继承,内存空间是怎么说的。
- 以前的继承:老师说(官方文档也说)私有的是不能被继承的,这种说法是访问权限,即子类是不是能够把父类的访问权限给继承过来。
- 第2种:对方法的继承,方法区的空间没有增加
- 对于方法的继承,继承的是方法的使用(访问)权限,而不是方法的代码片段,不是代码拷贝,方法的代码片段没有被继承。什么是对使用(访问)权限的继承?即,如果父类的方法是公有的,那么子类就会继承此方法的使用(访问)权限,子类这边就能用,子类这边也是公有的。
- 注意事项:方法的代码片段不放在栈里面啊,我们一直在强调栈里面放的是方法栈帧,不包含方法的代码片段。方法栈帧是什么东西?方法栈帧里这的是方法的签名与及方法被调用完后应该返回到哪(地址)。
那方法的代码片段放在哪里?方法的代码片段是放在方法区里面的。如下图所示::::::
- 第1种:对成员变量的继承,堆内存空间增加
- 方法的重写(覆盖)
- 从方法区内存空间的角度来说,方法的重写是父类在方法区中有一个方法代码片段,而子类重写的方法以后也在方法区中新创建了一个方法区的代码片段,这两个代码片段相互独立、相互隔离、互不干扰、各管各的、各调各的。
- 静态方法的重写(覆盖):静态方法是可以重写(覆盖)的。那以前老师说,静态方法不存在重写(覆盖)是什么一回事呢?那是针对多态情况下说的,即在多态情况下子类对父类的静态方法的重写(覆盖)是不起做用的。但是,如果不使用多态,子类对父类的于静态方法,同样是可以发生重写(覆盖)的。
- 注意事项:静态方法和你具体的引用是什么没有任何关系,只关心引用的类型是什么。比如:Animal a = null; a.call(); 照样可以调用,不会抛出空指针异常。
- 静态方法的重写(覆盖):静态方法是可以重写(覆盖)的。那以前老师说,静态方法不存在重写(覆盖)是什么一回事呢?那是针对多态情况下说的,即在多态情况下子类对父类的静态方法的重写(覆盖)是不起做用的。但是,如果不使用多态,子类对父类的于静态方法,同样是可以发生重写(覆盖)的。
- 从方法区内存空间的角度来说,方法的重写是父类在方法区中有一个方法代码片段,而子类重写的方法以后也在方法区中新创建了一个方法区的代码片段,这两个代码片段相互独立、相互隔离、互不干扰、各管各的、各调各的。
- 成员变量也是有重写(覆盖)的
- 原理,对方法的重写(覆盖)。
- 继承是,子类继承了父类的什么?分两种
- 多态:
- 现象
- 相同的引用,调用相同的方法,出现多种不同的结果
- 条件:多态的发生需要3个条件:
- 条件1:继承
- 条件2:重写
- 条件3:上转型(upCasting)
- 转型的分类:
- 上转型:父类的引用指向子类的对象。
- 下转型:毫无无意义。子类的引用指向父类的对象。
- 现象
- 静态绑定与动态绑定
- 程序的执行分为两个阶段:一个是编译期(阶段);一个是运行期(阶段)。
- 编译期(阶段),静态绑定:Animal a = null; a.call();这句代码的运行流程是什么?首先,在编译期(阶段)的时候,Animal和a做了一个静态绑定,把a赋值为Animal类型了,因此调用静态方法是父类的静态方法。
- 运行期(阶段),动态绑定:Animal a = new Cat(); a.call();这句代码的运行流程是什么?
- 首先,在编译期(阶段)的时候,Animal和a做了一个静态绑定,把a赋值为Animal类型了.
- 其次,真正在运行期(阶段)的时候,它发现Animal a 这个引用指向的实际是new Cat();,所以又发生了一次绑定,这次叫动态绑定,产生了上转型,由于多态性,所以这次a.call();中的call()方法动态绑定的是子类的call()方法。
- 程序的执行分为两个阶段:一个是编译期(阶段);一个是运行期(阶段)。
- PO/Bean/Vo/Do/Dto的关系
- PO和Bean是普通的实体类对象。
- Vo、Do和Dto都是一个概念(具体概念还是存在一点小差别,分得更细了),都指的是数据传输对象,一般用于和页面进行交互。
封装、继承、多态、上下转型、静态绑定、动态绑定、PO/Bean/Vo/Do/Dto,dljd reyco郭
猜你喜欢
转载自blog.csdn.net/aiwokache/article/details/129019030
今日推荐
周排行