2013-09-21 4 views
0

Какова область применения статического метода в Java?Область применения статических методов в Java

1) (Eclipse) Project level 
2) Application level 
3) JVM level 

Чтобы дать вам представление о чем я спрашиваю, если у нас есть класс:

public class MyClass 
{ 
    private static int data; 
    public static void setData(int val) 
    { 
     data = val; 
    } 
    public static int getData() 
    { 
     return data; 
    } 
} 

И если я делаю вызов к setData() метода из другого класса (в том же проекте как MyClass) и передать значение, скажем 10, я смогу получить доступ к набору data (т.е. значение 10) из другого проекта? из другого приложения? и т. д.

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

Если у вас есть официальная документация, сообщите мне об этом.

+3

Это не должно компилироваться. Поскольку 'setData' является' static', он не связан с каким-либо конкретным экземпляром 'MyClass'. Но 'data' - это переменная экземпляра, поэтому' setData' ее не увидит. –

+0

Вы имеете в виду доступ к методу setData или доступ к статическим данным, установленным в классе? –

+3

Ни одна из областей, которые вы указали, не является реальным областью. Java не имеет понятия о проекте, поэтому нет понятия «уровень проекта». Самое близкое к областям уровня «уровень приложения» или «уровень JVM» - это общий охват. Я не уверен, что вы подразумеваете под областью «уровня пользователя», но способность пользователя запускать методы определяется логикой программы, а не «public» или «static» модификаторами. – user2357112

ответ

1

Давайте предположим, что вы говорите о том, есть один «экземпляр» из data и соответствующий статический метод.

Какова область применения статического метода в Java?

1) (уровень Eclipse) Project

No. Исходный код/​​времени создания "проект" структура имеет непосредственное отношение к поведению во время выполнения программы Java. (Построить проект создает один или несколько .class файлов, как правило, закутанные в JAR или WAR или EAR или любой архивные файлы. Поведение во время выполнения зависит от того, как эти файлов загружаются в JVM.)

2) Применение уровень 3) Уровень JVM

Да, нет, может быть.

Фактическая «область существования» (как кто-то ее описал) зависит от идентичности типа класса. При нормальных обстоятельствах класс загружается в JVM один раз. Это дает вам один тип класса, и есть один экземпляр статических переменных для этого типа.

Однако, если ваши загрузчики классов организованы правильно, вы можете снова загрузить класс. Это дает вам новый тип класса (с тем же именем, что и предыдущий ... но другой загрузчик классов), и этот тип класса имеет свой собственный набор статических переменных.

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

Однако приложения (например, webapps), которые запускаются в рамках фреймворка, подчиняются тем, что делает инфраструктура. И типичная платформа приложений использует отдельный загрузчик классов для каждого webapp. Поэтому, если вы включаете JAR-файл в несколько веб-приложений и запускаете их на одном сервере приложений, вы, вероятно, получите несколько типов классов с тем же именем и разными загрузчиками классов ... и разными статическими наборами переменных.

Но это не заканчивается там, потому что когда вы вызываете MyClass.getData() в другом классе (например,OtherClass), переменная, к которой осуществляется доступ, зависит от того, к которому привязан код MyClass код OtherClass. И это зависит от того, что классный загрузчик типа OtherClass привязал его к ... когда он загрузил класс OtherClass.

Все это может быть довольно сложным, но, как правило, вам не нужно беспокоиться об этом. Сложность возникает только тогда, когда что-то делает «умный материал загрузчика классов», и даже тогда умный материал обычно реализует разделение «приложений», которое вам нужно , чтобы произошло.

0

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

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

+0

Это не очень понятно, вы могли бы устоять? – CamelopardalisRex

+1

@AlexBaldwin проверить обновленный ответ. –

+0

@JunedAhsan Я опробовал то, что вы описали во втором абзаце, но я не смог получить доступ к данным. –

2

Вы спрашиваете о контрольной сфере или области существования? Доступ к общедоступному статическому методу может получить любой класс, который может получить доступ к классу метода, учитывая стандартные правила именования/определения области Java. Обратите внимание, что это подразумевает (как часть правил), что доступ доступен только для классов в одной JVM.

существования из данных распространяются до экземпляра java.lang.Class, который представляет класс загружаемый (я уверен, что есть некоторые фантазии термина для этого). В лучшем случае это до конца исполнения JVM, но класс может, при некоторых обстоятельствах, «разгружаться» раньше.

Следует также отметить, что одновременно может быть загружено более одного экземпляра экземпляра (java.lang.Class) данного класса в данной JVM, и каждая копия класса будет иметь свои собственные статические переменные. Однако это было бы довольно редко.

+0

Я спрашиваю о возможности существования. Кроме того, «данные», о которых я говорю, являются «статическими». Будет ли он связан с экземпляром класса? Кроме того, будет ли это иметь значение, если я сделаю сам мой класс «статическим»? –

+1

@RockyInde - Да, в Java статические данные связаны с «экземпляром». Но учтите, что это экземпляр класса, а не экземпляр обсуждаемого класса. Когда класс загружается, экземпляр класса «Class» создается для представления класса, и любые статические данные (по крайней мере, концептуально) связаны с этим. –

+0

Обратите внимание, что вы не можете сделать «внешний» класс «статическим». –

0

Не совсем то, что вы просили, но я считаю, что это может помочь вам понять концепцию методов static.

Пусть говорят, у вас есть класс Foo с статическим методомcalculateFoo1() и нестатической методом calculateFoo2()

Non-статические методы могут быть использованы только в сочетании с object этого класса (класса instance). Поэтому, прежде чем вы сможете вызвать его, вам необходимо создать экземпляр объекта.

Foo f2 = new Foo(); 
cf.calculateFoo2; 

Статический метод можно назвать с использованием имени класса без экземпляра этого класса.

Foo.calculateFoo1(); 

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

0

Вы смешали два понятия сына. static означает, что у вас есть один экземпляр для каждого класса.

Объем зависит от модификаторов доступа (частное, государственное, защищенный, по умолчанию)

Если вы хотите получить доступ этого метода из другого проекта Eclipse, вам нужно добавить этот проект в библиотеку проекта.

Щелкните правой кнопкой мыши на своем новом проекте, выберите «Путь сборки», затем «Добавить в путь сборки». Перейдите на вкладку «Проекты» и добавьте проект, который имеет этот метод getDate.

Теперь вы можете получить доступ к классу MyClass

Смежные вопросы