加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java – 应该通过getter和setters方法在构造函数中访问私有实例

发布时间:2020-12-14 05:55:42 所属栏目:Java 来源:网络整理
导读:我知道私有实例变量通过其公共getter和setters方法访问. 但是当我在IDE的帮助下生成构造函数时,它直接初始化实例变量,而不是通过setter方法初始化它们. Q1.所以我应该更改IDE生成的构造函数的代码,以通过它们的setter方法初始化这些实例变量. Q2.如果是,那么
我知道私有实例变量通过其公共getter和setters方法访问.

但是当我在IDE的帮助下生成构造函数时,它直接初始化实例变量,而不是通过setter方法初始化它们.

Q1.所以我应该更改IDE生成的构造函数的代码,以通过它们的setter方法初始化这些实例变量.

Q2.如果是,那么IDE为什么不以这种方式生成构造函数代码?

================================ ===================

>我使用Eclipse和Netbeans IDE
这是一个普遍的问题.但是根据@Lords的问题,答案取决于我们的构造函数是公共的还是受保护的,还是私有的或私有的?

解决方法

你不应该从构造函数调用非最终的方法.类构造函数用于初始化对象,并且对象在构造函数返回之前不处于一致状态.如果你的构造函数调用一个后来被一个子类覆盖的非最终方法,你可以得到奇怪的,意想不到的结果,因为当被覆盖的方法被调用时,对象没有被完全初始化.

考虑这个例子:

class A {
    private int x;

    public A() {
        setX(2);
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getX() {
        return x;
    }
}

class B extends A {
    private int number = 10;

    @Override        
    public void setX(int x) {
        // set x to the value of number: 10
        super.setX(number);
    }
}

public class Test {
    public static void main(String[] args) {
        B b = new B();
        // b.getX() should be 10,right?
        System.out.println("B.getX() = " + b.getX());
    }
}

该程序的输出是:

B.getX() = 0

原因是在调用setX时,B的号码成员未初始化,因此使用其默认值0.

This article有一个更彻底的解释,有效的Java.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读