该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-02-01
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()); 这两种形式为什么不好,他们错在什么地方呢? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-02-01
用protected并不是一味希望子类来覆盖它,或许还希望子类能够直接访问它。
|
|
返回顶楼 | |
发表时间:2007-02-01
>protected则是希望被子类覆盖
你误解了protected的意思,它只是希望不被子类修改,但是可以访问. |
|
返回顶楼 | |
发表时间:2007-02-01
子类可以访问的内部常量
|
|
返回顶楼 | |
发表时间:2007-02-01
foxty 写道 用protected并不是一味希望子类来覆盖它,或许还希望子类能够直接访问它。
嗯,有道理!abstract是希望被覆盖,而protected有两个层面的意思,既可能是希望子类覆盖(扩展功能),也可能希望子类直接访问。 我发现final的方法是不可以在子类中重写的,但是protect final的变更却可以在子类中重写,不知道为什么会这样? |
|
返回顶楼 | |
发表时间:2007-02-01
stamen 写道 foxty 写道 用protected并不是一味希望子类来覆盖它,或许还希望子类能够直接访问它。
嗯,有道理!abstract是希望被覆盖,而protected有两个层面的意思,既可能是希望子类覆盖(扩展功能),也可能希望子类直接访问。 我发现final的方法是不可以在子类中重写的,但是protect final的变更却可以在子类中重写,不知道为什么会这样? 另外你后面说的是变量重写还是什么?protectd final变量只是表示这个变量不能被更改,并不是不允许被覆盖的。 |
|
返回顶楼 | |
发表时间: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以为然否? |
|
返回顶楼 | |
发表时间:2007-02-01
override 指子类重新定义和超类中的方法.
overload 指同一个类中同名方法的不同定义 |
|
返回顶楼 | |
发表时间: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,用在属性前面则表示这个属性是不可更改的。 |
|
返回顶楼 | |
发表时间:2007-02-01
引用 你该温习温习java的基础知识了,final用在类前,表示这个类不允许被继承,用在方法前表示方法不能被override,用在属性前面则表示这个属性是不可更改的。
呵呵,确实啊,基础的东西都有点忘了, ![]() ![]() |
|
返回顶楼 | |