【问题标题】:How can I assign variables to my class constructor if they are static?如果变量是静态的,如何将变量分配给我的类构造函数?
【发布时间】:2020-09-27 18:34:14
【问题描述】:

我遇到了一个问题,我正在使用一种方法来获取用户数据并且该方法是返回一个对象。问题是每当我将输入的值分配给类构造函数时,我都会遇到一条错误消息,指出“无法从静态上下文引用非静态变量”。我知道我的方法是使用 public static [return value] 声明的,这最终导致了这个问题。不过,作为该项目的一部分,我必须将方法保持为静态。这让我以某种方式操纵类或类构造函数,但我不确定如何做到这一点。

这是类和类构造函数:

public class Project1 {

    public class Student {
        String name;
        String ID;
        float GPA;
        int creditHours;
        double tuitionCost;

        public static Student (String name, String ID, float GPA, int creditHours, double tuitionCost) {
            this.name = name;
            this.ID = ID;
            this.GPA = GPA;
            this.creditHours = creditHours;
            this.tuitionCost = tuitionCost;
        }
    }

这就是我尝试将用户输入的数据分配给类构造函数的方式。

    Student ret = new Student();

    ret.name = name;
    ret.ID = ID;
    ret.GPA = GPA;
    ret.creditHours = creditHours;
    ret.tuitionCost = tuitionCost;

    return ret;

如果读取的值是静态的,如何将我从用户(使用 Scanner)读取的值分配给类构造函数?

注意:我是 Java 新手,所以我的一些行话可能有点离题。

【问题讨论】:

  • 你不能有一个静态构造函数。根据什么要求需要静态方法?
  • Student 之前删除static。这不适合构造函数。然后,使用所有五个参数调用该构造函数。 不可能将构造函数标记为static
  • 但是,您可以使用调用普通构造函数的静态工厂方法。
  • 你的 Student 类应该是静态的。或者,更好的是,删除Project1 类的声明,这是没有意义的。

标签: java class


【解决方案1】:
  • static 不允许在 Java 中使用构造函数

  • 那么您的Student不是静态的,这意味着它只能由父级Project1创建

    公共类 Project1 {

     public class Student {
    
         public Student() {
         }
     }
    
     public static void main(String... args) {
         Project1 project1 = new Project1();
         Student student = project1.new Student();
     }
    

    }

  • 如果你想在没有Project1 的情况下使用Student 类,你必须使Studentstatis

    公共类 Project1 {

     public static class Student {
    
         public Student() {
         }
     }
    
     public static void main(String... args) {
         Student student = new Project1.Student();
     }
    

    }

【讨论】:

    【解决方案2】:

    问题的标题看似很简单,但描述却很混乱:

    如果变量是静态的,如何将变量分配给我的类构造函数?

    根据我的理解,如果你想在你的构造函数中分配一些静态变量,那么首先你应该在你的类中存在静态变量,这似乎是缺失的。但是你还缺少更多的东西。

    java中没有静态构造函数,你可能需要参考:

    Why a constructor cannot be staticCan we define static constructors

    我怀疑您发布的代码 sn-p 是否可以编译,因为编译器应该会抛出错误,因为您永远不能在类中拥有静态构造函数。

    现在进入您的实际问题:

    如果读取的值是静态的,如何将我从用户(使用 Scanner)读取的值分配给类构造函数?

    我稍微修改了你的代码来解决你的问题:

    package com.sopra.banking.compliance.report.backend.common.bean;
    
    import java.util.Scanner;
    
    public class Test
    {
        public static class Student
        {
    
        String name;
    
        public Student()
        {
    
        }
    
        public Student(String name)
        {
            Student student = readValues();
            this.name = student.name;
        }
    
        static Student readValues()
        {
            Scanner sc = new Scanner(System.in);
            Student student = new Student();
            String name = sc.next();
            student.name = name;
            return student;
            }
        }
    }
    

    附带说明一下,您有一个内部类,如果您想在一个内部类中定义一个静态方法,那么您需要将该类设为静态。

    【讨论】:

      【解决方案3】:

      构造函数不能是静态的。方法可以。

      如果您需要一个返回学生的静态方法,它看起来像

      public static Student buildStudent(String name, String ID, float GPA, int creditHours, double tuitionCost) {
          Student ret = new Student();
      
          ret.name = name;
          ret.ID = ID;
          ret.GPA = GPA;
          ret.creditHours = creditHours;
          ret.tuitionCost = tuitionCost;
      
          return ret;
      }
      

      但是,使用实际的构造函数可以说更直接地创建对象

      【讨论】:

        猜你喜欢
        • 2022-07-21
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-04
        • 1970-01-01
        相关资源
        最近更新 更多