切勿调入Java继承的陷阱

5 篇文章 0 订阅
2 篇文章 0 订阅
1

2
/**
3
  * 
4
  * 切勿调入Java继承的陷阱<br>
5
  * 
6
  * CatfoOD  2011 - 8 - 2 上午09 : 53 : 27 yanming -sohu@sohu .com /@qq .com<br>
7
  * 
8
  */
9
public class TestExtends  {
10

11
    public  static  void main (String [] args ) {
12
        B b  = new B ();
13
         /* 首先会打印"b: 0"然后才是"b: 3"*/
14
        b .rr ();
15
     }
16

17
    
18
     static class A  {
19
        private  int a  =  1 ;
20
        
21
        A () {
22
             /* 在构造函数中调用的方法可能被重写 */
23
            rr ();
24
         }
25
        
26
         /** 该方法未被调用 */
27
         void rr () {
28
            System .out .println ( "a: "  + a );
29
         }
30
     }
31
    
32
     static class B extends A  {
33
        private  int a  =  2 ;
34
        
35
        B () {
36
            a  =  3 ;
37
         }
38
         /**
39
          * 由于该方法重写了A的rr方法所以当B被创建时A的构造函数先被
40
          * 调用 ,但是此时B尚未初始但是B .rr ()却被调用了 ,于是在rr ()
41
          * 所有使用的属性都是默认值 (0或null );同时A自己的属性也没有
42
          * 被正确的初始化 .<br>
43
          * 所以在父类的构造函数中调用的方法最好是private或final (
44
          * 样就不能被子类重写 ), 或者很明确的利用这种情况来构造程序 .
45
          */
46
         void rr () {
47
            System .out .println ( "b: "  + a );
48
         }
49
     }
50
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值