一个班级的实例

时间:2015-06-17 12:18:53

标签: java

我真的不确定这段代码中发生了什么。基本上,在当前状态下,代码输出0,但我期望输出为20。当我使用当前被注释掉的OR的其他部分时,我只得到20

class Sum {
    int x, y;

    void setSum(int value1, int value2) {
        x = value1;
        y = value2;
    }

    int getSum() {
        return x + y;
    }
}

public class JavaBasics {
    public static void main(String[] args) {
        // Sum newSum = new Sum();
        // newSum.setsum(10, 10); // 10 , 10 are the arguments
        //
        // OR
        new Sum().setsum(10, 10);

        System.out.println(new Sum().getSum());

        // OR
        // System.out.println(newSum.getSum());
    }
}

8 个答案:

答案 0 :(得分:9)

每次使用Sum时,您正在制作两个new Sum()的不同实例,它们都有自己的状态。

由于您没有构造函数,因此使用隐式默认值,即在构造对象时将x和y设置为零。

通过将其存储到变量Sum newSum,您正在创建Sum,设置其x和y,然后回读相同的 Sum

您可以声明部分或全部字段static,以便在所有实例中访问或共享其值。您也可以创建一个static方法,可以在没有类实例的情况下调用该方法(例如ClassName.staticMethod(foo, bar))。当然,由于没有实例,它无法直接访问非静态字段。

答案 1 :(得分:3)

您指的是两个不同的对象来设置值并获取值。

 new Sum().Setsum(10, 10);  // object 1
 System.out.println(new Sum().getSum()); // object 2

您正在设置第一步的价值。但是你要引用一些其他新实例来获取值,没有为这个新实例设置值。

确保您引用相同的对象,然后您将获得预期的结果。

 Sum sum=new Sum(); // creating a instance
 sum.Setsum(10, 10); // setting value
 System.out.println(sum.getSum()); // getting value back from same instance

答案 2 :(得分:1)

您打印

new Sum().getSum()

这会创建一个新的Class Sum实例,当然它的默认值为0和0。

我想你想要这样的东西:

Sum mySum = new Sum().setSum(10,10)
System.out.println(mySum)

答案 3 :(得分:0)

问题是对象未被任何引用保留。

new Sum().Setsum(10, 10);

使用此语法时,会创建一个对象(内存位置),并调用set方法。但是我们没有任何指向记忆的参考。

system.out.println(new Sum().getSum());

当您使用此语法时,将创建一个新对象(内存位置)并调用get方法。这个对象与第一个没有任何关系。

new Sum().Setsum(10, 10).getSum();

如果您不想继续引用,可以使用此语法。

我希望它能帮助你理解这个概念。

答案 4 :(得分:0)

new Sum().Setsum(10, 10); // Object 1
 System.out.println(new Sum().getSum()); //Object 2

在第一个对象创建中,您将1010传递给setSum()方法。这些值分别在x方法内分配给ysetSum()。在您的代码中声明xy作为实例变量。

在第二个对象中,您正在调用gerSum()方法。返回x+y。他们已经使用 Object1 初始化为10和10。这就是它返回20

的原因

解决方案:

Sum s1 = new Sum();
 s1.setSum(10,10); 
s1.getSum(); // using same object s1

输出:

20

答案 5 :(得分:0)

class Sum {
    int x, y;
    void setSum(int value1, int value2) {
        x = value1;
        y = value2;
    }
    int getSum() {
        return x + y;
    }
}

当您定义任何类时,内存中不会发生任何事情,而不是单个分配。内存分配将基于您为该类定义的实例,例如

Sum s1 = new Sum(); 
Sum s2 = new Sum();

这里将创建两个内存块,每个块中有两个变量,例如x和y。记住,用对象和方法绑定的实例变量通常由所有对象共享。

所以当你调用s1.getSum()时它会给你x和y的s1对象,因为你已经使用s1调用了这个方法(调用对象可以在方法中访问)。

因此,如果你想在变量中存储值,那么你需要为它创建对象,new Sum()在执行完成后具有单行范围,它将无法访问。

Sum s1=new Sum(); // Create an instance
s1.Setsum(10, 10); // Invoking set value method using s1 object so 10, 10 will be stored in x and y of s1.
System.out.println(s1.getSum()); // display x and y of s1 object.

答案 6 :(得分:-1)

当然它会是0.你使用Sum类的不同实例。 将主要方法更改为以下内容:

Sum sunObj = new Sum(); sumObj.Setsum(10,10);

的System.out.println(sumObj.getSum());

答案 7 :(得分:-1)

你没有得到20的结果,因为。 当您使用匿名对象调用时..该对象没有引用,因此您无法指向该对象。 意味着每当你只使用新的sum()。setsum()..那时它正在设置值。 但当你试图通过新的sum()。getsum()来调用你。 哪个是新对象..它没有指向用于设置总和的相同实例。 所以这就是你获得0的原因。 所以最好使用参考。 意思是newSum = new sum()。 并使用该引用变量newSum.get Sum()进行设置和获取; 谢谢你