Overload和Override的区别?

Overload和Override的区别?Overload的方法是否可以改变返回值的类型?

    Overload是重载的意思,Override是覆盖的意思,也就是重写。

    重载Overload:在同一个类中,允许存在一个以上的同名函数,只要他们的参数个数或者参数类型不同即可。

    重载的特点:与返回值类型无关,只看参数列表。

    重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中定义的方法,这相当于把父类中定义的那个完全相同的方法给覆盖掉了,这也是面向对象编程的多态的一种表现。子类覆盖父类方法时只能抛出父类的异常或者异常的子类或者父类异常的子集,因为子类可以解决父类的一些问题,但不能比父类有更多的问题。还有,子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,则子类中根本不存在覆盖,即子类中和父类的private的同名的方法没有覆盖的关系,因为private的访问权限只限于同一类中,而子类就不会访问到private的方法,所以是子类中增加的一个全新的方法。

    重载overload的特点就是与返回值无关,只看参数列表,所以重载的方法是可以改变返回值类型的。所以,如果两个方法的参数列表完全一样,是不能通过让他们的返回值类型不同来实现重载的。我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用map.remove(key)方法时,虽然remove方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。

 

short s1=1; s1=s1+1;有什么错?

short s1=1;s1+=1;有什么错?

    对于前者,由于s1+1运算时会自动提升表达式的类型,所以结果是int类型,再赋值给short类型s1时,编译器会将报告需要强制转换类型的错误。

    对于后者,由于+=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正常编译。

    补充:当一个java算数表达式中包含多个基本类型的数据时,整个算数表达式的类型将发生自动类型提升。java定义的如下自动提升规则:

            1.所有的byte型、short型和char型将被提升为int型。

            2.整个算数表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。操作数的等级排列如下图所示,位于箭头右边类型的等级高于位于箭头左边类型的等级。

             注:如果想把结果赋值给较小的类型,就必须使用类型转换(既然把结果赋给了较小的类型,就可能出现信息丢失)。

 

构造器Construct是否可被Override?

    构造器不能被继承,因此不能被重写Override,但可以被重载Override。

    补充:继承——子父类中的构造函数的特点:

            在子类构造对象时发现,访问子类构造函数时,父类也运行了。为什么呢?

            原因是:在子类的构造函数第一行有一个默认的隐式语句:super();

                       super();//调用的是父类中的空参数的构造函数。

            子类实例化过程:子类中所有的构造函数默认都会访问父类中的空参数的构造函数。

            为什么子类实例化的时候要访问父类中的构造函数呢?

            因为子类继承父类,获取了父类中的内容(属性),所以在使用父类内容之前,要先看父类是如何对自己的内容进行初始化的。所以子类在构造对象时,必须访问父类中的构造函数。为了完成这个必须的动作,就在子类的构造函数中加入了super()。

            如果父类中没有定义空参数构造函数,那么子类的构造函数必须用super明确要调用父类中的哪个构造函数。

    注意:super语句必须要定义在子类构造函数的第一行。因为父类的初始化动作要先完成。

            通过super()初始化父类内容时,子类的成员变量并未显示初始化,等super()父类初始化完毕后,才进行子类成员的显示初始化。

   

接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可以继承具体类?抽象类中是否可有静态的main方法?

        接口可以继承接口

        抽象类可以实现接口

        抽象类可以继承实体类,但和实体类的继承一样,也要求父类可继承,并且拥有子类可以访问到的构造器。

        抽象类中可以有静态的main方法。

     其实,抽象类和普通类的唯一区别就是不能创建实例对象和允许有abstract方法。

posted @ 2014-02-26 16:24  我是大嘴猴  阅读(21373)  评论(0编辑  收藏  举报