2017-01-04 3 views
3

У меня есть этот код в Java Я пишу его NetBeansдоступ к статическим членам класса в статических методах

class sample 
{ 
    public static int x; 
    public int y; 
    sample() 
    { 
     x=0; 
    } 
} 
public class JavaApplication1 { 

    /** 
    * @param args the command line arguments 
    */ 
    sample cchild=new sample(); 

    public static void main(String[] args) { 
     // TODO code application logic here 
     sample.x=0; 
     cchild.x=9; // here error 
    } 

объяснить образец:

Я сделать композицию класса образца, класс образца содержит статическую переменную x, но когда я пытаюсь получить доступ к статической переменной x от экземпляра cchild in st atic метод компилятор делает ошибку, поэтому в java я не могу получить доступ к объекту в статическом методе, даже если экземпляр содержит статический член ???

+0

ok, но я могу получить доступ cchild к статическому члену, он позволяет мне получить доступ к статическому члену по имени класса, почему я не могу получить доступ к статическому члену по имени экземпляра в статическом методе? @Johnny Mo pp – kernal

+0

Если метод не статический, я могу ссылаться на статическое поле через объект @Abhishek – kernal

+0

@kernal Я думаю, что вы недопонимаете ... проблема заключается не в доступе к x через cchild ... это возможно ... проблема в доступе к cchild (нестатический) внутри статической функции –

ответ

3

Первое, вы должны понимать, что static членов принадлежат к class, а не к insta nce, и поэтому их можно получить непосредственно без необходимости создания ссылки на экземпляр класса. Следующий оператор получает доступ к static члена x в классе sample где sample это имя класса и x является static членом sample:

sample.x = 0;

Следующее утверждение с другой стороны, не работает, поскольку ссылка cchild не static и, таким образом, поле экземпляра в то время как main является static методом. Поле экземпляра невозможно получить в методе static без ссылки на экземпляр класса.

cchild.x = 9

Для приведенного выше заявления на работу, вы либо объявить cchild, как static в JavaApplication1 или создать экземпляр JavaApplication1 в main, как показано ниже:

JavaApplication1 instanceOfJApp = new JavaApplication1(); 
instanceOfJApp.cchild.x=9; 
3

Это должно сработать. Вам нужно объявить переменную cchild статическим членом класса JavaApplicaiton1, чтобы получить доступ к ней статически.

class sample 
{ 
    public static int x; 
    public int y; 
    sample() 
    { 
     x=0; 
    } 
} 

public class JavaApplication1 { 

    // NEW BIT - by making this variable static we can now access it without needing an instance of the object. 
    static sample cchild=new sample(); 

    public static void main(String[] args) { 
     sample.x=0; 
     cchild.x=9; 
    } 
} 

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

Оригинал не работает, потому что, хотя вы пытались получить доступ к статической переменной из статического контекста (внутри основного статического метода), вы создавали переменную, которую вы использовали для доступа к статической переменной (cchild) в нестатический контекст (в определении класса). Не маркируя переменную cchild «static», она становится переменной экземпляра класса JavaApplication1 и поэтому может использоваться только в том случае, если вы создаете экземпляр класса JavaApplication1, вызывая конструктор, а не в основном методе, который создается статически.

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

Есть еще несколько вещей, которые вы можете сделать по-другому в этом примере кода. Во-первых, я бы предположил, что вы используете соглашение об именах Java, чтобы начинать имя ваших классов с большой буквы (вместо этого вместо примера выборки), иначе они не будут выглядеть как имена классов для людей Java.

+0

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

+0

ok Спасибо за ваш ответ – kernal

1

Это потому, что применение

static void main(String[] args){ 
} 

не делает экземпляр JavaApplication1.

2

Есть 2 вещи, которые вы можете сделать, чтобы исправить вашу проблему:

  1. Сделать cchild статическую

  2. Переместить декларацию cchild к вашей main методе

+0

спасибо verey much – kernal

+0

@kernal добро пожаловать! Рад, что смог помочь! – brso05

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