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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 佘天宇 于 2012-10-5 15:15 编辑
  1. package cn.itcast.problem;


  2. class Fu{
  3.         private final void doSomething(){
  4.                 System.out.println("------fu.doSoething()----");
  5.         }
  6.         final void doSomething2(){
  7.                 System.out.println("-------fu.doSomething2()---");
  8.         }
  9.         
  10.         public void doSomething3(){
  11.                 System.out.println("--------fu.doSomething3()----");
  12.         }
  13. }

  14. class Zi extends Fu{
  15.         public final void doSomething(){
  16.                 System.out.println("------zi.doSomething()----");
  17.         }
  18.         
  19.         public void doSomething3(){
  20.                 System.out.println("------zi.doSomething3()----");
  21.         }
  22. }

  23. public class ForFinalTest {

  24.         public static void main(String[] args) {
  25.                 Zi z=new Zi();
  26.                 z.doSomething();
  27.                 z.doSomething2();
  28.                 z.doSomething3();
  29.                
  30. /*        运行结果:
  31. * ------zi.doSomething()----
  32. -------fu.doSomething2()---
  33. ------zi.doSomething3()----

  34.         这子类的doSomething()方法是对父类的复写么,不是说final修饰不可以,
  35.         求解释?
  36.                
  37.                
  38.         */
  39.         }        
  40. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
不是重写,因为父类的方法是private的,子类不能继承父类的私有方法
回复 使用道具 举报
final定义的是最终类,不可以被继承,final修饰的方法不能被覆盖。final定义变量时,就表示这个变量一旦被赋值便不可以被改变,而且对于对象变量来说其引用不可再变。
回复 使用道具 举报
没有被复写,父类中的那个方法是私有的,子类根本就不知道父类有那个方法, 就算子类现在有这个方法那也是子类自己的方法
回复 使用道具 举报

class Fu{
        public final void doSomething(){
                System.out.println("------fu.doSoething()----");
        }
        final void doSomething2(){
                System.out.println("-------fu.doSomething2()---");
        }
        
        public void doSomething3(){
                System.out.println("--------fu.doSomething3()----");
        }
}
class Zi extends Fu{
//此处报编译时异常:Cannot override the final method from Fu,即不能覆盖父类的final方法
        public final void doSomething(){
                System.out.println("------zi.doSomething()----");
        }
        
        public void doSomething3(){
                System.out.println("------zi.doSomething3()----");
        }
}
public class ForFinalTest {
        public static void main(String[] args) {
                Zi z=new Zi();
                z.doSomething();
                z.doSomething2();
                z.doSomething3();
               
/*        运行结果:
* ------zi.doSomething()----
-------fu.doSomething2()---
------zi.doSomething3()----
        这子类的doSomething()方法是对父类的复写么,不是说final修饰不可以,
        求解释?
        */
        }        
}

父类的private方法不能被子类继承,当子类内部再写一个doSomething()方法时,会被认为是新增加的方法,而不是覆盖父类的。
我把楼主的代码修改了一下,就会报编译时异常。如上
final类不能被继承,final方法不能被覆盖


评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
首先,没有被重写。其次,final修饰的确不可以被重写。
由于你代码父类用的是私有的,所以没有被重写。子类是看不到父类有这个方法的。
如果都改成
class Fu{
    public void doSomething(){           
               System.out.println("------fu.doSoething()----");
    }
    final void doSomething2(){
            System.out.println("-------fu.doSomething2()---");
    }
   
    public void doSomething3(){
            System.out.println("--------fu.doSomething3()----");
    }
}

class Zi extends Fu{
    public void doSomething(){            
                       System.out.println("------zi.doSomething()----");
    }
   
    public void doSomething3(){
            System.out.println("------zi.doSomething3()----");
    }
}
这个样子肯定是可以的。

但如果使用final就会报错了。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
你的Fu类 又没有被final修饰   

再者 你    private final void doSomething()
      和
                public final void doSomething()
根本就不是同一个方法,  不是复写的,下面那个 public的是 子类自己的方法

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
上面的都说的很清楚了 呵呵  {:soso_e179:}
回复 使用道具 举报
ok  了  :)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马