什么是面向对象编程思想?
如题
2 个回答
见过花就好,何必在意花属于谁。java小生1、基于对象。就是题主所说的,只要把数据和函数放在一起就可以了。(外加普通的“继承”,不考虑多态的简单继承还算是基于对象的。) 2、多态。首先,方法可以在子类中重写;调用对象方法的时候,调用父类还是子类还是孙类的方法,能否自动选择到合适的呢?解决这个问题的设计就是“多态”。发布于 2021-04-04 10:56 •IP属地 安徽举报评论收藏
谎言不会伤人,真相才是快刀。华仔面向对象编程得结合面向过程来体会 面向过程编程从代码角度是直接给你提供功能函数解决问题,从理解角度就是直接提供某个能力来解决某个问题 面向对象编程从理解角度,是咱们把一系列相关功能交给了一个工具,这个工具就是具备这一系列能力的对象。 从使用时,咱们只能看到对象展示的对外拥有的能力的方法,内部的一些逻辑咱们看不到的,这就是封装的思想。比如 ArrayList 提供的功能,存数据,增删改查 但是内部判断容量,扩容,这些东西咱们都看不到。 然后面向对象设计的好处是可扩展性,一个类出现以后,如果有某些新功能和他相关,但是又不全是他的事儿 那咱们就会利用新的类继承这个类,拓展新的功能了,这就是咱们的继承 当然,继承并不是随意继承的,要结合逻辑设计 否则很可能代码变得耦合度极大,反而形象了设计的扩展性,增加了维护成本 然后面向对象第三大特性,多态 是依赖于继承而产生的一种特点 个人觉得继承和多态是面向对象的核心一,必须要理解的 面向对象设计是核心二,是作为提高必须要去掌握的,好的代码必须依赖于类关系设计 继承的本质就是类对象功能的拓展,这个我觉得靠理解。然后下面是我对多态的一点总结 ====================================== Chinese extends Person 怎么理解多态,多态表示的是多身份多状态,那又怎么去理解这句话呢,看下面的代码 Person p = new Chinese(); 父类的声明指向子类的构造方法,活脱脱的一个多态例子。那么问题来了,现在的对象 p 是什么类型呢 咱们在学校或者在资料上看到的说 p 是 Person 类型,因为什么类型的声明,就是什么类型的对象。能够理解很多资料上为什么这样解释,因为通过 instanceof 关键字判断 p 是否是 Person 类型返回值为 true。但是,咱们不能忽略,instanceof 判定是扩展性判定的 a instanceof A 只要 a 是 A 的类型或者是 A 的子类,他都会返回 true 所以这样判定是不严谨的 而且更重要的是这样一来就解释不了多态多身份的含义了。 最好的判定类型的方式,利用反射 p.getClass() 我们进行输出可以很容易知道 p 是 Chinese 类型,由此知道一个对象是什么类型不是由类型声明决定的,而是由构造方法决定的。以此作为基础,咱们去理解多态多身份的解释 首先,上述代码 表示构造了一个 Chines 类型的对象,他现在的身份是 Person 类型 所以此时咱们通过 p.去调用类成员,只能访问到 Person 类拥有的成员(属性或方法),而我们可以通过强制类型转换 Chinese c = (Chinese)p; 此时表示咱们将 p 对象的身份改变为了 Chinese,用 c 去接收,我们发现此时 c 就可以访问到 Chinese 类型拥有的成员和方法了。 而如果咱们的声明是 Person p = new Person(); 表示当前的对象 p 是 Person 类型的 所以咱们通过(Chinese)p 去强转会抛出类型转换异常 因为对于此时的对象 p 来说,他是 Person 类型的 他并没有 Chinese 类型的身份。 所以,从某一层面来说,继承拓展的也是对象的身份,这便是多态,多身份的体现。 从内存角度来说,多态是这样子的 Person p = new Chinese() 堆内存开辟的是一个 Chinese 空间,但是咱们知道内存模型是剥洋葱结构的,内层父类,外层子类的嵌套关系 而多态就是 此时我们只能访问到 Chinese 对象的父类 Person 空间 ====================================== 多态的执行 多态执行方法或者.属性是什么过程呢 咱们知道 Person p = new Chinese(); 此时 p 对象的身份是 Person 所以在搜索成员的时候,他会优先在 Person 的空间内去搜索,如果搜索不到这个成员,表示当前的身份没有这个成员,编译就报错了。如果搜索到了这个成员,那么他会再到子类里面去搜索,如果在子类找到了这个成员,那么就使用的是子类的成员。如果子类成员搜索完毕,没有找到这个成员,那么就执行 Person 搜索到的成员了。 体现在咱们课程笔记里归纳的就是, p 只能访问到 Person 类内部的属性和方法,如果方法在 Chinese 里重写了,那么执行子类重写的方法发布于 2021-04-04 10:55 •IP属地 浙江举报评论收藏
公众号进入网站体验更佳

