Есть Java generics класс типа: public class MyClass { static long myField=System.currentTimeMillis() //blah-blah } Создаются два объекта: MyClass var1=new MyClass() MyClass var2=new MyClass() вопрос: одинаковы ли var1.myField и var2.myField? Update А если это будет шаблон в С++/C# - тогда будут они одинаковы или нет?
Ответ Ответ: Да, они одинаковые для Java Ваш пример не самый хороший для демонстрации этого. Известно, что StringBuilder не ссылается в один pool и каждый раз создаёт новый объект. Будем использовать его для подтверждения утверждения: public class Clazz { static StringBuilder myField= new StringBuilder("Test text") public static void main (String args[]) throws InterruptedException { Clazz var1=new Clazz() Clazz var2=new Clazz() // Одинаковые ли ссылки на объект? System.out.println(var1.myField == var2.myField) // Одинаковы ли содержания объектов? System.out.println(var1.myField.toString().equals(var2.myField.toString())) } } Output: true true
В C++, на сколько я понял, нет прямого аналога generic class. Там есть шаблоны и работают они как-то по-другому. Я набросал немного кода: template class Test { public: static int count } template int Test ::count int main() { Test a Test b Test c a.count = 2 b.count = 1 c.count = 1 // Одинаковы ли ссылки? cout << (&a.count == &b.count) << endl // Одинаковы ли содержания? cout << (a.count == b.count)<< endl // Одинаковы ли ссылки? cout << (&a.count == &c.count) << endl // Одинаковы ли содержания? cout << (a.count == c.count) << endl <br> return 0 } Статическая переменная внутри шаблона оказывается одинаковой для объектов, созданных одинаковым типом (int) и разная для разных типов. Вывод этой программы следующий: Output: 1 1 0 1
В C# провести исследование нет возможности (ОС не поддерживает), но я нашёл похожий вопрос на англоязычном StackOverflow: Are static members of a generic class tied to the specific instance?. Дела там, похоже, не особо отличаются от C++. Статическая переменная одинакова для всех экземпляров одинакового типа. Foo и Foo - два разных типа. Это можно показать в следующем примере: // Результатом будет "False" Console.WriteLine(typeof(Foo) == typeof(Foo)) Это можно найти в 1.6.5 параграфе спецификации языка C# (for C# 3): ....