黑马程序员技术交流社区

标题: 在父类中被定义为private final 的方法似乎可以被子类覆盖? [打印本页]

作者: 彭彪    时间: 2013-9-23 12:38
标题: 在父类中被定义为private final 的方法似乎可以被子类覆盖?
本帖最后由 彭彪 于 2013-9-24 20:10 编辑
  1. package com.study;

  2. class Parents{
  3.         private final void doit(){
  4.                 System.out.println("父类.doit()");
  5.         }
  6.         final void doit2(){
  7.                 System.out.println("父类.doit2()");
  8.         }
  9.         public void doit3(){
  10.                 System.out.println("父类.doit3()");
  11.         }
  12. }
  13. class Sub extends Parents{
  14.         public final void doit(){        //在子类中定义一个doit()方法
  15.                 System.out.println("子类.doit()");
  16.         }
  17. //        final void doit2(){                //final方法不能覆盖
  18. //                System.out.println("子类.doit2()");
  19. //        }
  20.         public void doit3(){
  21.                 System.out.println("子类.doit3()");
  22.         }
  23. }
  24. public class FinalMethod {
  25.         public static void main(String[] args) {
  26.                 Sub s = new Sub();        //实例化
  27.                 s.doit();        //调用doit()方法
  28.                 Parents p = s;        //执行向上转型操作
  29. //                p.doit();        //不能调用private方法
  30.                 p.doit2();
  31.                 p.doit3();
  32.         }

  33. }
复制代码
从实例可以看出,final 方法不能被覆盖,例如,doit2()方法不能在子类中被重写,但在父类中定义了一个private final 的doit()方法,同时在子类中也定义了一个doit()方法?

搜狗截图20130923123107.png (58.03 KB, 下载次数: 61)

搜狗截图20130923123107.png

作者: yangxin540    时间: 2013-9-23 12:54
哥们,这肯定不行呀,不能覆盖,这就是两个方法而已,你不行你给子类那个方法上加上@Override
作者: lizhangzhi    时间: 2013-9-23 13:13
子类中的doit()方法,是子类的一个特有方法,不是覆盖父类的doit()方法,把父类doit()前的private 改成public,这是子类覆盖父类的doit()方法,编译就不能通过了;
作者: jìng╮煜    时间: 2013-9-23 14:04
哥们,private你就当他是隐身宝石就行. 只在本类中能被调用.所以除了本类的话,其他类是看不到的.
作者: wrswuxiaoyan    时间: 2013-9-23 16:47
public class FinalMethod {

        public static void main(String[] args) {

                Sub s = new Sub();        //实例化

                s.doit();        //调用doit()方法,这里输出的结果是“父类.doit()");”

                Parents p = s;        //执行向上转型操作

//                p.doit();        //不能调用private方法

                p.doit2();

                p.doit3();

        }



}

Sub类的doit()方法并不能覆盖父类Parents的doit()方法,这两个doit()方法之间并不存在覆盖关系。由于,父类Parents的doit()方法是private的,JVM首先在sub实例对象时无法找到匹配的doit()方法,所以就直接调用其父类的doit()方法。

不光是private的方法不能重载,static, final都不能重载


作者: 暮雨    时间: 2013-9-23 18:31
这样解释吧,带有private的父类doit方法,应该看作是父类私有的方法,不存在覆盖的问题,因为你根本看不到。而没有加private修饰的doit2默认是friend限制级别,可以覆盖,所以在子类中写doit2方法编译不通过。
作者: chensc    时间: 2013-9-24 09:15
学习学习!




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