Java - ссылка на статический метод, использующий этот экземпляр класса - PullRequest
0 голосов
/ 25 мая 2011

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

Заранее спасибо.

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

Ответы [ 3 ]

4 голосов
/ 25 мая 2011

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

0 голосов
/ 25 мая 2011

Рассмотрим этот сценарий ...

Class XYZ{

public static void functionTest(){
 // Your code
}

public static void main(String args[]){
XYZ x = new XYZ();
//Here we can execute the method functionTest() in 2 ways.
x.functionTest();
XYZ.functionTest();
}
}

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

И ссылка (x) содержит две части: одна - это фактический адрес объекта (экземпляра), а другая - адрес контекста класса.

Когда мы вызываем x.function () в вышеприведенном сценарии, сначала он всегда ищет контекст класса, если он находит там метод, он его выполняет, если не найден, он выполняет его из экземпляра класса. ,

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

Именно поэтому статические члены класса можно вызывать обоими способами.

и при вызове метода из экземпляра нам не нужно создавать объект, который вообще не требуется (ненужное распределение памяти)

0 голосов
/ 25 мая 2011

Если вы имеете в виду что-то вроде

class Foo {
  static void bar() { ... }
}

public class Baz {
  public static void main(String... argv) {
    new Foo().bar();  // Use static method here via instance
  }
}

тогда экземпляр просто полностью игнорируется.

Если вы делаете это через отражение , то оно также игнорируется.

Если базовый метод является статическим, то указанный аргумент obj игнорируется. Может быть нулевым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...