面向对象

来源:互联网 发布:vr照片拍摄软件 编辑:程序博客网 时间:2024/06/10 05:11

面向对象的主要特征主要包括抽象、集成、封装、多态。

组合和继承是代码重用的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






0 0
原创粉丝点击