这几天经过完成issue对面向对象有了新的认识。编程
在接触一个子组件父组件的时候,自组件改变了对象的值,可是并无传给父组件,最后在父组件保存生效了,那么,他是如何将值传给父组件的呢。
经过潘老师的指导,
我认识到对象与变量的不同。
首先,咱们这里父组件经过@input方式传给子组件了part对象。学习
@Input() part: Part;
而自组件改变part对象的某个属性,父组件里的part对象是跟着变得,换句话说,子组件与父组件为引用的为同一个对象。
咱们看一下《Head First Java》对此内容的介绍,
这几张图形象的说明了对象引用的规则。经过这张图,咱们能够假设@input做用至关于this
part(子组件part对象) = _part(父组件part对象)
这时候咱们就不难理解为何子组件对象的某一属性改变而父组件对象属性为何跟着改变了。正如第二个图示的那样,
咱们子组件与父组件的变量都指向了同一对象。当一者将对象进行改变时,另外一我的再去读取对象,对象已经改变了。
让咱们用一个demo来验证spa
public class Dog { public int weight; } class dogTest { @Test void test() { Dog b = new Dog(); Dog c = new Dog(); c = b; System.out.println(c.weight); b.weight = 10; System.out.println(c.weight); } }
正如前面所说,若是两个变量指向同一个对象,那么经过其中一个改变对象的属性,另外一个变量也会改变。3d
咱们大一学面向对象编程思想的时候常背的就是面向对象三大特性,可是什么是封装没学明白。
其实咱们的项目一直在使用封装,好比咱们在后台加一个字段,一般状况下是在实体类新建一个属性,而后再给他get方法和set方法,这种作法即是封装。code
public class Dog { private int weight; public int weight() { return weight; } public void setWeight(int weight) { this.weight = weight; } }
咱们注意到,咱们将属性设为私有属性,而经过公有的weight与setWeight方法进行读取与设置。这是为何呢
其实咱们如今尚未体现封装的优势。咱们观察这个类,weight表明狗的重量,重量就应该是一个大于0的值。假如咱们设置weight为公有属性并经过dog.weight传值,咱们就有可能传入一个错误的值对象
Dog dog = new Dog(); // 此为错误演示 dog.weight = -10;
而经过封装,咱们在setWeight方法设置校验。blog
public void setWeight(int weight) { if (weight > 0) { this.weight = weight; } }
则能够避免数据出错的问题。
虽然咱们如今并无在实际项目中使用封装带来的好处,可是咱们仍然进行封装,这容许咱们在将来某一天回心转意时能够快速更改。get
学习是一个理论与实践相互结合的过程,我在大一下学期没学明白的面向对象,将在将来的实践中逐步理解。input