2关于覆盖:
首先覆盖是继承关系的基础上的一种语法现象。
覆盖的本质是改变基类的方法的处理。
为什么会出现继承呢?因为想让子类拥有基类的方法。如果子类覆盖这些方法的时候改变了可视性(private,public),
那么会怎么样呢?思考:如果子类1把基类的public方法修改成private,那么其子类就看不到这个方法了,对吧。这与
继承的宗旨是不符的。试着想想,如果允许缩小可视范围的话,一个定义了丰富方法的基类,子类继承了他的方法,有一天
他的子类却什么方法都没有了(所有方法都被缩小可视范围了),这个子类就没有任何意义了,和基类也脱离关系了。
所以,第一点就是子类覆盖方法的时候不能缩小该方法的可视范围。
其次,什么样的方法才叫覆盖了基类的方法呢?这里很有必要说一下,本来挺简单的东西,就是方法名,参数,返回值
类型都相同的方法。如果子类方法的方法名,参数名都和基类的某个方法一样,那么没有选择,它就是覆盖,这回他要
遵守覆盖的全部规矩。如果参数不同,那么还有的商量,它是重载。
最后,但这就够了吗?加上第一点。还有就是不能自己添加throws.基类有,子类的方法可以去掉仍然是覆盖。
为什么允许子类可以去掉throws呢?但是基类方法没有throws的时候却不能添加throws呢?
想想这是为什么?其实很简单,就是为了不让已经写完的程序出错。
class parent{
public void f() throws Exception{... }
}
class child extends parent{
public void f() {... }
}
child obj = new child();
parent hold = obj.
try{
hold.f();//看,子类方法去掉也不会出错。用不着修改所有程序代码
}catch( Exception e){}
但是,如果是这样的,就会出错了:
class parent{
public void f() {... }
}
class child extends parent{
public void f() throws Exception{... }//java编译器不允许。
}
child obj = new child();
parent hold = obj.
hold.f();//本来是不跑出异常,子类覆写了,当然掉用子类方法,这回抛出异常了。而设计的时候是按照没有跑出异常
//设计的。所以这个子类创造出来了之后需要修改代码,加上try{}catch{}代码
//所以java编译器不允许子类在基类方法没有throws,添加throws。
3,什么叫重载,就是又定义了一个新的方法,和原来的方法差不多,又必须有些不同。哪差不多呢?就是同一个方法名称。
其他的都可以不同。哪些必须有些不同?最起码参数得不同。
可以是一个类里定义了不少这样的方法,也可以是在子类里定义了这样的方法。
参数如果不同就别提什么重载了,其他什么都可以不同,也可以相同。不就是又定义了一个方法吗?没有什么新鲜的。
4,覆盖或者重载的调用问题。
调用一个方法他使用的到底是哪个方法呢?对于覆盖来说,既然子类覆盖了基类的方法,当然子类对象的该方法调用的
就是刚刚覆盖的方法了。要不然,覆盖干啥?
对于重载,既然参数不同,那么肯定要根据参数来定具体掉哪个方法了!
重载还有中情况就是传入的参数有几个方法都适用,例如f(1) , f(byte a) ,f( int a) ,f(float a),f(double a)
都是可以的,那么调用谁? 调用参数级别最高的,
例如传入1,调用整数里级别最高的,f( int a)
传入1.1 调用实数里级别最高的,f( double a
(和官场很相似啊!呵呵)
首先覆盖是继承关系的基础上的一种语法现象。
覆盖的本质是改变基类的方法的处理。
为什么会出现继承呢?因为想让子类拥有基类的方法。如果子类覆盖这些方法的时候改变了可视性(private,public),
那么会怎么样呢?思考:如果子类1把基类的public方法修改成private,那么其子类就看不到这个方法了,对吧。这与
继承的宗旨是不符的。试着想想,如果允许缩小可视范围的话,一个定义了丰富方法的基类,子类继承了他的方法,有一天
他的子类却什么方法都没有了(所有方法都被缩小可视范围了),这个子类就没有任何意义了,和基类也脱离关系了。
所以,第一点就是子类覆盖方法的时候不能缩小该方法的可视范围。
其次,什么样的方法才叫覆盖了基类的方法呢?这里很有必要说一下,本来挺简单的东西,就是方法名,参数,返回值
类型都相同的方法。如果子类方法的方法名,参数名都和基类的某个方法一样,那么没有选择,它就是覆盖,这回他要
遵守覆盖的全部规矩。如果参数不同,那么还有的商量,它是重载。
最后,但这就够了吗?加上第一点。还有就是不能自己添加throws.基类有,子类的方法可以去掉仍然是覆盖。
为什么允许子类可以去掉throws呢?但是基类方法没有throws的时候却不能添加throws呢?
想想这是为什么?其实很简单,就是为了不让已经写完的程序出错。
class parent{
public void f() throws Exception{... }
}
class child extends parent{
public void f() {... }
}
child obj = new child();
parent hold = obj.
try{
hold.f();//看,子类方法去掉也不会出错。用不着修改所有程序代码
}catch( Exception e){}
但是,如果是这样的,就会出错了:
class parent{
public void f() {... }
}
class child extends parent{
public void f() throws Exception{... }//java编译器不允许。
}
child obj = new child();
parent hold = obj.
hold.f();//本来是不跑出异常,子类覆写了,当然掉用子类方法,这回抛出异常了。而设计的时候是按照没有跑出异常
//设计的。所以这个子类创造出来了之后需要修改代码,加上try{}catch{}代码
//所以java编译器不允许子类在基类方法没有throws,添加throws。
3,什么叫重载,就是又定义了一个新的方法,和原来的方法差不多,又必须有些不同。哪差不多呢?就是同一个方法名称。
其他的都可以不同。哪些必须有些不同?最起码参数得不同。
可以是一个类里定义了不少这样的方法,也可以是在子类里定义了这样的方法。
参数如果不同就别提什么重载了,其他什么都可以不同,也可以相同。不就是又定义了一个方法吗?没有什么新鲜的。
4,覆盖或者重载的调用问题。
调用一个方法他使用的到底是哪个方法呢?对于覆盖来说,既然子类覆盖了基类的方法,当然子类对象的该方法调用的
就是刚刚覆盖的方法了。要不然,覆盖干啥?
对于重载,既然参数不同,那么肯定要根据参数来定具体掉哪个方法了!
重载还有中情况就是传入的参数有几个方法都适用,例如f(1) , f(byte a) ,f( int a) ,f(float a),f(double a)
都是可以的,那么调用谁? 调用参数级别最高的,
例如传入1,调用整数里级别最高的,f( int a)
传入1.1 调用实数里级别最高的,f( double a
(和官场很相似啊!呵呵)