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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 yi岁⑨很乖❤ 于 2015-4-13 21:02 编辑

【注】这个我自己总结的一篇【OverLoad重载与Override重写】的博客,博客地址是:http://blog.csdn.net/yecjl/article/details/44783199
我这里直接将内容贴出来给大家看了,希望大家来围观,如果写得不好,请多多见谅哦~

一. 函数的重载

       在同一个类中,允许存在一个以上的同名函数,参数个数或者参数类型不同的同名函数就叫做重载。重载的特点:与返回值无关,只看参数列表。
       当定义的功能相同,但参与运算的未知内容不同,那么,就定义一个相同的函数名称以表示其功能,方便阅读,而通过参数列表的不同来区分多个同名函数。

示例:

  1. public static void main(String[] args)
  2. {
  3.     add(4,5);
  4.     add(4,5,6); //通过参数个数来区分调用哪个函数
  5. }
  6. public static int add(int a, int b)
  7. {
  8.     return a+b;
  9. }
  10. public static int add(int a, int b)
  11. {
  12.     return a+b+c;
  13. }
复制代码


示例: 构造函数的重载:一个类能产生多个对象,而这些对象又可以去调用不同的初始化对象。

  1. class Person
  2. {
  3.     private String name;
  4.     public Person(){}
  5.     public Person(String name)
  6.     {
  7.         this.name = name;
  8.     }
  9.     public static void main(String[] args)
  10.     {
  11.         new Person();
  12.         new Person("name"); //可以调用不同的初始化对象
  13.     }
  14. }
复制代码


< 练 习 >给定一个函数,比较下面有没有和它重载

  1. void show(int a, char b, double c){}//原函数

  2. //[a]
  3. void show(int x, char y, double z){} //没有,因为和原函数一模一样

  4. //[b]
  5. int show(int a, double c, char b){}//重载了,因为参数类型不同,注意:重载和返回值类型无关,参数也是有顺序的

  6. //[c]
  7. void show(int a, double c, char b){} //重载了,参数是有顺序的

  8. //[d]
  9. boolean show(int c, char b){} //重载了,因为参数个数不同

  10. //[e]
  11. void show(double c){} //重载了,因为参数个数不同

  12. //[f]
  13. double show(int x, char y, double z){} //没有,参数一样,返回值虽然不同,但是不是重载,并且这个函数不允许和给定的函数
复制代码


二. 函数的重写 (覆盖)

1. 类
      当子类出现和父类一模一样的函数时,如同父类的函数被覆盖一样,这是函数的另一个特性:重写。(父类方法还在内存中,只是没有运行)
       当子类继承父类,沿袭了父类的功能到子类中,但是子类虽具备该功能,但是功能的内容却和父类不一致,这时没有必要定义新的功能,而是使用覆盖特性保留父类的功能定义并重写功能内容。

( 1 ) 子类覆盖父类:

        <1>. 必须保证子类权限大于等父类权限,才可以覆盖,否则编译失败。【注】默认权限介于私有private和公有public之间。
        <2>. 父类方法私有时,不是重写。因为子类都不知道父类有此方法,子类定义了同名函数只是定义了子类自己的方法。

示例:

  1. class Parent
  2. {
  3.     private void show(){}
  4. }
  5. class Son extends Person
  6. {
  7.     public void show(){} //此处子类并没有重写父类的方法
  8. }
复制代码


       <3>.子类要覆盖父类,必须与父类的方法一模一样,包括返回值类型。

( 2 ) 静态方法只能覆盖静态方法:因为静态是优先存在于对象的存在

( 3 ) 父类中的构造函数不能被重写:

        <1>. 在子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句super();它会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super()。(隐式super()是Java虚拟机加上的)

        <2>. 为什么子类一定要访问父类中的构造函数?
      因为父类中的数据,子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的,所以子类对象在初始化时要先访问一下父类中的构造函数,如果要访问父类中的指定的构造函数,可以通过手动定义super(参数)的方式来指定。

实例:手动定义super()

  1. class Parents
  2. {
  3.     private String name;
  4.     public Parents(){}
  5.     public Parents(String name)
  6.     {
  7.         this.name = name;
  8.     }
  9. }
  10. class Son extends Parents
  11. {
  12.     public Son()
  13.     {
  14.         super("name"); //指定调用父类带参数构造方法
  15.     }
  16. }
复制代码


       <3>. this()和super()在同个子类构造函数中不能并存,所以都需要放第一行,也就是要先做初始化动作。子类的构造函数第一行也可以手动指定this()语句来访问本类中的构造函数,但是子类中至少有一个构造函数会访问父类中的构造函数。

实例:子类指定this(),但至少一个构造函数调用super()

  1. class Son extends Parents
  2. {
  3.     public Son()
  4.     {
  5.         this("name"); //指定调用子类带参数构造方法
  6.     }
  7.     public Son(String name)
  8.     {
  9.         super("name"); //指定调用父类带参数构造方法
  10.     }
  11. }
复制代码


( 4 ) 被final修饰的方法不能被重写

2. 抽象类
       抽象类中的抽象方法要被使用,必须有子类重写其所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。

示例:

  1. abstract class Student
  2. {
  3.     abstract void study();
  4.     abstract void say();
  5. }
  6. abstract class BestStudent() extends Student //BestStudent类仍然是抽象类
  7. {
  8.     void study(){}
  9.     abstract void say();
  10. }
复制代码


3. 接口
       (1). 接口需要被子类实现,子类对接口中的抽象方法全部覆盖后,子类才可以实例化,否则子类是一个抽象类。
       (2). 接口中的成员都有固定的修饰符:
                常量:public static final
                方法:public abstract
        在子类重写父类方法时,其权限必须大于父类权限,所以子类方法必须用public修饰。

示例:

  1. interface Parents
  2. {
  3.     int NUM = 3; //常量的修饰为public static final
  4.     void show(); //方法的修饰为public abstract
  5. }
  6. class Son implements Parents
  7. {
  8.     public void show(){};
  9. }
复制代码


4. 多态
多态的前提:必须是类与类之间有关系,要么继承,要么实现。通常还有一个前提:存在覆盖。

示例:

  1. abstract class Student
  2. {
  3.     public abstract void study();
  4.     public void sleep()
  5.     {
  6.         System.out.println("student is sleeping");
  7.     }
  8. }
  9. class BestStudent extends Student
  10. {
  11.     public void study()
  12.     {
  13.         System.out.println("bestStudent is studying");
  14.     }
  15.     public void sleep()
  16.     {
  17.         System.out.println("bestStudent is sleeping");
  18.     }
  19. }
  20. class DoStudent //工具类
  21. {
  22.     public void dosome(Student stu)
  23.     {
  24.         stu.study();
  25.         stu.sleep();
  26.     }
  27. }
  28. class Demo
  29. {
  30.     public static void main(String[] args)
  31.     {
  32.         DoStudent d = new DoStudent();
  33.         d.dosome(new BestStudent());
  34.     }
  35. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1 很给力!

查看全部评分

11 个回复

正序浏览

恩恩  是啊
只是在北方念的大学
回复 使用道具 举报
自学小番薯 发表于 2015-4-4 17:26
深圳   北京对于南方人来说太远

你也是南方人?
回复 使用道具 举报
yi岁⑨很乖❤ 发表于 2015-4-4 11:58
打算去北京呢,你 呢?

深圳   北京对于南方人来说太远
回复 使用道具 举报
自学小番薯 发表于 2015-4-4 10:39
妹子准备去北京还是深圳培训啊?

打算去北京呢,你 呢?
回复 使用道具 举报

妹子准备去北京还是深圳培训啊?
回复 使用道具 举报
田晓莉 发表于 2015-4-3 20:04
写的很好~赞一个。第一个练习就是判断是否重载的那个,d:void boolean show ``````是不是写重了,这样倒是 ...

恩呢,是错多写了返回类型,我改了,应该是boolean show, 谢谢哦!
回复 使用道具 举报
写的很好~赞一个。第一个练习就是判断是否重载的那个,d:void boolean show ``````是不是写重了,这样倒是返回还是不返回~~~
回复 使用道具 举报
自学小番薯 发表于 2015-4-2 00:24
妹子写得不错   挺仔细
喜欢心细的妹子

谢谢,共同进步
回复 使用道具 举报
赞一个!!!!!!
回复 使用道具 举报
赞一个!!!!!!
回复 使用道具 举报
妹子写得不错   挺仔细
喜欢心细的妹子
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马