11、面向对象-封装、继承

一、面相对象的程序设计,设计以对象开始,实现编程是从类开始

python的类变量的修饰是隐式的

Java的类变量的修饰时显示的,用关键字static来修饰的

注意点:

  • 类变量可以使用对象名去调用
  • python中类变量如果是对象去调用赋值,会产生这个类变量的副本对象

Java中不会

11、面向对象-封装、继承

创建的副本可以使用del 来删除掉

11、面向对象-封装、继承

面向对象的一个初级例子

11、面向对象-封装、继承

python的构造方法不能有多个,因为python是解释性语言,变解释边运行,所以后面的构造方法,会把前面的覆盖掉,因此python一个类中只能有一个构造方法。而上图的不带参数的构造方法在程序运行的时候会覆盖掉第一个构造方法,因此程序报错。

对象对象的三大特征:封装继承多态

1、封装:这个封装的体现在于类中的属性(就是数据)进行一个安全的保护;这个安全的保护体现在对象不能直接访问类中的属性,而是间接的通过方法去访问,提高了数据访问的安全性。

那为什么通过方法访问就提高了安全性呢?

因为我们可以在方法中设置限制条件,简单的举个“栗子”:我们可以在方法中设置哪些用户可以访问到私有属性,哪些用户没有访问的权限。

11、面向对象-封装、继承

上图并没有进行封装,因而,陈先生觉得自己工资不满意,直接提高自己的工资,显然成功了;但是,这显然不安全,如果每个公司的员工觉得自己的工资不满意都去修改,那岂不是乱了

11、面向对象-封装、继承

上图是封装过的,封装就是对类中的属性进行私有化,不让用户直接访问到。封状的方法:_ _属性名【变量名】,就是封装。                                  而如图封装过去,就不能直接访问封装的私有属性。而修改就更不可以了。

我们提高了数据的安全性

11、面向对象-封装、继承

我们将之前讲到的装饰器和封装结合在一起,减少了业务控制代码的冗余。

11、面向对象-封装、继承

虽说,封装的私有属性不可以直接访问,但是也有例外,方法如上图所示,但是这种方法破坏了面向对象,知道即可,不要使用。python既然可以换种方法直接访问到私有属性。那么Java是否也可以呢?答案是也可以。Java可以通过反射,暴力访问。这种方法很显然也是破坏了面向对象。

2、继承: 为什么要继承? 目的是减少类中的冗余代码,抽取子类中的共有的属性和方法到父类。

那么装饰器是减少冗余的,继承也是减少冗余的,那么他两有什么区别呢?

装饰器的作用:减少的是方法内的业务控制代码

继承的作用:减少类中的冗余代码,(减少重复的属性和整个方法)抽取子类中的重复方法和属性到父类。

11、面向对象-封装、继承

让我们看一下上图,是不是很明显发现Dog类和Cat类中的构造方法很明显冗余。那我们能不能减少冗余呢?是的,这就是我们继承的作用了!

11、面向对象-封装、继承

这样是不是就看着简洁多了?嘿嘿,这就是继承的好处。 注意:继承的用法就是在子类的括号里加上父类的名称。

既然我们知道了继承的大体用法,让我们逐步求精把。

我们都知道上图子类没有构造方法,直接调用父类的构造方法。

那如果子类有构造方法呢?废话不多说,直接上代码,毕竟实践出真知。

11、面向对象-封装、继承

很显然得出结论,子类没有构造方法,直接继承父类的方法,子类有构造方法,就用自己的构造方法。

11、面向对象-封装、继承

但是如果我们在子类有构造函数的条件下,想使用父类的属性,那么就要手动调用了。注意:从运行结果可知:这种情况下,父类先调用构造方法其次子类调用构造方法。

11、面向对象-封装、继承

多继承,按照广度优先的顺序(简单来说就是谁在前,谁先执行)

多继承Python有,但是Java没有。