我知道私有实例变量通过其公共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.