【问题标题】:About Java function calling关于 Java 函数调用
【发布时间】:2016-12-15 13:13:14
【问题描述】:

当我运行此代码时,有人可以向我解释一下,在我输入第一个键盘输入之前,我没有收到 Sysout 语句?

    import java.util.Scanner;

    public class test1{

            static Scanner scan = new Scanner(System.in);
            static int k = scan.nextInt();

            public static void main(String[] args) {
                setK();
                System.out.println(" K is: " + k);
        }
            public static void setK(){
                System.out.println("Please input K value");
                k = scan.nextInt();
        }
    }

【问题讨论】:

标签: java function methods


【解决方案1】:

test1 类的 static 变量在执行 main 方法之前被初始化。初始化类时会发生这种情况。

因此

static int k = scan.nextInt();

语句在您的 main 方法之前执行并等待输入。只有输入输入后,main才开始运行并调用setK();,它会打印“请输入K值”。

我不确定这是故意的,因为您的 setK() 方法似乎是应该读取输入并将其分配给 k 的方法。因此,将您的代码更改为:

import java.util.Scanner;

public class test1{

        static Scanner scan = new Scanner(System.in);
        static int k;

        public static void main(String[] args) {
            setK();
            System.out.println(" K is: " + k);
    }
        public static void setK(){
            System.out.println("Please input K value");
            k = scan.nextInt();
    }
}

【讨论】:

  • 谢谢你。
【解决方案2】:

这一行

static int k = scan.nextInt();

在类初始化期间运行。它阻塞并等待整数的输入。

此代码在main 之前运行,因为它是static 初始化。它必须在调用类的第一个方法之前完成。此时k 具有您输入的第一个值。之后,main 调用setK,提示输入另一个输入。

您可以通过从 k 的声明中删除初始化(即 = scan.nextInt(); 部分)来解决此问题。

【讨论】:

    【解决方案3】:

    也许您期望的行为如下:

    package test;
    
    import java.util.Scanner;
    
    public class ScannerTest {
    
        static Scanner scan = new Scanner(System.in);
        static int k;
    
        public static void main(String[] args) {
            System.out.println("Please input K value");
            k = scan.nextInt();
            System.out.println(" K is: " + k);
        }
    }
    

    顺便说一句,您应该遵守 Java 命名约定。

    【讨论】:

    • 您能否详细解释一下 Java 命名约定的含义?
    • @911DidBush,谢谢。我以为我做错了什么,所以我问。我已经阅读并会尝试与那些一起去 - 谢谢。
    • 你的标题提到了“功能”。从 Java 8 开始,“函数”一词指的是 lambda 表达式或方法引用的目标(请参阅link)。您的班级名称应该是大小写混合的(请参阅link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2016-11-06
    相关资源
    最近更新 更多