他们都告诉你,必须要做什么,却没告诉你为什么。
##《 欢迎访问我的网站,ai工具箱,https://4398ai.com里面有免费的chatgpt网站,和很多免费的编程资源的干货》
首先说一下接口,抽象(abstract),final,类的概念。
类:如何用数据表示一个物体?这个物体有多个属性,可能还会有一些功能,答案是类。类的出现,使数据的表示更加高维、方便,类不仅仅是用于描述一个物体,如果你面前有一条狗,叫大黄,如果你用类表示这条狗是你的大黄,是不对的,类是一种模板,它描述一类对象的行为和状态,如果你想说明它是大黄,得从类出发,赋予这个类相应的属性,此时,类变成了对象。
物体—提取属性动作—》类(对物体的抽象)—赋予具体值(实例化)—》对象(表示具体的事物)
比如人与人之间有很多相似的属性,但是可能会稍有不同,重复的声明会很麻烦冗余。通过继承便可以解决这个麻烦。
类的变量:
变量是用于表示具体数值,在类中有三种变量,为什么要有三种变量?整一种不行吗?当然不行,三种变量分别有不同的作用和意义,局部变量消失的最快,消失的快,存在感低的好处是,可以节省计算机的内存资源,适用于不需要长时间保存数据的场景:上下文关联性不强,比如说我去面馆吃饭,我不欠钱,吃碗面付钱,每次重新执行一次就行了。
然后是成员变量,需要和类一起存在,就和人的一生一样,记忆应该是持续的,除了失忆症、死亡,记忆应该和人一直在一起。
再说一下类变量,也称实例变量,这里“实例”说明了 它是给所有实例都内定的值,即在类中声明该实例变量之后,该类的实例都会有该值,起到了减少重复相同声明的作用。
局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。
抽象:类是对象的描绘模板,抽象是干啥的?从哲学的层面来说,抽象的意义在于通过抽象能透过事物的表面现象抓住事物的本质。类已经可以抓住事物的本质了,还要抽象类干嘛?
举一个例子:
在现实生活中,我们可以看到很多不同种类的动物,比如狗、猫、鸟、鱼等等。这些动物都有一些共同的特征,比如它们都有生命、需要食物和水来维持生命、可以移动等等。这些共同的特征就可以抽象出一个“动物”类。
但是,有些特定的动物,比如“鸟”和“鱼”,它们有一些特殊的属性和方法,比如“鸟”可以飞行,“鱼”可以游泳。这些特殊的属性和方法不能在“动物”类中定义,因为不是所有的动物都具备这些特点。
这时候,我们就可以使用抽象类来解决这个问题。抽象类是一种不能被实例化的类,它只能被用作其他类的父类。抽象类中可以定义一些抽象方法,这些方法只有方法名,没有具体的实现。子类必须实现这些抽象方法,才能被实例化。
在这个例子中,我们可以将“动物”类定义为一个抽象类,其中定义一些通用的属性和方法,比如“体重”、“年龄”、“吃饭”、“睡觉”等等。然后,我们可以再定义一些具体的动物类,比如“狗”类、“猫”类、“鸟”类、“鱼”类等等,这些类都继承自“动物”类,并且必须实现“飞行”、“游泳”等抽象方法。
通过这种方式,我们可以将不同种类的动物归为一类,从而方便我们进行管理和使用。同时,抽象类还可以强制子类实现特定的方法,从而提高代码的可靠性和可维护性。
同时抽象也可以完成多态的作用:
定义抽象类Animal(提高了代码的复用性和可维护性。)
from abc import ABC, abstractmethodclass Animal(ABC):@abstractmethoddef eat(self):pass@abstractmethoddef sleep(self):passdef breathe(self):print("Animal is breathing")# 定义子类Dog
class Dog(Animal):def eat(self):print("Dog is eating")def sleep(self):print("Dog is sleeping")# 定义子类Cat
class Cat(Animal):def eat(self):print("Cat is eating")def sleep(self):print("Cat is sleeping")# 创建Dog和Cat对象并调用方法
dog = Dog()
dog.eat()
dog.sleep()
dog.breathe()cat = Cat()
cat.eat()
cat.sleep()
cat.breathe()
再说一下接口:有了抽象类,抽象方法,为啥还要有接口?
相比于抽象类,接口更加纯粹,更加偏向于对方法的复用。所以接口只能包含抽象的方法。
从单词的含义上说extends 与 implement都是继承。为啥要整两个?
是因为他们服务的对象不同:
extends 是用于继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承——》不声明为final,或者是抽象类,说明创建该类的人是希望这个类是打开的,可以复用的普通类,而extend对可复用的普通类进行继承,对其功能属性进行修改,而减少冗余代码。
JAVA中不支持多重继承,但是可以用接口来实现,这样就要用到implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了 ,比如 class A extends B implements C,D,E——》它的服务对象是接口。
术语话来说:
extends 继承类;implements 实现接口。