Как вызвать обычный метод класса внутри static метода
Перейти к содержимому

Как вызвать обычный метод класса внутри static метода

  • автор:

Java: как вызвать нестатический метод из основного метода?

Внутри моего основного метода, потому что он статический, я могу вызвать ТОЛЬКО другой статический метод. Почему?

Например: у меня есть другой класс

Итак, в моем основном классе я объявляю private ReportHandler rh = new ReportHandler();

Но я не могу вызвать какой-либо метод, если они не являются статическими.

EDIT: извините, мой вопрос: как «создать» приложение, чтобы позволить мне вызвать другой класс из моей «начальной точки» ( static void main ).

7 ответов

Вам просто нужно создать экземпляр ReportHandler:

Важным моментом методов экземпляра является то, что они предназначены для конкретного экземпляра класса. поэтому вам нужно сначала создать экземпляр. Таким образом, экземпляр будет иметь доступ к правильному соединению и подготовленному заявлению в вашем случае. Просто вызывая ReportHandler.executeBatchInsert , контекста недостаточно.

Очень важно понять, что:

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

Как только вы понимаете это фундаментальное различие, имеет смысл, что вы не можете вызвать метод экземпляра без создания экземпляра. Например, имеет смысл спросить: «Какая высота этого человека?» (для конкретного человека), но не имеет смысла спрашивать: «Какая высота человека?» (без указания лица).

Предполагая, что вы наклоняете Java из книги или учебника, вы должны прочитать больше примеров статических и нестатических методов и т.д. — это важное различие, чтобы понять, и у вас будут всевозможные проблемы, он это понимал.

Модификатор static в Java: методы

В данной статье мы рассмотрим использование модификатора static для методов. Если же Вас интересует использование модификатора static для переменных, такую статью Вы можете найти по этой ссылочке.

Модификатора static — с англ. «статичный», «постоянный» — делает переменную или метод «независимыми» от объекта. Давайте рассмотрим, как модификатор применяется к методам.

Модификатор static для методов

1. Метод вызывается без создания объекта класса.

Как и в случае с полями, статические методы можно вызывать без создания объекта. Например, представим, что у нас есть класс MyClass — а внутри его два метода, статический и «обычный»:

Мы можем вызвать оба метода, создав объект класса MyClass:

Тем не менее, попробуем записать то же самое без создания объекта — вот так:

Тут мы заменили название объекта — c1 — на название класса (ведь ни одного объекта теперь у нас нет! :)).

Как Вы думаете, что произойдет?

Естественно, такой код работать не будет. Дело в том, что так обращаться можно только к одному из этих методов — статическому:

Если нам понадобится второй, не статический метод, понадобится создавать объект класса MyClass. Как видите, если обращаться к статическим методам и через название объекта, и название класса, код будет работать. К нестатическим методам нужно обращаться исключительно через название объектов класса.

2. Статические методы нельзя переопределять.

Как Вы помните, один из фундаментальных принципов ООП — это «наследование». Дело в том, что в случаях, когда нам нужно создать новый класс, который имеет много общих свойств с каким-то уже существующим, вместо того, чтобы писать все заново, можно сделать «наследника» существующего класса. Этот «наследник» будет иметь те же самые метод и переменные, что и «родитель».

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

3. Статическим методам нужен «статический контекст».

Есть такое правило: статический метод не может ссылаться на нестатическую переменную. Что это значит?

Представьте, что у нас в каком-то классе есть статический метод. То есть это метод, к которому, как Вы знаете, можно обращаться без создания объекта класса. Это значит, что если статический метод будет обращаться к нестатическим переменным (которые попросту «не будут существовать», потому что объект не объявлен), то возникнет ошибка. Поэтому, статические методы могут ссылаться только на статические переменные . Это гарантирует, что во время выполнения нашего метода все элементы будут инициализированы и будут работать. Именно это и называется «статическим контекстом».

Итог двух частей — зачем применяется модификатор static

Итак, Вы в общих чертах поняли, в чем заключается принцип работы модификатора static. Давайте подытожим — как он применяется?

1. Если нужно объявить любую константу — например, = 3,14 — обязательно нужно использовать static. Они объявляются с использованием сочетание «static final»:

2. Если Вам нужно иметь доступ к переменной или методу без создания экземпляра класса. Например, представим, что у нас есть класс Cat. Логически, нет смысла делать статической переменную «имя кошки» — ведь оно будет индивидуальным для каждого экземпляра класс — т.е. для каждого кота. И метод «мяукать» делать статическим нет смысла — ведь без кошки (без создания объекта класса) вроде как некому будет мяукать ��

Но если представить, что у нас есть класс Math, в котором будет метод «найти корень квадратный». Это метод мы можем сделать статическим — ведь он нам явно очень пригодится, и будет часто использоваться. А зачем писать две строчки кода (создание экземпляра класса + вызов метода), если можно обойтись одной (вызов метода)? При этом, класс Math не несет никакой логическом нагрузки, в отличии от классов Cat, Dog или Car, и нам совершенно не нужен объект Math чтобы находить квадратные корни ��

3. У статических переменных и методов есть еще одно полезное свойство — они общие для всех экземпляров класса.

С одной стороны, это перекликается с установкой констант — пункт 1. Например, представьте, что у нас есть класс Cat, в котором есть два поля — «количество_лап» и «количество_хвостов». Понятно, что для всех экземпляров этого класса переменная «количество_лап» будет равна 4, а «количество_хвостов» равна 1. Мы можем сделать эти поля static, потому что они будут общими. Кроме того, это нам поможет сэкономить память, потому что эти переменные не будут «создаваться заново» для каждого экземпляра. Наоборот, все эти экземпляры будут ссылаться на одну и ту же — статическую — переменную.

Тот факт, что статическая переменная общая для всех классов, можно использовать и по-другому. Например, представьте, что у нас есть класс Dog. В этом классе, у нас будет статическая переменная «количество_собак», и мы сделаем так, чтобы каждый раз при создании объекта класса Dog она увеличивалась на 1. Таким образом, мы сможем посчитать, сколько мы создавали объектов! Или, как вариант, эту цифру можно использовать для присвоения уникального идентификационного номера каждой собаке.

Теперь Вы знаете основные способы применения модификатора static. Бывают и другие, но их мы рассмотрим позже.

Статья написана Vertex Academy. Будем рады видеть Вас на наших курсах Java с нуля.

Calling Non-Static Method In Static Method In Java [duplicate]

I’m getting an error when I try to call a non-static method in a static class.

Cannot make a static reference to the non-static method methodName() from the type playback

I can’t make the method static as this gives me an error too.

This static method cannot hide the instance method from xInterface

Is there any way to get round calling an non-static method in another static method? (The two methods are in seperate packages and seperate classes).

14 Answers 14

The only way to call a non-static method from a static method is to have an instance of the class containing the non-static method. By definition, a non-static method is one that is called ON an instance of some class, whereas a static method belongs to the class itself.

You could create an instance of the class you want to call the method on, e.g.

Firstly create a class Instance and call the non-static method using that instance. e.g,

buræquete's user avatar

the above code not executed because static method must have that class reference.

This will be definitely get executed. Because here we are creating reference which nothing but «sm» by using that reference of that class which is nothing but ( StaticMethod=new Static method() ) we are calling method one ( sm.methodOne() ).

I hope this will be helpful.

Sabyasachi Mishra's user avatar

chinnu geddi's user avatar

You need an instance of the class containing the non static method.

Is like when you try to invoke the non-static method startsWith of class String without an instance:

What you need is to have an instance and then invoke the non-static method:

So you need to create and instance to invoke it.

It sounds like the method really should be static (i.e. it doesn’t access any data members and it doesn’t need an instance to be invoked on). Since you used the term «static class», I understand that the whole class is probably dedicated to utility-like methods that could be static.

However, Java doesn’t allow the implementation of an interface-defined method to be static. So when you (naturally) try to make the method static, you get the «cannot-hide-the-instance-method» error. (The Java Language Specification mentions this in section 9.4: «Note that a method declared in an interface must not be declared static, or a compile-time error occurs, because static methods cannot be abstract.»)

So as long as the method is present in xInterface , and your class implements xInterface , you won’t be able to make the method static.

If you can’t change the interface (or don’t want to), there are several things you can do:

Статические методы

Кроме статических переменных, в классах могут быть и статические методы.

Обычные методы привязаны к объектам (экземплярам) класса и могут обращаться к обычным-переменным класса (а также к статическим переменным и методам ). Статические же методы привязаны к статическому объекту класса и могут обращаться только к статическим переменным и/или другим статическим методам класса.

Чтобы вызвать обычный метод у класса, сначала нужно создать объект этого класса , а только потом вызвать метод у объекта. Вызвать обычный метод не у объекта, а у класса нельзя.

Вызвать нестатический метод у класса нельзя!

А чтобы вызвать статический метод, достаточно чтобы просто существовал статический объект класса (который всегда существует после загрузки класса в память). Именно поэтому метод main() — статический. Он привязан к статическому объекту класса, для его вызова не нужно создавать никакие объекты.

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

Метод main вызывается Java-машиной командой вида: Solution.main() ;

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

Код Статический метод

2. Статические vs Обычные методы

Чем же отличаются статические методы от обычных?

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

Отличия двух типов методов можно выразить в таблице:

Способность Обычный метод Статический метод
Есть связь с экземпляром класса Да Нет
Может вызывать обычные методы класса Да Нет
Может вызывать статические методы класса Да Да
Может обращаться к обычным переменным класса Да Нет
Может обращаться к статическим переменным класса Да Да
Может быть вызван у объекта Да Да
Может быть вызван у класса Нет Да

Зачем такие методы нужны, если они так сильно ограничены? Все дело в том, что у такого подхода тоже есть свои преимущества.

Во-первых, чтобы обратиться к статическим методам и переменным, не надо передавать никакую ссылку на объект.

Во-вторых, иногда бывает нужно, чтобы переменная была в единственном экземпляре. Как, например, переменная System.out ( статическая переменная out класса System ).

И, в-третьих, иногда нужно вызвать метод еще до того, как будет возможность создавать какие-то объекты. Например, вызов метода main(), с которого начинается выполнение программы: его вызывает Java-машина до создания экземпляра класса.

Есть связь с экземпляром класса

При вызове обычного метода в него передается скрытый параметр — объект, у которого его вызывали . Этот параметр имеет имя this . Именно этот скрытый параметр — ссылка на объект, у которого вызвали метод — и отличает обычные методы от статических.

У статических методов такого скрытого параметра нет, поэтому внутри статических методов нельзя пользоваться ключевым словом this , и из статического метода нельзя вызвать нестатический: ссылку на экземпляр класса попросту неоткуда взять.

Может вызывать обычные методы класса

В обычном методе класса всегда есть скрытый параметр — this — ссылка на объект класса, у которого был вызван метод. Каждый раз, когда вы вызываете обычный метод внутри другого обычного метода, для этого вызова используется скрытый параметр this . Пример

Код Как оно работает

Именно поэтому нельзя вызвать обычный метод из статического. Внутри статического метода просто нет скрытой переменной с именем this .

Ну или представьте другой случай: в программе еще не создан ни один объект нашего класса. Статический метод класса можно вызвать? Да. А сможет этот статический метод вызвать обычный метод?

И у какого объекта он его вызовет? Ведь еще не существует ни одного экземпляра нашего класса!

Может вызывать статические методы класса

Статические методы можно вызывать откуда угодно — из любого места программы. А значит, их можно вызывать и из статических методов, и из обычных. Никаких ограничений тут нет.

Может обращаться к обычным переменным класса

Из обычного метода можно обращаться к обычным переменным класса, т.к. при этом произойдет обращение к переменным экземпляра класса, который легко получить из скрытого параметра this .

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

Поэтому статические методы не могут обращаться к обычным переменным класса.

Статический метод вызывает обычный метод, вот только у какого объекта он должен вызваться?

Статические методы

Неизвестно ! Поэтому и нельзя вызывать обычный метод из статического, не указывая ссылку на объект!

Может обращаться к статическим переменным класса

Ситуация с обращением к статическим переменным такая же, как и с обращениями к статическим методам. К статическим переменным можно обращаться из любого места в программе. А значит, можно обращаться из статических и обычных методов.

Может быть вызван у объекта

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

Код Как его видит компилятор

Может быть вызван у класса

У класса можно вызвать только статический метод, для вызова обычного метода нужна ссылка на экземпляр класса. Поэтому нельзя вызвать обычный метод конструкцией вида ИмяКласса . имяМетода ( параметры )

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *