对面向对象的进一步认识

前言

这几天通过完成issue对面向对象有了新的认识。

对象引用

在接触一个子组件父组件的时候,自组件改变了对象的值,但是并没有传给父组件,最后在父组件保存生效了,那么,他是如何将值传给父组件的呢。
通过潘老师的指导,
image.png
我认识到对象与变量的不一样。
首先,我们这里父组件通过@input方式传给子组件了part对象。

@Input()
  part: Part;

而自组件改变part对象的某个属性,父组件里的part对象是跟着变得,换句话说,子组件与父组件为引用的为同一个对象。
我们看一下《Head First Java》对此内容的介绍,
image.png
这几张图形象的说明了对象引用的规则。通过这张图,我们可以假设@input作用相当于

part(子组件part对象) = _part(父组件part对象)

这时候我们就不难理解为什么子组件对象的某一属性改变而父组件对象属性为什么跟着改变了。正如第二个图示的那样,
我们子组件与父组件的变量都指向了同一对象。当一者将对象进行改变时,另一个人再去读取对象,对象已经改变了。
让我们用一个demo来验证

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);
    }
}

image.png
正如前面所说,如果两个变量指向同一个对象,那么通过其中一个改变对象的属性,另一个变量也会改变。

面向对象三大特性之一——封装

我们大一学面向对象编程思想的时候常背的就是面向对象三大特性,但是什么是封装没学明白。
其实我们的项目一直在使用封装,比如我们在后台加一个字段,通常情况下是在实体类新建一个属性,然后再给他get方法和set方法,这种做法便是封装。

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方法设置校验。

public void setWeight(int weight) {
    if (weight > 0) {
        this.weight = weight;  
    }
}

则可以避免数据出错的问题。
虽然我们现在并没有在实际项目中使用封装带来的好处,但是我们仍然进行封装,这允许我们在未来某一天回心转意时可以快速更改。

总结

学习是一个理论与实践相互结合的过程,我在大一下学期没学明白的面向对象,将在未来的实践中逐步理解。

阅读 186

推荐阅读