新入行小白了解谈java面向对象的三大属性有些疑惑,还望各路大神指教教导一下

面向对象的三大基本特征,众所周知是:封装,继承,多态。
1.封装:把同一类事物的共性(包括属性和方法)归到同一类中,方便使用,也隐藏了信息,只需根据留在外部的接口(对象名和参数)进行操作,1)具体是通过getter,setter方法
2.继承:是从已有的类中派生子类,有着父类的属性和行为,一般只支持单继承,是可传递的,继承了属性方法,也有自己新定义的属性方法。具体是extends,implents
3.多态:这就是最有些疑惑的了,2)有很多人说继承是多态的前提,也有人说封装和继承都是多态的前提。甚至还有人说是继承的一种表现方式,但多态本身的话我也看到了很多,如编译期与运行期状态不同,同一个事务对象在不同时候的状态,也有允许不同类型的子对象对统一消息做出不同回应?不过,在多态这方面我目前能确定的是重写和重载构成多态,是体现多态的两种方法,即不同返回值,不同的参数个数就是多态(,也就是说方法的重写,重载与动态连接构成这多态性?可能也有理解有误,请多指教)。
1)2)感觉也有些问题

3个回答

这个东西你越搜索越迷惑,因为网上错误的说法占了主流。

多态的意思很简单,就是一个概念,多种形态。
很多人的误解在于,把多态简单理解为派生类的函数重写,这种理解是很片面的。函数重写是实现多态的一种手段,但是实现多态还有别的手段。

首先说为什么函数重写是实现多态的一种手段,道理很简单,对于派生类来说,它也可以被视作基类的类型,因此它是一个概念。但是每个派生类相同的方法有自己独特的实现,这个就是多种形态。所以是多态。

而多态还有别的手段,具体来说,泛型、函数重载、运算符重载(C++等语言支持,Java不支持)也是多态的实现手段。

比如说泛型,一种数据结构或者算法就是同样的概念,而不同的参数类型构成了不同的形态。

你提到了封装,你说getter/setter是封装,没错,但是也是片面的,除了getter/setter,用来修饰成员变量和方法的关键字,private protected,也构成封装,使得类外部不能直接访问它们。final 关键字修饰类,使得类不能派生,这也是封装,不加上virtual关键字的方法,不允许派生类重写,这也是封装。

继承也是类似的,不过对于Java来说,的确只有接口和派生类两种。对于一些语言,支持原型(prototype)继承。
总之,无论封装、继承还是多态,说的是面向对象的设计理念,而不是具体语法。

1。为什么要封装
1)比较肤浅的可以理解为我要隐藏类中的属性值 (设置为private )为了避免其他所有地方 都可以随意更改这个类的值 或者设置某些会出现问题的值
2)换成 getter setter的优势是我可以统一管理这些出入口 ,比如setter可以添加判断条件 getter可以对返回结果进行处理(如需要加密 或 进行格式化运算)
2. 继承可以有什么作用
1)可以比较简单的抽象代码 比如 若干个类中 都有完全相同的方法 ,那么可以把这些方法提取出来做一个父类 (比如 很多动物的吃的方法都是一样的 那么在这个例子中 动物就可以做为一个父类)
3.多态
多态确实是我初学的时候理解最费劲的一个特性 还是上例中的动物, 如果我有个方法 可以接收动物这个类 那么 我可以给这个方法 传任何继承了动物类的所有对象 当作参数 比较抽象 写几个伪码帮你理解

class Dog extends Animal{
      xxxx
}


public static void test(Aninal animal){

}

Dog d = new Dog();
test(d);
    因为我是接收所有的animal当参数  而dog是特定的某一种  也是animal 所以是允许的

或者上面在声明Dog对象的时候 我也可以这样写
Animal d = new Dog();
可以理解为  我声明了一个动物  ,具体来说就是狗

但是上面的例子中反过来 就是不行的  相信你应该可以理解。

类似的 上例中的  animal 可以声明成为接口  然后dog类中就必须实现animal中的所有方法

4.建议
新入门的 多练习 在练习中收获。基础扎实之后 然后去看一些别人的代码,要弄懂。看看懂代码之后 再去尝试分析一样这样写代码的优劣。

weixin_42106583
weixin_42106583 回复weixin_43944282: 没说继承是多态的前提啊,这是其中一种形式,通过继承父类的属性行为,并针对特殊的行为特殊处理实现多态化,你把多态理解成格式化的行为我认为不合适。Java是面向对象的语言,关于封装,你可以理解成将一个对象的所有属性行为装在一个箱子里,只有对象可以调用,如果进行了调用进行了修改发生了数值的变化,这个对象还是这个对象,对象本身的定义没有变化,所以不是多态。多态归根结底就是行为多态化(如方法的重写重载)和对象的多态化(如继承),你别光抠理论,去敲个代码运行一下就能看到直观效果了,编译器会告诉你多态的神奇。
10 个月之前 回复
a22222222q
a22222222q 这个是胡说啊
10 个月之前 回复
weixin_43944282
weixin_43944282 回复interesting_star: 那这样的话继承的确是多态的前提了,可通过封装再调用内部信息的话产生了变化,也可以理解发生了多态吗?
11 个月之前 回复
interesting_star
interesting_star 同一个事务对象在不同时候的状态,也有允许不同类型的子对象对统一消息做出不同回应 这个可以理解为 我所有的动物都有吃 这个方法 但是某些动物(如老鼠)的吃的方法比较特殊 我就可以在这个老鼠的类中 对吃进行重写 这样如果我声明了一个Animal animal = new Mouse() 当我调用这个animal的吃的方法的时候 就是调用mouse中重写的方法了
11 个月之前 回复
  1. 封装用以实现高内聚,减少与外界的交流,增强可靠性。

  2. 继承解决实现重用,减少重复代码。

  3. 多态用来实现松耦合,提高程序可扩展性,一般情况下一个对象有多种行为,如果想让它在不同情况下有不同的反应,那就是多态了。

Java的官方Tutorial对多态进行了定义:The dictionary definition of polymorphism refers to a principle in biology in which an organism or species can have many different forms or stages. This principle can also be applied to object-oriented programming and languages like the Java language. Subclasses of a class can define their own unique behaviors and yet share some of the same functionality of the parent class.

Java中多态的使用主要体现在父类引用指向子类对象,它的目的是解决接口对接的问题。
假设我有一个接口f(A a)和一个类B extends A,如果我们希望让B类对象可以用在这个接口上,可以按如下写法:

A a = new B();
f( a );

通俗来讲,这实际上创造了一个B对象,它有很强大的功能(既有父类A的方法也有自己额外添加的方法,甚至对父类的方法进行了重写)但是它没办法用在一个很久之前写的方法上,而我也不想改动这个方法,已知这个方法其实想要的仅仅是A的样子的东西,只需要知道这个东西有A的成员和方法就行了。为了以上需求,我将我的B对象进行阉割,让它成为A的样子,这就万事大吉了。

关于多态,可以看 Thinking in Java -Polymorphism

强烈推荐这本书,可能有些难,但绝对给力,中文版叫Java编程思想

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问