Ответ 1
Он называл статические переменные и статические методы . Просто попробуйте и посмотрите, что он компилируется.
У меня есть класс с несколькими методами, и между этими методами нет конструктора.
Итак, мне интересно, можно ли вызвать метод класса без создания экземпляра класса.
Например, я могу сделать что-то вроде этого:
NameOfClass.doMethod(x1,x2,...,xn)
В общем, я не понимаю, почему это должно быть невозможно. Я просто вызываю функцию, которая что-то делает (или возвращает некоторые значения). Если возможно, что произойдет, если метод задает значение для частной переменной класса. Как я могу достичь этого значения? Точно так же?
NameOfClass.nameOfVariable
Он называл статические переменные и статические методы . Просто попробуйте и посмотрите, что он компилируется.
Если методы статичны, да.
Но вы не сможете получить доступ к нестационарным элементам.
Как указывали многие, это возможно только в том случае, если метод статичен. Возможно, некоторый фон ООП находится в порядке: метод всегда должен принадлежать классу. Итак, каково использование вызова метода без экземпляра класса? В идеальном мире ОО не должно быть никаких оснований для этого. Множество вариантов использования, связанных со статическими методами, говорят о назначении своего класса для определенного типа. Хотя это вполне разумно в мире программирования, это не очень убедительно, когда речь идет о объектно-ориентированном дизайне.
Как мы программируем в несовершенном мире, часто используется прецедент для "свободной функции" (например, Java или С++ реализуют sort()). Поскольку Java не имеет прямой поддержки для классов свободных функций, только для статических "методов" используются выражения для семантики с дополнительным преимуществом оболочки класса, предоставляющей "пространство имен". То, что вы думаете об этом обходном пути, и если вы рассматриваете его как недостаток в оформлении языка, - это ИМО вопрос.
1) ДА, вы можете использовать методы класса без создания экземпляра или объекта этого класса с помощью ключевого слова "Статический" .. p >
2) Если вы объявите метод как "Статический" , вы можете вызвать этот метод:
*ClassName.MethodName()*
3).
class Hello {
public static void print()
{
System.out.println("HelloStatic");
}
}
class MainMethod {
public static void main(String args[])
{
// calling static method
Hello.print();
}
}
4). Вывод вышеуказанной программы: HelloStatic
В большинстве языков вы можете сделать это только в том случае, если метод статичен. Статические методы могут изменять только статические переменные.
У меня есть класс с несколькими методами, и между этими методами нет конструктора.
Если вы явно не определяете конструктор, вы получаете конструктор по умолчанию, предоставляемый компилятором. Поэтому, если эти методы не статичны, попробуйте следующее:
NameOfClass x = new NameOfClass();
x.doMethod(x1,x2,...,xn);
Метод класса использует в контексте экземпляр; он имеет доступ к переменным-членам экземпляра. Вы понимаете это, потому что вы спрашиваете, что произойдет, если метод обращается к одной из этих переменных.
Вы можете понять, почему это не работает, задавая себе вопрос: "Где данные?" Если у вас нет экземпляра, где переменная экземпляра? Где данные? И ответ заключается в том, что у него нет места и, следовательно, он не работает.
Разница со статической функцией и статическими переменными-членами заключается в том, что вы можете ответить на вопрос о местонахождении данных. Статические переменные доступны независимо от того, существует ли конкретный экземпляр или нет. Особое решение для конкретного экземпляра или класса - это тот, который вы должны сделать, учитывая то, что вы действительно хотите сделать.
Это будут статические методы.
У меня есть класс с несколькими методами и нет конструктора среди эти методы.
Вы имеете в виду, что у вас есть что-то вроде:
public class X
{
public void foo()
{
}
}
или вы имеете в виду, что у вас есть что-то вроде:
public class X
{
private X()
{
}
public void foo()
{
}
}
Если это первый способ, да, есть конструктор, и он будет выглядеть следующим образом:
public X()
{
super();
}
если это второй способ, существует, вероятно, такой метод, как:
public static X createInstance()
{
return (new X());
}
Если вы действительно имеете в виду, что классы имеют методы, которые делают вещи, не создавая экземпляр, тогда да, вы можете просто сделать все методы и переменные статичными (обычно это не очень хорошая идея, но для некоторых вещей это идеально).
Так как qre является статическим методом и не имеет доступа к экземплярам окружающего класса, вы должны сначала создать экземпляр, а затем получить доступ к нему. Например:
public class Foo {
private int bar;
public static void qre() {
Foo foo = new Foo();
foo.bar = 5;
System.out.println("next bar: " + (++5));
}
}
В правильной инкапсуляции вы не должны "видеть", что происходит при instanciation. Чтобы полагаться на класс, отсутствие конструктора нарушает эту форму. Разработанный класс my имеет в виду добавить официальную инициализацию состояния в конструктор позже. Ваш "контракт" с классом заключается только в том, что вы можете использовать методы, как они в настоящее время разрабатываются.
Если вы хотите использовать функциональность этого метода без накладных расходов класса, возможно, вам лучше всего включить этот метод в ваш существующий "клиентский" класс (конечно, это просто "копировать и вставлять" кодирование и считается анти-шаблон программного обеспечения.