A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王龙 中级黑马   /  2012-11-14 19:01  /  2339 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天看了一点视频,是关于复写的,但是怎么也想不起什么时候学的了,请教大伙,给个概念,要是有例了就更好了

9 个回复

倒序浏览
重写(覆盖)父类方法
  子类中写的方法,与父类中的方法:返回值类型、方法名称、参数列表相同,这才是重写。
JDK5.0之后,Java允许重写父类方法时,可以返回更加严格的类型。
  public Employee fun() {} – 父类
  public Manager fun() {} – 子类
  因为子类方法返回的是Manager,而且Manager是Employee的子类,那么就可以。
  
子类重写父类方法时,访问修饰符,只能越来越宽松,而不能更严谨。
  例如:如果父类的方法访问修饰是public,那么子类只能也是public
  如果父类的方法访问修饰是protected,那么子类可以是protected,或者是public
  如果父类的方法访问修饰是默认(包访问级别),那么子类可以是默认、protected,或者是public。
  
子类可以声明的异常,只能在父类声明异常的范围之内。还没学异常!
  
  private 方法不能重写
静态方法不能重写
属性不能重写
只有实例方法能重写
private方法不能重写;
static方法不能重写(编译可以通过),就算重写了,也没有什么多态一说。
final方法不能重写,重写就编译不通过
其它就可以重写了。
属性不能重写
  属性没有重写一说!子类可以有和父类同名的属性!但没有重写的特性!

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
复写简单点所就是父类中定义一个方法,子类继承父类,默认是也会继承其相应的方法,但是如果父类中的方法不和我们的要求,可以在子类中对父类的这个方法进行重新描述。
回复 使用道具 举报
复写也称为覆盖或重写,需满足以下条件才能称之为复写:
1、在具有父子关系的两个类当中;
2、父类和子类各有一个函数,这两个函数的定义(返回值类型、函数名和参数列表)完全相同复写一般用于:当对继承的父类的函数的功能不太满意的时候,来使用复写这种方式来修父类的方法。
复写与重载的区别,重载满足的条件是:
函数名相同,参数列表不同,并且在一个类里面。
子类可以继承父类的方法,也可以复写父类的方法. 但复写父类的方法有一个基本的前提: 所复写的方法
不能有比父类方法更严格的访问权限. (访问权限 public > default > private)
class A
{
public void fun1(){}
}
class B extends A
{
public void fun1(){}
}//fun1被它的子类复写了

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
对继承了的父类方法进行重新定义方法体
回复 使用道具 举报
复写发生在继承机制中 只有有了继承才可能有复写
  1. public class A
  2. {
  3.     public void  run()
  4.     {System.out.println("ni hao");}
  5. }
  6. public class B extends A
  7. {
  8. public void run()
  9. {System.out.println("hello");}
  10. }
复制代码
这样B类就覆盖了A类的run()方法  这就是重写

评分

参与人数 1技术分 +1 收起 理由
杨千里 + 1

查看全部评分

回复 使用道具 举报
覆写,也叫覆盖或重写.如果一个父类有一个方法名为test,在他的子类里也写一个方法名字也是test,两个方法返回类型和参数都相同,但是方法体不同.

也就是说,覆写指的是不同的类中(父类方法,子类覆写)有两个或多个返回类型,方法名,参数都相同,但是方法体不同的方法

另外,超载指的是覆盖,也就是覆写.过载则和重载同一概念
回复 使用道具 举报
本帖最后由 曾观富 于 2012-11-15 12:22 编辑

复写(override):一个实例方法可以overide在其超类中可以访问到的具有相同签名的所有方法,从而可以动态分派(dynamic dispatch)

VM基于运行时类型来选择要调用的覆写方法。
  1. <font size="2" face="Tahoma">class Base {  
  2.     public void f() {  
  3.     }  
  4. }  
  5.   
  6. class Derived extends Base {  
  7.     public void f() {  
  8.     } // overrides Base.f()  
  9. }</font>
复制代码
复写的特性为:
1、方法名、参数、返回值相同。
2、子类方法不能缩小父类方法的访问权限。
3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
4、存在于父类和子类之间。
5、方法被定义为final不能被重写。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
不太清楚你说的复写说的是 “重载”还是“覆盖

重载: 举个例子,比如类的构造方法,有无参构造,有多参构造。通过这样起到什么样的作用呢,让同一个方法名能够通过传递给它的参数决定做什么样的事情。 同一个方法名,编译器怎么能知道你想要调用的是哪一个呢,这就要通过给方法设置不同的参数列表来实现了。比如不同的参数类型,不同的参数个数等(但要注意可变参数列表情况) 重载一般是出现在同一个类里,继承来的方法当然也能重载,但是要注意父类的private方法,private方法你根本没有继承到,所以重载就无从谈起了,那是只是另外一个全新的方法。

覆盖: 举个例子,比如toString();方法 上帝类object中的方法。我们在自己的测试小程序中都经常会去覆盖它。用于在system.out.print();中直接使用对象引用,打印我们想要它打印的东西。打印什么东西取决于你对toString();方法体覆盖。覆盖时除了方法的权限可以变大和方法体重写了意外 其他标志都不允许改变。 比如 父类中有个 protected String toString(){//方法体},如果你想覆盖它就必须 [protected|public] String toString(){//重写的方法体}
覆盖方法时 权限只能变大或者不变。
继承抽象类,和实现接口中 方法类似,就不累述了。



评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼主,是覆写而非复写,两个词的含义有区别的哦。Java中覆写是当子类继承父类,子类沿袭父类的功能。有时子类虽然具备该功能,但是功能的内容和父类不一样时侯,这时也不必要再去定义新的功能,而是使用Java在多态中的特性覆写来完成功能的操作,保留父类的功能(即使函数代码块)而重写父类的功能在子类功能中,这样就是覆写的原理。但覆写有几点需要注意的:
1.子类覆盖父类,必须保证子类权限大于等于父类的权限,才可以覆盖,不然编译会失败的。
2.而且之类的静态功能只能覆盖父类静态的功能。
3.最显著的是要子类定义的功能要和父类的功能一模一样,包括返回值。
4.还有就是成员变量之间不能被覆盖。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马