黑马程序员技术交流社区

标题: 方法复写时的问题 [打印本页]

作者: yp324    时间: 2013-5-4 12:23
标题: 方法复写时的问题
本帖最后由 yp324 于 2013-5-4 22:43 编辑

子类在覆盖父类方法时,其子类的方法访问权限要大于等于父类的方法访问权限。如果现在将父类的一个方法定义为private访问权限,在子类中将该方法定义为default访问权限,那么这样还叫做复写吗?能否用代码举例说明下


作者: 李志敏    时间: 2013-5-4 13:34
这样应该不叫复写 因为你父类中方法用private修饰 之后这个方法只在父类中可以使用 子类是看不到这个方法的 子类再定义一个方法就跟父类没有关系 是子类特有的方法 是完全独立的 并且跟它的修饰符也没有关系
作者: 不喝茶的陆羽    时间: 2013-5-4 14:00
本帖最后由 不喝茶的陆羽 于 2013-5-4 14:20 编辑

我觉得,你的想法方向是对的,子类的访问修饰符的限制要不低于(因为相同也行)父类,所以,父类是default,子类是public是可以的,但是父类是private就不行了,因为子类虽然可以继承子类私有成员,但是却不能访问,连访问都不行,就更不能复写了,也无法实现多态。
作者: 不喝茶的陆羽    时间: 2013-5-4 14:07
这个参考下吧

重写的主要优点是能够定义某个子类特有的特征:
       如:
    public class Father
    {
             public void speak()
             {
               System.out.println("Father");
             }                  
    }
   public class Son extends Father
    {
             public void speak()
             {
               System.out.println("son");
             }                  
    }
这也叫做多态性,重写方法只能存在于具有继承关系中,重写方法只能重写父类非私有的方法,
  

    当上例中 Father类 speak()方法被private时,Son类不能重写 Father类 speak()方法,此时Son类 speak()方法相当与在Son类中定义的一个speak()方法.
Father类 speak()方法一但被final时,无论该方法被public,protected及默认所修饰时,Son类根本不能重写 Father类 speak()方法,试图编译代码时,编译器会报错.例:
   public class Father
    {
          fianl   public void speak()
             {
               System.out.println("Father");
             }                  
    }
   public class Son extends Father
    {
             public void speak()
             {
               System.out.println("son");
             }                  
    }//编译器会报错.
   
    Father类 speak()方法被时默认修饰时,只能在同一包中,被其子类被重些,如果不在同一包则不能重写.
    Father类 speak()方法被时protoeted时,不仅在同一包中,被其子类被重些,还可以不同包的子类重写.
  

     重写方法的规则:
      1.参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.
    2.返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载.
      3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
    4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常.例如,
父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常.


    而重载的规则:
1.必须具有不同的参数列表;
2.可以有不同的返回类型,只要参数列表不同就可以了;
3.可以有不同的访问修饰符;
4.可以抛出不同的异常;


    重写和重载的区别在于:

     重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值.

用好重写和重载可以设计一个结构清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般.

作者: 不喝茶的陆羽    时间: 2013-5-4 14:21
public class Base
    {
        void test(int i)                       //此处也可以是楼主所说default,下面子类用public;或是子父类也可以都是public
        {
            System.out.print(i);
        }
        void test(byte b)
        {
            System.out.print(b);
        }
    }
    public class TestOverriding extends Base
    {
        void test(int i)
        {
            i++;
            System.out.println(i);
        }
          public static void main(String[]agrs)
        {
            Base b=new TestOverriding();
            b.test(0)
            b.test((byte)0)
        }
    }

作者: yp324    时间: 2013-5-4 17:34
谢谢大家的回复 让我这个菜鸟知道了不少  对了  怎样将问题的状态改成已解决
作者: 江大海    时间: 2013-5-4 17:52
不叫复写,你private之后你之类都不知道你有那个方法,谈何复写,还有该为已解决的办法是,打开你发的帖子,点击编辑,然后左上角有个一个该帖子分类的
作者: 不喝茶的陆羽    时间: 2013-5-4 21:09
@曹睿翔 版主写了这么多,有没有点辛苦分啊...
作者: HM汪磊    时间: 2013-5-4 21:18
不喝茶的陆羽 发表于 2013-5-4 21:09
@曹睿翔 版主写了这么多,有没有点辛苦分啊...

给你加拉2技术分!!!!
作者: 不喝茶的陆羽    时间: 2013-5-4 21:20
HM汪磊 发表于 2013-5-4 21:18
给你加拉2技术分!!!!

哦,谢谢版主啦~
作者: 曹睿翔    时间: 2013-5-4 23:20
如果问题解决请再次编辑,修改为已解决,若还有疑问,请继续追问
作者: 曹睿翔    时间: 2013-5-4 23:21
HM汪磊 发表于 2013-5-4 21:18
给你加拉2技术分!!!!

磊哥很给力吧,那啥,你的回复也才是毛毛雨,都没人给我加技术分了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2