有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java非静态变量不能从静态上下文引用

我在这个网站上浏览了一段时间,试图找到这个问题的答案,但答案总是太具体,无法帮助我。我遇到问题的代码是当我尝试使用ArithmeticSequence类中定义的构造函数实例化一个新的ArithmeticSequence对象时。然而,Netbeans告诉我这是一个从静态上下文引用的非静态变量。我尝试将类ArithmeticSequence更改为static,但也没有成功,因为出现了一个新的错误,只允许我使用默认构造函数。我试图做的是使用从文件SEQ.in读取的两个值将mySequence实例化为一个新的算术序列。我在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) 个答案

  1. # 1 楼答案

    首先,不应该在构造函数中使用返回类型,如果使用内部类,则必须在内部类之前实例化outerclass

    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;
            }
        }
    }