Статичные методы/переменные

Модератор: Absurd

Ответить
Beeyonder
Сообщения: 3
Зарегистрирован: 02 май 2006, 09:41
Контактная информация:

Прочитав пару уроков по яве ко мне никак не дошел один вопрос. Что собственно представляют собой статичные переменные/методы и как их использовать?

Заранее спасибо, и просьба не пинать - я в яве новичек :)
Чем гениальнее ваш план, тем меньше людей будут с ним согластны.
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Beeyonder,

есть классы, а есть обьекты, инстанциированные (порождённые) от этих классов.

статическая переменная (метод) существует одна на класс (для каждого порождённого обьекта одинаковая).

Код: Выделить всё

public class TestClass {
	
	public static int counter = 0;

	publi int something = 0;

	public TestClass() {

		counter = counter + 1;

		something = something + 1;

	}

	public static int getCounter() {

		return counter;

	}


	public int getSomething() {

		return something;

	}


	public static void main(Sting[] argv) {

		for(int i = 0; i < 10; i++) {

			TestClass testObject = new new TestClass();

			System.out.println("testObject.something = " + testObject.something);
			System.out.println("testObject.getSomething() = " + testObject.getSomething());


			// Wrong: Compile Warning
			System.out.println("testObject.counter = " + testObject.counter);

			// Wrong: Compile Warning
			System.out.println("testObject.getCounter() = " + testObject.getCounter());

			System.out.println();

		}

			System.out.println();

			System.out.println("TestClass.counter = " + TestClass.counter);

			System.out.println("TestClass.getCounter() = " + TestClass.getCounter());


			// Wrong: Compile Error

			// System.out.println("TestClass.something = " + TestClass.something);


			// Wrong: Compile Error

			//System.out.println("TestClass.getSomething() = " + TestClass.getSomething());

	}

}
Вывод:
testObject.something = 1
testObject.getSomething() = 1
testObject.counter = 1
testObject.getCounter() = 1

testObject.something = 1
testObject.getSomething() = 1
testObject.counter = 2
testObject.getCounter() = 2

testObject.something = 1
testObject.getSomething() = 1
testObject.counter = 3
testObject.getCounter() = 3

....

testObject.something = 1
testObject.getSomething() = 1
testObject.counter = 9
testObject.getCounter() = 9


TestClass.counter = 9
TestClass.getCounter() = 9
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Как использовать?

Есть такая штука, "Design Patterns" ("Шаблоны проэктирования"), называется.
Это инструкции для решения конкретных маленьких задач.

Так вот есть такой шаблон "Singleton" ("одиночка") называется.
Когда нужно быть уверенным, что от одного класса может быть порождёт максимум один обьект.

Пример: в христианском мире, по канонам, существует много людей, но лишь один Бог.

Код: Выделить всё

public class God {

	private static God instance = null;

	private God() {}


	public static God getInstance() {
		if (instance == null) {
			instance = new God();
		}

		return instance;
	}

	public String getPray(Sting pray) {

		return "Everything will be all right!";

	}
}


public class Person {

	public String pray() {

		God god = God.getInstance();

		return god.getPray("Ben, I need help!");		

	}

}

public class World() {

	public static void main(String[] argv) {

		for(int i = 0; i < 10; i++) {

			Person person = new Person();

			String reply = person.pray();

			System.out.println("God said to person: " + reply);

		}
	}

}

Конструктор God обьявлен, как private, таким образом его можно вызывать только изнутри самого класса God.

Единственные способ создать инстанцию класса (обьект) - это метод getInstance(),
причём в этом методе сказано, что обьект может быть создан лишь один раз (при первом обращении).

Ну а всё остальное - это уже в зависимости от того, что требуется от программы.
Beeyonder
Сообщения: 3
Зарегистрирован: 02 май 2006, 09:41
Контактная информация:

Большое спасибо за хороший ответ.
С статичными переменными вроде понятно, это что-то вроде глобальных переменных в других языках.
А в функции особенность в том что она создается до создания самого класса? Если да то я вроде все понял :)

ОФФТОП: Перехожу с С++ на Яву, интерестно тут все к классам прикручено :) .
Чем гениальнее ваш план, тем меньше людей будут с ним согластны.
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Beeyonder,

Статические переменные это НЕ глобальные.

Код: Выделить всё

public class Test {
	private static int x;
}
и где тут будет глобальность?

Насчёт: создаются ли переменные/методы до или во время,
то тут ты прав.
Только не нужно путать Класс и Обьект.

то, что статические переменные доступны (если область видимости позволяет) и до создания первого обьекта класса, это да.



можешь верить во всё, что угодно, но если ты уж знаешь С++,
тогда возникает вопрос:
почему проблема со статическими данными?

Код: Выделить всё

class MyClass
 {
 public:
	static int GetCount() { return count; }
 private:
	static int count;
 };
и в чём же это такое большое отличие между прикрученностью классов в Java и C++ ?

C++ это ведь тоже ОО-язык,
другое дело, что он позволяет писать и процедурным стилем ..
Beeyonder
Сообщения: 3
Зарегистрирован: 02 май 2006, 09:41
Контактная информация:

Ну в общем ситуация с классами прояснилась, спасьбо за обьяснения.
А о С++, во первых я был где-то на среднем уровне, и о статичных переменных просто где-то слышал, и не пытался понять что это так как прекрасно обходился без них :) .
А насчет обьектности, в С++ засчет процедурного стиля акцент с классов очень сильно уменьшается, и в основном все программирование выглядит намного менее прикручено к классам чем в яве. А вот здесь без классов ничего не может существовать :) .

Да и кстати, старый вопрос который меня мучил, как читается Java ? Джава или Ява?
Чем гениальнее ваш план, тем меньше людей будут с ним согластны.
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Джава - английский вариант
Ява - немецкий + транслит

будучи в Киеве - говорил "Джава"
сейчас - "Ява"
хотя, если прийдётся общаться с англоязычными, то они "Ява" могут и не понять :-)
Ответить