多态,封装,继承

封装
封装的意义:
封装的意义在于保护或者防止代码(数据)被我们无意中破坏。
保护成员属性,不让类以外的程序直接访问和修改;
隐藏方法细节
关于对象封装的原则:
内聚:内聚是指一个模块内部各个部分之间的关联程度
耦合:耦合指各个模块之前的关联程度
封装原则:隐藏对象的属性和实现细节,仅对外公开访问方法,并且控制访问级别
在面向对象方法中,用类来实现上面的要求。用类实现封装,用封装来实现高内聚,低耦合。

继承
继承的意义:
主要实现重用代码,节省开发时间。

子类继承父类静态属性方法是否可以被继承和重写?
结论:非静态属性和方法可以被继承和重写。但是静态属性和方法可以被继承,但是没有被重写(overwrite)而是被隐藏,即调用的都是父类的属性和方法。
原因:

静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成对,不需要继承机制及可以调用。如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"隐藏"。如果你想要调用父类的静态方法和属性,直接通过父类名.方法或变量名完成,至于是否继承一说,子类是有继承静态方法和属性,但是跟实例方法和属性不太一样,存在"隐藏"的这种情况。
静态属性、静态方法和非静态的属性都可以被继承和隐藏而不能被重写,因此不能实现多态,不能实现父类的引用可以指向不同子类的对象。非静态方法可以被继承和重写,因此可以实现多态。
多态:
什么是多态
面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。
多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
多态的作用:消除类型之间的耦合关系。

多态的三个条件:
1.继承的存在(继承是多态的基础,没有继承就没有多态).
2.子类重写父类的方法(多态下调用子类重写的方法).
3.父类引用变量指向子类对象(子类到父类的类型转换).

实现多态方式:
1.接口多态性。
2.继承多态性。
3.通过抽象类实现的多态性。

子类转换成父类时的规则:
1.子类会自动向上转型
2.此时父类调用的重写方法是各个子类的方法实现
3.此时通过父类引用变量无法调用子类特有的方法

多态的好处:
1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

多态实现的原理:
类调用 (invokestatic) 是在编译时刻就已经确定好具体调用方法的情况,而实例调用 (invokevirtual) 则是在调用的时候才确定具体的调用方法,这就是动态绑定,也是多态要解决的核心问题。

方法表是动态调用的核心,也是 Java 实现动态调用的主要方式。它被存储于方法区中的类型信息,包含有该类型所定义的所有方法及指向这些方法代码的指针。

JVM 首先查看常量池,确定方法调用的符号引用(名称、返回值等等),然后利用 this 指向的实例得到该实例的方法表,进而搜索方法表来找到合适的方法地址。

作者:奔跑吧李博
链接:https://www.jianshu.com/p/f78cab5deb9a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

<think>好的,我现在需要回答用户关于面向对象编程中继承多态封装的概念及用法的问题。首先,我得回忆一下这三个核心概念的定义以及它们在编程中的具体应用。 首先,封装。根据提供的引用,特别是引用[1]和[4],封装主要是隐藏对象的内部状态和实现细节,只对外提供公共的访问方式。比如,在类中设置私有变量,然后通过公共的getter和setter方法来访问和修改这些变量。这样做的好处是提高安全性和降低耦合度。例如,用户提到的引用[1]提到“继承(Encapsulation)”,这里可能是一个笔误,因为继承封装是不同的概念,但可以推测引用中的正确内容应该是指封装的作用。需要确认一下引用的准确性,但根据上下文,引用[4]更明确地讨论了封装作为隐藏细节的手段。 然后是继承。引用[1]和[4]都提到继承是子类扩展父类的特性,形成层次结构。比如,动物类作为父类,猫和狗作为子类继承自动物。这样能复用代码,并且表现出层次关系。引用[4]特别指出继承的好处是代码重用和表现体系结构。需要举一个具体的例子,比如Java中的extends关键字,或者Python中的类定义。 接下来是多态。引用[2]和[3]详细解释了多态允许父类引用指向子类对象,调用方法时会根据实际对象类型执行不同的行为。比如,动物类有叫声方法,猫和狗重写这个方法,当通过动物类的引用调用时,实际执行的是子类的方法。引用[3]还提到多态调用的机制,即检查父类是否存在该方法,否则编译错误,存在则调用子类的方法。这里需要注意多态的实现通常依赖于方法重写和继承。 现在需要将这些概念组织成结构清晰的回答,每个部分先讲概念,再讲作用,最后给出示例。同时,要确保使用正确的中文表达,并引用提供的资料。比如,在解释封装时引用[4],多态时引用[2][3]等。 另外,用户可能希望了解如何使用这些概念,比如在代码中如何实现封装继承多态。因此,需要给出具体的代码示例,比如Java或Python的类定义,展示私有变量、继承关系和方法重写。例如,Python中使用类定义,私有变量用双下划线,然后通过方法访问;继承通过子类括号中的父类名实现;多态则通过方法重写体现。 还需要检查是否有混淆的地方,比如引用[1]中提到的“继承(Encapsulation)”显然是错误的,应该是封装。但根据引用内容,可能是一个排版错误,所以需要正确引用来源,避免误导用户。 最后,生成相关问题,可能包括这些概念的区别、实际应用案例、优缺点比较等,以帮助用户进一步学习。</think>### 面向对象编程中的继承多态封装 #### 1. **封装(Encapsulation)** - **概念**: 封装是将对象的属性和方法隐藏在内部,仅通过公共接口与外部交互。例如,使用私有变量(如`private`或`__变量名`)限制直接访问,再通过公共方法(如`getter`和`setter`)控制数据的读写[^4]。 - **作用**: - 提高安全性:防止外部直接修改敏感数据。 - 降低耦合:内部实现细节变更不影响外部调用。 - **示例**(Python): ```python class BankAccount: def __init__(self): self.__balance = 0 # 私有变量 def deposit(self, amount): if amount > 0: self.__balance += amount def get_balance(self): return self.__balance ``` #### 2. **继承(Inheritance)** - **概念**: 继承允许子类复用父类的属性和方法,并扩展新功能。例如,`Dog`类继承`Animal`类,可直接使用父类的`eat()`方法[^1]。 - **作用**: - 代码复用:减少重复逻辑。 - 层次化设计:通过类体系表达现实关系(如动物→哺乳动物→狗)。 - **示例**(Java): ```java class Animal { void eat() { System.out.println("Eating..."); } } class Dog extends Animal { void bark() { System.out.println("Barking..."); } } ``` #### 3. **多态(Polymorphism)** - **概念**: 多态允许父类引用指向子类对象,调用方法时根据实际对象类型执行不同逻辑。例如,`Animal animal = new Dog();`调用`animal.sound()`可能执行`Dog`类的方法[^2][^3]。 - **作用**: - 增强扩展性:新增子类无需修改通用代码。 - 接口统一:用父类类型处理多种子类对象。 - **示例**(Python): ```python class Animal: def make_sound(self): pass class Cat(Animal): def make_sound(self): print("Meow!") class Duck(Animal): def make_sound(self): print("Quack!") def animal_sound(animal: Animal): animal.make_sound() # 根据实际对象类型调用不同方法 animal_sound(Cat()) # 输出 Meow! animal_sound(Duck()) # 输出 Quack! ``` ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值