学懂java:java基础篇

本文解释了类、抽象、接口以及它们在面向对象编程中的作用,包括类作为数据和行为的模板,抽象方法和抽象类的区别,以及接口用于方法复用和多态性的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

他们都告诉你,必须要做什么,却没告诉你为什么。
##《 欢迎访问我的网站,ai工具箱https://4398ai.com里面有免费的chatgpt网站,和很多免费的编程资源的干货》
在这里插入图片描述

首先说一下接口,抽象(abstract),final,类的概念。
:如何用数据表示一个物体?这个物体有多个属性,可能还会有一些功能,答案是类。类的出现,使数据的表示更加高维、方便,类不仅仅是用于描述一个物体,如果你面前有一条狗,叫大黄,如果你用类表示这条狗是你的大黄,是不对的,类是一种模板,它描述一类对象的行为和状态,如果你想说明它是大黄,得从类出发,赋予这个类相应的属性,此时,类变成了对象。
物体—提取属性动作—》类(对物体的抽象)—赋予具体值(实例化)—》对象(表示具体的事物)
比如人与人之间有很多相似的属性,但是可能会稍有不同,重复的声明会很麻烦冗余。通过继承便可以解决这个麻烦。

类的变量:
变量是用于表示具体数值,在类中有三种变量,为什么要有三种变量?整一种不行吗?当然不行,三种变量分别有不同的作用和意义,局部变量消失的最快,消失的快,存在感低的好处是,可以节省计算机的内存资源,适用于不需要长时间保存数据的场景:上下文关联性不强,比如说我去面馆吃饭,我不欠钱,吃碗面付钱,每次重新执行一次就行了。
然后是成员变量,需要和类一起存在,就和人的一生一样,记忆应该是持续的,除了失忆症、死亡,记忆应该和人一直在一起。

再说一下类变量,也称实例变量,这里“实例”说明了 它是给所有实例都内定的值,即在类中声明该实例变量之后,该类的实例都会有该值,起到了减少重复相同声明的作用。

局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。

抽象:类是对象的描绘模板,抽象是干啥的?从哲学的层面来说,抽象的意义在于通过抽象能透过事物的表面现象抓住事物的本质。类已经可以抓住事物的本质了,还要抽象类干嘛?
举一个例子:

在现实生活中,我们可以看到很多不同种类的动物,比如狗、猫、鸟、鱼等等。这些动物都有一些共同的特征,比如它们都有生命、需要食物和水来维持生命、可以移动等等。这些共同的特征就可以抽象出一个“动物”类。

但是,有些特定的动物,比如“鸟”和“鱼”,它们有一些特殊的属性和方法,比如“鸟”可以飞行,“鱼”可以游泳。这些特殊的属性和方法不能在“动物”类中定义,因为不是所有的动物都具备这些特点。

这时候,我们就可以使用抽象类来解决这个问题。抽象类是一种不能被实例化的类,它只能被用作其他类的父类。抽象类中可以定义一些抽象方法,这些方法只有方法名,没有具体的实现。子类必须实现这些抽象方法,才能被实例化。

在这个例子中,我们可以将“动物”类定义为一个抽象类,其中定义一些通用的属性和方法,比如“体重”、“年龄”、“吃饭”、“睡觉”等等。然后,我们可以再定义一些具体的动物类,比如“狗”类、“猫”类、“鸟”类、“鱼”类等等,这些类都继承自“动物”类,并且必须实现“飞行”、“游泳”等抽象方法。

通过这种方式,我们可以将不同种类的动物归为一类,从而方便我们进行管理和使用。同时,抽象类还可以强制子类实现特定的方法,从而提高代码的可靠性和可维护性。

同时抽象也可以完成多态的作用:

定义抽象类Animal(提高了代码的复用性和可维护性。)

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def eat(self):
        pass

    @abstractmethod
    def sleep(self):
        pass

    def 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 实现接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值