2015-04-12 2 views
3

У меня есть код ниже. Переменные c и d являются переменными класса и первоначально они указывали на значение 0, но когда я сделал c=a* a; и d =b* b*b, они напечатали значение как 25 и 64, что верно. так что теперь я думаю, что c и d теперь указывают на значения 25 и 64, и они являются переменными класса, поэтому, если я делаю j=c+d;, он должен дать мне 89 значение j, но это дает мне 0 ... почему? Я знаю, если я использую static с c и d переменная, это даст мне значение 89 ... но почему я должен использовать static, так как c и d являются глобальными переменными, и теперь значения обновляются до 25 и 64. Пожалуйста, дайте мне знать. Благодарю.Понимание того, как переменная указывает на значение в Java

public class BaiscSum { 

    int a=5; 
    int b=4; 
    int c; 
    int d; 
    int j; 

    public void square() { 
     c=a*a; 
     System.out.println(c); 
    } 

    public void cube() { 
     d=b*b*b; 
     System.out.println(d); 
    } 

    public void sum() { 
     j=c+d; 
     System.out.println(j); 
    } 

    public static void main(String[] args) { 
     BaiscSum squ= new BaiscSum(); 
     squ.square(); 

     BaiscSum cub = new BaiscSum(); 
     cub.cube(); 

     BaiscSum su = new BaiscSum(); 
     su.sum();  
    } 
} 
+1

переменные 'c' и' d' не являются переменными класса. Переменные класса имеют ключевое слово 'static' – OPK

+0

Это не переменные класса. Это переменные экземпляра. Почему вы считаете, что это переменные класса? – user2357112

+0

user2357112 - Спасибо за освобождение. Поскольку эти переменные используются внутри класса, они являются глобальными, и я думал, что они являются переменной класса, поэтому в чем же разница между переменной класса и переменной экземпляра? –

ответ

3

Если я J = C + D; он должен дать мне как j значение, но он дает мне . Зачем?

Поскольку вы ссылаетесь sum() с su объекта, но вы не вызвали cube() и square() на su вместо этого вы назвали его с cub и squ соответственно.

Изменения в

BaiscSum su = new BaiscSum(); 
su.square(); 
su.cube(); 
su.sum(); 

Это даст вам ожидаемый выход.

Поскольку все переменные, которые вы используете, являются такими, чтобы каждый объект имел свой собственный набор переменных в своих соответствующих пространствах памяти, и если вы изменили какую-либо одну переменную объекта, это не повлияет на значение других объектов.

Это может очистить более

enter image description here

В качестве объяснения каждый объект назначается отдельная память и поэтому изменения в переменной одного объекта не влияет на изменения в другие объекты переменной, если они не являются статичными. Таким образом, в третьем объекте c и d не инициализируется для объекта su, поэтому jvm использует значение по умолчанию, если int ie 0 дает вам сумму нуля.

+0

Спасибо singhakash –

+0

@DeepaSingh мое удовольствие, и если вы найдете мой или Мойше Липскер ответ полезным рассмотреть вопрос о принятии любого – silentprogrammer

+0

как я могу его принять? –

6

Вы используете три отдельных экземпляра своего класса. Это означает, что у squ, cub и su есть своя версия класса. Вместо этого используйте один и тот же экземпляр, чтобы все изменения произошли с одним и тем же экземпляром.

public static void main(String[] args) { 
    BaiscSum sum= new BaiscSum(); 
    sum.square(); 
    sum.cube(); 
    sum.sum(); 
} 
+0

Спасибо Moishe Lipsker –

Смежные вопросы