论坛首页 入门技术论坛

谁能说说为什么要同时protect和final一起使用

浏览 8695 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-02-01  
OO
   大都数框架的日志器都声明为以下的形式:
  
protected final Log logger = LogFactory.getLog(getClass())

   (注:这是Spring使用的声明方式
   既然是final就是说明不能够被覆盖,而protected则是希望被子类覆盖,这两者本来就是
矛盾的东西,那为什么还要在一起声明呢?这种设计意欲何为呢?有没有人可以解答一下。
   当然还有一些其它的形式如:
   private static Logger logger = Logger.getLogger(UserManager.class);

   或:
   protected Log log = LogFactory.getLog(this.getClass());

   这两种形式为什么不好,他们错在什么地方呢?
  
   发表时间:2007-02-01  
用protected并不是一味希望子类来覆盖它,或许还希望子类能够直接访问它。
0 请登录后投票
   发表时间:2007-02-01  
>protected则是希望被子类覆盖
你误解了protected的意思,它只是希望不被子类修改,但是可以访问.
0 请登录后投票
   发表时间:2007-02-01  
子类可以访问的内部常量
0 请登录后投票
   发表时间:2007-02-01  
foxty 写道
用protected并不是一味希望子类来覆盖它,或许还希望子类能够直接访问它。

   嗯,有道理!abstract是希望被覆盖,而protected有两个层面的意思,既可能是希望子类覆盖(扩展功能),也可能希望子类直接访问。
   我发现final的方法是不可以在子类中重写的,但是protect final的变更却可以在子类中重写,不知道为什么会这样?
0 请登录后投票
   发表时间:2007-02-01  
stamen 写道
foxty 写道
用protected并不是一味希望子类来覆盖它,或许还希望子类能够直接访问它。

   嗯,有道理!abstract是希望被覆盖,而protected有两个层面的意思,既可能是希望子类覆盖(扩展功能),也可能希望子类直接访问。
   我发现final的方法是不可以在子类中重写的,但是protect final的变更却可以在子类中重写,不知道为什么会这样?
你是说final的方法不可以重写(overload)还是覆盖(override)?重写是可以的,覆盖是不行的。

另外你后面说的是变量重写还是什么?protectd final变量只是表示这个变量不能被更改,并不是不允许被覆盖的。
0 请登录后投票
   发表时间:2007-02-01  
foxty 写道

  你是说final的方法不可以重写(overload)还是覆盖(override)?重写是可以的,覆盖是不行的。
另外你后面说的是变量重写还是什么?protectd final变量只是表示这个变量不能被更改,并不是不允许被覆盖的。

  如Parent中定义了一个final的方法和成员变量:
 public class Parent {
   protected  final Logger logger = Logger.getLogger(getClass());
   protected  final void test1(){...}
   }

子类可以定义为:
import org.apache.log4j.Logger;
public class Child extends Parent {
   protected  Logger logger = Logger.getLogger(getClass());//这儿不会报错,正常
}

而却不能定义为:
import org.apache.log4j.Logger;
public class Child extends Parent {
    protected  final void test1(){...} //会报错,说不能覆盖父类的final方法
}

  是不是final对方法和成员变量采用了不同的策略,另外,我觉得覆盖和重写是相同意思的不同表达,foxty以为然否?

0 请登录后投票
   发表时间:2007-02-01  
override 指子类重新定义和超类中的方法.
overload 指同一个类中同名方法的不同定义
0 请登录后投票
   发表时间:2007-02-01  
stamen 写道
foxty 写道

  你是说final的方法不可以重写(overload)还是覆盖(override)?重写是可以的,覆盖是不行的。
另外你后面说的是变量重写还是什么?protectd final变量只是表示这个变量不能被更改,并不是不允许被覆盖的。

  如Parent中定义了一个final的方法和成员变量:
 public class Parent {
   protected  final Logger logger = Logger.getLogger(getClass());
   protected  final void test1(){...}
   }

子类可以定义为:
import org.apache.log4j.Logger;
public class Child extends Parent {
   protected  Logger logger = Logger.getLogger(getClass());//这儿不会报错,正常
}

而却不能定义为:
import org.apache.log4j.Logger;
public class Child extends Parent {
    protected  final void test1(){...} //会报错,说不能覆盖父类的final方法
}

  是不是final对方法和成员变量采用了不同的策略,另外,我觉得覆盖和重写是相同意思的不同表达,foxty以为然否?



你该温习温习java的基础知识了,final用在类前,表示这个类不允许被继承,用在方法前表示方法不能被override,用在属性前面则表示这个属性是不可更改的。
0 请登录后投票
   发表时间:2007-02-01  
引用
你该温习温习java的基础知识了,final用在类前,表示这个类不允许被继承,用在方法前表示方法不能被override,用在属性前面则表示这个属性是不可更改的。

   呵呵,确实啊,基础的东西都有点忘了,  现在明白了,谢谢!!
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics