Java方法覆盖和重载(overload,extends)

[color=darkred][size=large]1.Java重载[/size][/color]
[quote]在Java中,同一个类中的两个或者两个以上的方法可以有同一个名字,只要他们的参数声明不同即可,这种方法被称为重载(overload),方法重载是Java实现多态性的一种方式。[/quote]
1.普通方法重载
当一个重载方法被调用时,Java用参数类型或参数数量来表明实际调用的重载方法的版本。因此每个重载方法的参数或参数数量必须是不同的。虽然每个重载方式可以有不同的返回类型,但返回类型并不足以区分所调用的是哪个方法。
2.当一个重载方法被调用时,Java在调用方法的参数和方法的自变量之间寻找匹配,但是这种匹配并不总是精确的,在一些情况下,Java的自动类型转被也适用于重载方法的自变量。例如:

class OverloadDemo{
void test(){
System.out.println("No parameters");
}

void test(int a,int b){
System.out.println("a and b"+ a + " " + b);
}

void test(double a){
System.out.println("Inside test(double) a :" + a);
}
}

public class Test{
public static void main(String []args){
OverloadDemo ob = new OverloadDemo();
int i = 88;
ob.test();
ob.test(10,30);
ob.test(i);
ob.test(2.343);
}
}


结果自己去运行试试。
3.重载构造函数


[color=darkred][size=large]2.方法覆盖(extends中的方法)[/size][/color]

[quote] 如果在子类中定义一个方法,其名字,返回类型以及参数正好与父类中的某个方法的名字,返回类型以及参数相匹配,那就是:子类的方法覆盖了父类的方法。[/quote]

覆盖方式的约束条件:
[quote](1)子类的方法的名称,参数名和返回类型必须与父类方法的名称,参数名和返回类型一致。[/quote]
以下代码会导致编译错误:
public class Base{
public void method(){..}
}

public class Sub extends Base{
public int method(){
//编译错误,返回类型不一致
return 0;
}
}

[quote](2)子类方法不能缩小父类方法的访问权限,[/quote]
如下错误代码:
 public class Base{
public void method(){
}
}
public class Sub extends Base{
private void method(){
}
}

为什么呢?如果可行的话,将会和Java语言的多态机制发生冲突。

[quote] (3)子类方法不能抛出比父类方法更多的异常。子类方法抛出的异常必须和父类方法抛出的异常相同或只是父类方法抛出的异常类的子类。[/quote]
为什么呢?自己去想哈!还是跟多态有关系的。
这里面有个非常特别的就是RuntimeException,因为即使没有显示声明抛出异常,在默认情况下,都是可以抛出RuntimeException的。
[quote](4)父类的静态方法不能被子类覆盖为非静态方法。[/quote]
[quote](5)子类可以定义与父类的静态方法同名的静态方法,已便在子类中隐藏父类的静态方法,在编译时,必须满座与方法覆盖类似的约束:方法的参数名一致,返回类型一致,不能缩小父类的方法的访问权限,不能抛出更多异常。[/quote]
[quote](6)父类的非静态方法不能被子类覆盖为静态方法。[/quote]
[quote](7)父类私有方法不能被子类覆盖。[/quote]
[quote](8)父类抽象方法可以被子类通过两种途径覆盖:一种是子类实现父类的抽象方法;另一种是子类重新声明父类的抽象方法[/quote]
因为很重要加点实例代码:
public abstract class Base{
abstract void method1();
abstract void method2();
}
public abstract class Sub extends Base{
public void method1(){....}//实现method1方法,并扩大访问权限
public abstract void method2();//重新声明method2方法,仅仅扩大访问权限,但不实现
}

缩小访问权限是错误的,例如:
public abstract class Base{
abstract void method1();
abstract void method2();
}
public abstract class Sub extends Base{
private void method1(){....}
private abstract void method2();
}


(9)父类的非抽象方法可以被覆盖为抽象方法,例如:
public  class Base{
void method();
}
public abstract class Sub extends Base{
public abstract void method(){....}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值