-7

今天突然意识到,当我尝试为 main 方法声明一个变量时,Java 从来没有为局部变量指定访问级别。我也尝试给它一个访问级别修饰符,但它没有编译。错误是: 参数 t1 的非法修饰符;只允许final

package myThread;

import java.lang.Thread;
import java.lang.String;
import java.lang.System;

public class PrintThread extends Thread{ //extends Thread class

    private long sleepTime;

    public PrintThread(String name)
    {
        super(name);
        this.sleepTime = (long) (java.lang.Math.random() * 5000);

        System.out.println("Thread: " + getName() + ", sleepTime: " + sleepTime);
    }

    public void run() // override run method
    {
        System.out.println(getName() + " go to sleep...");
        try
        {
            sleep(sleepTime);
        } catch (InterruptedException e)
        {
            e.getMessage();
        }
        System.out.println(getName() + " out of sleep!");
    }

    public static void main(String[] args)
    {
        public PrintThread t1 = new PrintThread("T1"); // CANNOT COMPILE
        t1.start(); // start thread by start() method
    }
}

众所周知,我们需要使用public protected package private static final等来指定 java 类的成员变量。

但是我们从不为类方法(静态或非静态)变量这样做。

我整天都被这个概念所困扰。以前,我只是照常写java代码,但没有意识到这种现象。

你能给我一些提示吗?我不能仅仅通过消除t1 的公共关键字来说服自己。

4

3 回答 3

3

因为没有意义。方法中声明的变量是方法的局部变量;即它们不能在方法之外访问。为什么以及如何在方法之外修改这些变量?方法之外的代码甚至不知道它们,因此您不需要保护它们免受外部代码的影响。

于 2013-04-21T09:48:14.703 回答
2

您不能在方法内添加访问修饰符,因为它仅属于您创建变量的方法。所以在方法中添加访问修饰符是没有用的

于 2013-04-21T09:47:06.213 回答
0

方法变量的范围仅限于该方法。当方法启动/变量声明并在方法结束时销毁时,此平均引用会在堆栈上创建。

允许它公开或任何其他访问说明符不会有任何好处,因为该字段不会存在于方法之外。

另一个问题你将如何在方法之外访问它们?

class A{
   public String s="test";
   void myMethod(){
     public String s=this.s+"not allowed"; // If allowed how will you access the local s variable outside of method??? 
   } 

因此编译器不允许使用这些访问说明符,因为没有使用声明它们。

于 2013-04-22T05:17:22.230 回答