面向对象
2016-03-27 14:14
246 查看
面向对象的主要特征主要包括抽象、集成、封装、多态。
组合和继承是代码重用的2种方式。
组合:在新类中创建原有类的对象,以重复利用已有类的功能。
继承:设计人员根据已有的类来定义一个类的实现。
组合是has a的关系,而继承是is a的关系。
多态主要有2种表现方式(实现机制):方法的重写(覆盖)和方法的重载。
(1)方法的重载:指的是一个类中有多个重名的方法,但这些方法有着不同的参数。因此在编译时就可以确定调用的是哪个方法,是一种编译时多态。重载也可以看做是一个类中的方法的多态性。
(2)方法的覆盖(重写):子类与父类有着相同的签名(函数的方法名,参数类型和个数)时,子类就覆盖了父类的方法。在JAVA中,父类的引用变量既可以指向父类的实例对象,也可以指向子类的实例对象。同样,接口也是如此(可以指向其实现类的实例对象),而程序调用的方法在运行期才动态绑定(绑定:一个方法调用和他的方法主体连接在一起),因此重写属于运行期多态。
(3)区别:重载是通过方法参数的不同来区分的,例如参数个数的不同,类型的不同等等,而不能通过方法的访问权限、返回值类型、抛出的异常类型来进行重载。而对于继承,如果父类的方法声明为private,那么子类无法看到这个方法,因此也无法进行重写(覆盖),此时,子类定义的同签名的方法只是一个新的方法,而不属于覆盖。需要注意的是,只有子类定义的方法的签名和父类相同时才属于覆盖。
(4)覆盖时,父类与子类签名要相同,返回值要相同,抛出的异常要相同,父类中的方法不能声明为private。
需要注意到是对于返回值不同的方法,如果其签名相同,那么编译器是无法区分的,会报编译错误。
例:
上述程序会产生编译错误,因为编译器无法区分父类和子类的f方法,因为他们的签名相同,但是返回值不同。如果改为int,那么会输出,因为虽然是父类引用,但是实际的对象是子类对象,所以使用子类的方法,但是成员变量I 值取决于引用,因为这是在编译期间确定的。(重载是编译时多态,覆盖是运行时多态)。
以上只是个人总结。
解释的比较好的:http://www.cnblogs.com/jiangao/archive/2012/02/22/2363537.html
组合和继承是代码重用的2种方式。
组合:在新类中创建原有类的对象,以重复利用已有类的功能。
继承:设计人员根据已有的类来定义一个类的实现。
组合是has a的关系,而继承是is a的关系。
多态主要有2种表现方式(实现机制):方法的重写(覆盖)和方法的重载。
(1)方法的重载:指的是一个类中有多个重名的方法,但这些方法有着不同的参数。因此在编译时就可以确定调用的是哪个方法,是一种编译时多态。重载也可以看做是一个类中的方法的多态性。
(2)方法的覆盖(重写):子类与父类有着相同的签名(函数的方法名,参数类型和个数)时,子类就覆盖了父类的方法。在JAVA中,父类的引用变量既可以指向父类的实例对象,也可以指向子类的实例对象。同样,接口也是如此(可以指向其实现类的实例对象),而程序调用的方法在运行期才动态绑定(绑定:一个方法调用和他的方法主体连接在一起),因此重写属于运行期多态。
(3)区别:重载是通过方法参数的不同来区分的,例如参数个数的不同,类型的不同等等,而不能通过方法的访问权限、返回值类型、抛出的异常类型来进行重载。而对于继承,如果父类的方法声明为private,那么子类无法看到这个方法,因此也无法进行重写(覆盖),此时,子类定义的同签名的方法只是一个新的方法,而不属于覆盖。需要注意的是,只有子类定义的方法的签名和父类相同时才属于覆盖。
(4)覆盖时,父类与子类签名要相同,返回值要相同,抛出的异常要相同,父类中的方法不能声明为private。
需要注意到是对于返回值不同的方法,如果其签名相同,那么编译器是无法区分的,会报编译错误。
例:
public class Subclass extends Super { int i = 2; public float f() { return 2; } public static void main(String[] args) { Super s = new Subclass(); System.out.println(s.f()); System.out.println(s.i); } } class Super { int i = 1; public int f() { return 1; } }
上述程序会产生编译错误,因为编译器无法区分父类和子类的f方法,因为他们的签名相同,但是返回值不同。如果改为int,那么会输出,因为虽然是父类引用,但是实际的对象是子类对象,所以使用子类的方法,但是成员变量I 值取决于引用,因为这是在编译期间确定的。(重载是编译时多态,覆盖是运行时多态)。
以上只是个人总结。
解释的比较好的:http://www.cnblogs.com/jiangao/archive/2012/02/22/2363537.html
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树