Ошибка “non-static variable this cannot be referenced from a static context” при попытке создания объекта вложенного класса
Люди, спасите пожалуйста. Написала класс, хочу создать объект, а выдается ошибка “non-static variable this cannot be referenced from a static context”. Звездочками выделила проблемные моменты:
package com.company;
import java.math.BigInteger;
import java.util.BitSet;
import java.util.Random;
public class Main {
// **
public static void main(String[] args) {
BitSet d = new BitSet(128);
BitSet d1 = new BitSet(128);
Bits bits = new Bits(128, d, d1 );
}
// **
class Bits
{
private BitSet bit1, bit2; //поля экземпляра
private int size;
private Random random;
// **
public Bits (int size, BitSet b1, BitSet b2) //конструктор
{
bit1 = b1;
bit2 = b2;
}
// **
}
Как мне создать объект с помощью созданного класса?
Ответы (1 шт):
В ошибке сказано:
non-static variable this cannot be referenced from a static context
Другими словами: вы используете нестатическую переменную this внутри статического контекста метода main.
Вы можете возразить, что явно Вы данную переменную нигде не указывали.
И да, в Вашем коде её нет.
Данную переменную Вы использовали неявно, когда создавали объект Bits.
Фактически он ругается на использование this.Bits.
this.Bits - именно так, потому что данный вложенный класс находится в нестатическом контексте и принадлежит ему.
Вложенные классы подчиняются тем же правилам, что и другие ресурсы класса.
В Вашем случае, например, объект Bits должен иметь доступ к контексту объекта Main.
Но его(экземпляра объекта Main) нет, как и нет его контекста, а следовательно и нет доступа к классу Bits.
Именно поэтому и возникает ошибка.
Отсюда два выхода:
- Создайте объект
Bitsв контексте нового объектаMain:
new Main().new Bits(128, d, d1);
- Объявите вложенный класс в статическом контексте. Для этого достаточно просто добавить модификатор
staticперед объявлением вложенного класса
static class Bits {
// ...
}
Ну и добавлю еще третий вариант:
- Вы можете не использовать вложенные классы, если они Вам не нужны в явном виде.