0

Учитывая код ниже:Предоставляет ли статическое ключевое слово новым объектам для назначения переменной?

class Demo {      
    static String s = "123";  

    static void m1(String s) { 
     this.s = s;    
    } 

    void m2(String s) { 
     this.s = s;    
    } 
} 

class Hello { 
    public static void main(String args) { 
     Demo.m1("456");   
     Demo d = new Demo();  
     d.m2("789");   
    } 
} 

Я хотел бы знать, в чем разница между использованием переменной экземпляра и создания статической переменной в отношении объекта:

  1. Учитывая, что строка является неизменной и переменной s статично, сколько объектов создано для переменной s?

  2. Является ли новый объект, созданный при вызове статического метода, такого как m1()?

  3. Новый объект, созданный при вызове метода экземпляра, такого как m2()?


Отредактировано:

У меня было неправильное предположение о статическом ключевое слово. Теперь я это понимаю.

  1. static - ключевое слово.
  2. Он используется для объявления членов класса.
  3. Статические элементы относятся к классу.
  4. Переменные экземпляра не могут использоваться в статическом контексте.
  5. Это ключевое слово не может использоваться в статическом контексте.
  6. Статические элементы могут быть доступны без создания объекта.
  7. Статические переменные оживают, когда класс загружается в память.
  8. Это ключевое слово может использоваться только для доступа к членам экземпляра.
  9. Это ключевое слово используется для доступа к членам класса внутри одного класса.

Спасибо за помощь. Below - отредактированный код:

class Demo {      
    static String s= "123"; //Static variable 
    String s1 ="abc"; // Instance variable 

    static void m1(String s) { 
     Demo.s = s; //Accessing an static variable  
    } 

    void m2(String s,String s1) { 
     Demo.s = s; 
     this.s1 = s1;//Accessing an instance variable   
    } 
} 

class Hello { 
    public static void main(String args[]) { 
     Demo.m1("456");   
     Demo d = new Demo();  
     d.m2("789","xyz");   
    } 
} 
+0

И что вы лично думаете об этих вопросах? – Andremoniy

+0

Я немного смущен статической переменной. Если бы это была переменная экземпляра, то новый объект бы создал. Потому что Строка неизменна. –

+0

Обратите внимание: '' 'не является экземпляром объекта String - это переменная. В Java переменная является ссылкой на экземпляр объекта, а не сам экземпляр. '' 123 "' является строковым литералом и представляет собой единственный экземпляр объекта String. 's =" 123 "' устанавливает ссылку 's' указывать на экземпляр строки, содержащий символы 1,2 и 3. – Arkadiy

ответ

4

Модификатор static просто означает, что переменная является членом класса, а не конкретного экземпляра. Он не имеет никакого отношения к созданию нового объекта или нет.

Сначала несколько замечаний о вашем коде:

Метод m1():

static void m1(String s) { 
    this.s = s; 
} 

Это не будет компилироваться, потому что вы не можете ссылаться на переменную экземпляра из статического метода. Оно должно быть:

static void m1(String s) { 
    Demo.s = s; 
} 

Метод m2():

void m2(String s) { 
    this.s = s; 
} 

Теперь это не даст вам ошибку компиляции, но должно дать вам предупреждение. this следует использовать только для атрибутов и методов. Поскольку s является атрибутом класса, вы должны использовать имя класса вместо:

void m2(String s) { 
    Demo.s = s; 
} 

Теперь мы можем рассуждать о коде:

  1. Когда вы static String s = "123", вы создаете новый String и сделать s указать на это, так s -> "123".

  2. Когда вы звоните Demo.m1("456"), вы создаете другой String, "456" на этот раз, и сделать s точку к нему, так s -> "456".

  3. Когда вы звоните d.m2("789"), вы снова создать String объект, "789" и сделать s точку к нему, так s -> "789".

Таким образом, в общей сложности вы создали 3 String объектов.

+0

Спасибо ... Есть ли разница между вызовом метода m1() и вызовом m2() .. –

+0

Я предложил пару исправлений методам m1() и m2() в моем обновленном ответе. Учитывая эти изменения, эффекты обоих методов должны быть одинаковыми. Единственное различие заключается в том, что для вызова m2() требуется экземпляр Demo. –

+0

, так что нет никакого преимущества создавать статический метод ... где хранится статический и статический переменные .. ??? –

0

Создана только одна статическая строка s (что является основной идеей статики). Поэтому, вызывая Demo.m1 («353»), вы меняете s на «353», и, создавая новую демоверсию d и вызывая d.m2 («344»), вы переписываете контент «353» на «344».

Я немного запутался о вопросе, потому что вы можете легко проверить это самостоятельно, используя

public void talk(){ 
    System.out.println("my static string s is: "+s) 
} 

и печати с в разных этапах программы. Вы хотите знать, ПОЧЕМУ, что это происходит?

это может помочь вам: Immutability of Strings in Java

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