Нестатическая переменная, на которую нельзя ссылаться из статического контекста
Я некоторое время осматривал этот сайт, пытаясь найти ответ на эту проблему, но ответы всегда слишком специфичны для конкретной программы, чтобы помочь мне. Код, с которым у меня возникают проблемы, - это когда я пытаюсь создать новый экземпляр ArithmeticSequence
объект с помощью конструктора, определенного в ArithmeticSequence
учебный класс. Однако Netbeans говорит мне, что это не статическая переменная, на которую ссылаются из статического контекста. Я пытался изменить класс ArithmeticSequence
на статический, но это тоже не сработало, так как возникла новая ошибка, которая позволила мне использовать конструктор по умолчанию. То, что я пытаюсь сделать, это создать экземпляр mySequence
как новый ArithmeticSequence, используя два значения, считанные из файла SEQ.in
, Я получаю сообщение об ошибке на mySequence = new ArithmeticSequence(FT, SI);
линия. В любом случае, вот код:
import java.io.*;
import java.util.Scanner;
public class SeqTest {
public static void main(String[] args) {
Sequence mySequence;
try (Scanner sc = new Scanner(new FileReader("SEQ.in"))) {
if (sc.hasNext()) {
for (int i = 0; i < 3; i++) {
String Line = sc.next();
Character type = Line.charAt(0);
double FT = sc.nextDouble();
double SI = sc.nextDouble();
switch (type) {
case 'A':
mySequence = new ArithmeticSequence(FT, SI);
}
System.out.println("The first 10 terms in the sequence are:");
System.out.println(mySequence.toString());
System.out.println("The sum of the first 5 terms = " + mySequence.getNthSum(5));
}
}
} catch (FileNotFoundException fnfe) {
System.out.println(fnfe);
}
}
interface SequenceOps {
public double getNthTerm(int n);
public double getNthSum(int n);
}
abstract static class Sequence implements SequenceOps {
private double firstTerm;
public void Sequence() {
firstTerm = 1;
}
public void Sequence(double j) {
firstTerm = j;
}
public double getFirstTerm() {
return firstTerm;
}
@Override
public String toString() {
String q = "";
for (int i = 10; i >= 0; i--) {
q += getNthTerm(i) + ", ";
}
return q;
}
}
public class ArithmeticSequence extends Sequence {
private double comDif;
public void ArithmeticSequence() {
Sequence(1);
comDif = 0;
}
public void ArithmeticSequence(double j, double k) {
Sequence(j);
comDif = k;
}
@Override
public double getNthTerm(int n) {
return getFirstTerm() + (n - 1) * comDif;
}
@Override
public double getNthSum(int n) {
double q = 0;
for (int i = n; i >= 0; i--) {
double j = getNthTerm(i);
q += j;
}
return q;
}
}
public class GeometricSequence extends Sequence {
private double ratio;
public void GeometricSequence() {
Sequence(1);
ratio = 1;
}
public void GeometricSequence(double i, double k) {
Sequence(i);
ratio = k;
}
@Override
public double getNthTerm(int n) {
return getFirstTerm() * (Math.pow(ratio, (n - 1)));
}
@Override
public double getNthSum(int n) {
double q = 0;
for (int i = n; i >= 0; i--) {
q += getNthTerm(i);
}
return q;
}
}
public class FibonacciSequence extends Sequence {
private double secondTerm;
public void FibonacciSequence() {
Sequence(1);
secondTerm = 1;
}
public void FibonacciSequence(double j, double i) {
Sequence(j);
secondTerm = i;
}
@Override
public double getNthTerm(int n) {
double q = 1.6180339887;
return secondTerm * Math.pow(q, n) + getFirstTerm() * Math.pow(q, n);
}
@Override
public double getNthSum(int n) {
double q = 0;
for (int i = n; i >= 0; i--) {
q += getNthTerm(i);
}
return q;
}
}
}
1 ответ
Во-первых, вы не должны использовать возвращаемый тип в конструкторе, и если вы используете внутренний класс, вы должны создать экземпляр внешнего класса перед внутренним классом.
public class SeqTest {
public static void main(String[] args) {
Sequence mySequence = null;
try (Scanner sc = new Scanner(new FileReader("SEQ.in"))) {
if (sc.hasNext()) {
for (int i = 0; i < 3; i++) {
String Line = sc.next();
Character type = Line.charAt(0);
double FT = sc.nextDouble();
double SI = sc.nextDouble();
switch (type) {
case 'A':
mySequence = new SeqTest().new ArithmeticSequence(FT, SI);
}
System.out.println("The first 10 terms in the sequence are:");
System.out.println(mySequence.toString());
System.out.println("The sum of the first 5 terms = " + mySequence.getNthSum(5));
}
}
} catch (FileNotFoundException fnfe) {
System.out.println(fnfe);
}
}
interface SequenceOps {
public double getNthTerm(int n);
public double getNthSum(int n);
}
abstract static class Sequence implements SequenceOps {
private double firstTerm;
public void Sequence() {
firstTerm = 1;
}
public void Sequence(double j) {
firstTerm = j;
}
public double getFirstTerm() {
return firstTerm;
}
@Override
public String toString() {
String q = "";
for (int i = 10; i >= 0; i--) {
q += getNthTerm(i) + ", ";
}
return q;
}
}
public class ArithmeticSequence extends Sequence {
private double comDif;
public ArithmeticSequence() {
Sequence(1);
comDif = 0;
}
public ArithmeticSequence(double j, double k) {
Sequence(j);
comDif = k;
}
@Override
public double getNthTerm(int n) {
return getFirstTerm() + (n - 1) * comDif;
}
@Override
public double getNthSum(int n) {
double q = 0;
for (int i = n; i >= 0; i--) {
double j = getNthTerm(i);
q += j;
}
return q;
}
}
public class GeometricSequence extends Sequence {
private double ratio;
public GeometricSequence() {
Sequence(1);
ratio = 1;
}
public GeometricSequence(double i, double k) {
Sequence(i);
ratio = k;
}
@Override
public double getNthTerm(int n) {
return getFirstTerm() * (Math.pow(ratio, (n - 1)));
}
@Override
public double getNthSum(int n) {
double q = 0;
for (int i = n; i >= 0; i--) {
q += getNthTerm(i);
}
return q;
}
}
public class FibonacciSequence extends Sequence {
private double secondTerm;
public FibonacciSequence() {
Sequence(1);
secondTerm = 1;
}
public FibonacciSequence(double j, double i) {
Sequence(j);
secondTerm = i;
}
@Override
public double getNthTerm(int n) {
double q = 1.6180339887;
return secondTerm * Math.pow(q, n) + getFirstTerm() * Math.pow(q, n);
}
@Override
public double getNthSum(int n) {
double q = 0;
for (int i = n; i >= 0; i--) {
q += getNthTerm(i);
}
return q;
}
}
}