@k5hu Ответов: 1

Почему я не могу создать внешний метод класса ?


Я пробовал эту программу, чтобы прояснить сомнения относительно методов getter и setter, но я получил неожиданную ошибку "StackOverflowError" в строке 1, упомянутой в приведенном ниже коде:
public class GetterSetter {
    private int a=10;
   GetterSetter gs=new GetterSetter();//line 1
   static GetterSetter gsr=new GetterSetter();//line 2
    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }
    public void setB(int b)
    {
       return; 
    }
    public int getB()
    {
    return 1;
    }
    public int check()
    {return a;}
}
class Check
{   Check c=new Check();//line 3
    public static void main(String[] args) {
        GetterSetter gs=new GetterSetter();
        gs.setA(50);
        System.out.println(gs.getA()+"\n"+gs.check());
    }
}


Может ли кто-нибудь объяснить эту проблему здесь? Я в замешательстве.

Что я уже пробовал:

I tried line 2 and 3 but no error in line 2 and also in line3

1 Ответов

Рейтинг:
1

Eric Lynch

Потому что в строке 1 каждый раз, когда вы создаете экземпляр GetterSetter, вы создаете дополнительный GetterSetter, который (из-за строки 1) требует, чтобы вы создали дополнительный GetterSetter, который создает дополнительный GetterSetter, и так далее, и так далее on...ad бесконечность.

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

Дополнительные сведения о различиях между статическими и нестатическими полями см. В разделе "статические и нестатические поля" по следующей ссылке:

http://tutorials.jenkov.com/java/fields.html


@k5hu

Сэр, но почему нет ошибки в строке 3?

Eric Lynch

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

Поскольку я не могу, я подозреваю, что, возможно, вы предполагаете сходство в создании экземпляра или утлизации, которого не существует. Если вы описываете все точно и полностью, разница в поведении между двумя почти идентичными классами имеет нулевой смысл. Единственное различие в объявлении-это различие в защите класса ("public" против default). Это не имело бы смысла в качестве объяснения разницы в поведении...без сопутствующей разницы в создании / использовании экземпляров.

@k5hu

ouptut:
Ява.яз.StackOverflowError
в ока.GetterSetter.<init>(GetterSetter.java:16)
в ока.GetterSetter.<init>(GetterSetter.java:16)
в ока.GetterSetter.<init>(GetterSetter.java:16)
в ока.GetterSetter.<init>(GetterSetter.java:16)
в ока.GetterSetter.<init>(GetterSetter.java:16)
в ока.GetterSetter.<init>(GetterSetter.java:16)
в ока.GetterSetter.<init>(GetterSetter.java:16)
в ока.GetterSetter.<init>(GetterSetter.java:16)
в ока.GetterSetter.<init>(GetterSetter.java:16)
.
.
.
упоминается только строка 16 которая здесь является строкой 1

но в этом :
образец класса {

Образец s = новый образец();//строка 1
статический образец sa = новый образец();

проверьте недействительным(образец с) {
Системы.из.код println(это.ы == ы);
}


}

общественного класса другим
{ О=новый();//строка 2
статический других ВЗ=новый другие();
публичный статический пустота главный(строка[] аргументы) {
нового образца().регистрация(нового образца().с);
}
}
выход:
та же ошибка в строке 2

и в этом:
образец публичного класса {

Образец s = новый образец();//строка 1
статический образец sa = новый образец();

проверьте недействительным(образец с) {
Системы.из.код println(это.ы == ы);
}

публичный статический пустота главный(строка[] аргументы) {
нового образца().регистрация(нового образца().с);
}
}

класс другой
{ Other o=new Other();//строка 2
статический других ВЗ=новый другие();

}
но вот выход :
та же ошибка в строке 1

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