Java封装设置器不更改实例变量

时间:2016-10-05 05:54:43

标签: java encapsulation setter instance-variables

我的代码由2个类组成。 (1.测试)(2。狗)

代码的目的是测试3只狗并使用setter设置狗的名字和大小,然后让3只狗吠。

这是我的代码。

public class Dog {
private int size;

public void bark(){
    System.out.println("Size: " + size);
    if(size > 19) System.out.println("Woof Woof Woof");
    if(size > 9 && size < 20) System.out.println("Bark Bark Bark");
    if(size < 10 && size > 0) System.out.println("Yip Yip Yip");
    if(size == 0) System.out.println("Size Not Set");
}

public void setSize (int s){
    if(size > 0 && size < 60) size = s;
    if(size > 60) { 
        size = 60; 
        System.out.println("Debug: Size sent to large resetting to max.(60)"); 
    }
}
public class Test{
public static void main (String[] args){

//dog size
int s1 = 100;
int s2 = 100;
int s3 = 100;

//create dog and make him bark
Dog d1 = new Dog();
d1.setSize(s1);
d1.bark();

//create dog and make him bark
Dog d2 = new Dog();
d2.setSize(s2);
d2.bark();

//create dog and make him bark
Dog d3 = new Dog();
d3.setSize(s3);
d3.bark();
}}

这是输出

Size: 0
Size Not Set
Size: 0
Size Not Set
Size: 0
Size Not Set

我认为当Dog正在运行setSize时,它不会将size转换为传递的参数?如果是这样我该如何解决这个问题?

当我将private int size;更改为private int size = 10;时,它有效。 但是,当我将其更改为private int size = 0;时,它不会。

为什么会这样?

3 个答案:

答案 0 :(得分:4)

你的setter逻辑不正确:

 if(size > 0 && size < 60) size = s;
    if(size > 60) { 
        size = 60; 

默认大小初始化为零,因此调用setter不起作用,因为永远不会检查该条件!

您需要检查参数 s 而不是字段尺寸

答案 1 :(得分:1)

将尺寸setter更改为

public void setSize (int size){
    if(size > 0 && size < 60) this.size = size;
    if(size > 60) { 
        this.size = 60; 
        System.out.println("Debug: Size sent to large resetting to max.(60)"); 
    }
}

没有必要检查size的值,因为它尚未设置

答案 2 :(得分:0)

更改size > 60;到s>60