Java 初始化成员变量

类的成员初始化变量, 其实有若干种.

1. 直接赋值
class A{
    Object b=new B();
}

问题: 赋值权力下移子类 (为了抽象)
做法: 子类覆盖父类
如下(然而 , Java 成员变量不存在多态)

class A{
    Object b;
}

public SubA extned A{
    super.b=new B();// 无法这样使用
}

只能如下

public subA extend A{

    //可以这样做
    public subA(){
        super.b=new B();
    }
}

优点:

  • 简洁

缺点 :

  1. 不利于成员变量的读取与写入
  2. 若存在相同名称的变量,容易搅混
  3. 赋值操作需要触发 (没有强制性)

参考:

why instance variable of super class is not overridden in sub class method

针对上述情况, 使用抽象方法显得有优势

  1. 抽象类
abstratc class AbstractA{
    public abstratc B getB();
}

class SubA extend AbstractA{
    //实现父类的虚拟方法
    public B getB{
      return new B;
    }
}

//等价于
class SubA extend AbstractA{
    final B b=new B();

    public B getB{
      return b;
    }
}

解决了(2)(3)问题,(1)问题中写入并没有解决 (子类的子类无法覆盖, 外部也无法修改. 即 [无状态])。

改良 (使之具有状态)

//(1) 状态(含默认值)
class SubA extend AbstractA{

    private B b=new B();
    //实现父类的虚拟方法
    public B getB{
      return b; 
    }
}

//(2)(不含默认值),DI方式
class SubA extend AbstractA{

    private B b;

    public void setB{
        this.b=b;
    }

    //实现父类的虚拟方法
    public B getB{
      return b; 
    }

    public static void main(...){
        SubA a=new SubA();
        a.setB(new B());
    }
}

解决上述问题。

缺点

  • 状态等操作仍需手工加入 (子类需要补充的代码有点多)
成员变量 / 参数过多
(资源类)使用bean方式存储, 并让该参数bean进行赋值

(可以分离成资源类,通过set资源类进行链接。 )

class Resource {//Bean或者资源类
    B b;
    C c;
}

class AbstractA{
    public void setResource(Resource re);
}

public class A extends AbstractA{
    B b;
    C c;

    //插入并分解资源
    @override
    public void setResource(Resource re){
        b=re.b;
        c=re.c;
    }  
}
其他解决方案
  • 使用文字或者demo 进行提示子类该如何实现 (用文字指导, 非代码强制)

  • 使用接口代替虚拟函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值