面向对象的三大基本特征,众所周知是:封装,继承,多态。
1.封装:把同一类事物的共性(包括属性和方法)归到同一类中,方便使用,也隐藏了信息,只需根据留在外部的接口(对象名和参数)进行操作,1)具体是通过getter,setter方法
2.继承:是从已有的类中派生子类,有着父类的属性和行为,一般只支持单继承,是可传递的,继承了属性方法,也有自己新定义的属性方法。具体是extends,implents
3.多态:这就是最有些疑惑的了,2)有很多人说继承是多态的前提,也有人说封装和继承都是多态的前提。甚至还有人说是继承的一种表现方式,但多态本身的话我也看到了很多,如编译期与运行期状态不同,同一个事务对象在不同时候的状态,也有允许不同类型的子对象对统一消息做出不同回应?不过,在多态这方面我目前能确定的是重写和重载构成多态,是体现多态的两种方法,即不同返回值,不同的参数个数就是多态(,也就是说方法的重写,重载与动态连接构成这多态性?可能也有理解有误,请多指教)。
1)2)感觉也有些问题
这个东西你越搜索越迷惑,因为网上错误的说法占了主流。
多态的意思很简单,就是一个概念,多种形态。
很多人的误解在于,把多态简单理解为派生类的函数重写,这种理解是很片面的。函数重写是实现多态的一种手段,但是实现多态还有别的手段。
首先说为什么函数重写是实现多态的一种手段,道理很简单,对于派生类来说,它也可以被视作基类的类型,因此它是一个概念。但是每个派生类相同的方法有自己独特的实现,这个就是多种形态。所以是多态。
而多态还有别的手段,具体来说,泛型、函数重载、运算符重载(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.建议
新入门的 多练习 在练习中收获。基础扎实之后 然后去看一些别人的代码,要弄懂。看看懂代码之后 再去尝试分析一样这样写代码的优劣。
封装用以实现高内聚,减少与外界的交流,增强可靠性。
继承解决实现重用,减少重复代码。
多态用来实现松耦合,提高程序可扩展性,一般情况下一个对象有多种行为,如果想让它在不同情况下有不同的反应,那就是多态了。
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编程思想