在类外声明后访问变量的范围

Posted

技术标签:

【中文标题】在类外声明后访问变量的范围【英文标题】:Accessing scope of a variable once declared outside class 【发布时间】:2018-01-03 13:56:36 【问题描述】:

嗨,我有这段代码可以获取字符串中最短的单词:-

import java.util.Arrays;

public class Kata 
 public static int findShort(String s) 

   int shortestLocation = null;
   String[] words = s.split("");
   int shortestLength=(words[0]).length();
   for(int i=1;i<words.length;i++)
     if ((words[i]).length() < shortestLength) 
         shortestLength=(words[i]).length();
         shortestLocation=shortestLength;
     
   
   int p = shortestLocation;
   return p;
 

返回变量shortestLocation不能转换为int的错误:-

java:6: error: incompatible types: <null> cannot be converted to int
int shortestLocation = null;

我的问题是如何访问变量的范围,就像在这种情况下我知道出了什么问题。变量最短位置是在 if 语句的范围之外定义的,因此它只考虑初始化它的值。

如何使初始值更改为 if 语句值。这是一个范围问题,请帮助我是初学者。

【问题讨论】:

错误信息告诉你到底出了什么问题。不,这与范围无关。 您不能将 null 分配给原始类型 int。这与范围无关 我修复了它并将值更改为 0,但现在它一直返回 0。我的变量值永远不会更改为 if 语句后返回的值。 如果您的最短长度从 0 开始,您将如何找到字符数少于此的单词? “这个词的长度是否小于0?” - 不,它永远不会,所以变量永远不会改变,所以它总是 0。你的起始最短长度应该是第一个单词的长度。 为什么要初始化p?只返回最短位置。 #off 主题 【参考方案1】:
import java.util.Arrays;

public class Kata 
public static int findShort(String s) 

int shortestLocation = null;

这 ^^ 行需要初始化为整数...不是 'null' 0 很好

String[] words = s.split("");
int shortestLength=(words[0]).length();
    for(int i=1;i<words.length;i++)

您的问题从这里开始 ^^ 当您停在i&lt;words.length 时,您永远不会遍历所有单词,问题是您从 i=1 开始。当i=words.length 不再满足条件时,for 循环就像这样 for(从这里开始;直到不满足;每次都这样做)。

   if ((words[i]).length() < shortestLength) 
        shortestLength=(words[i]).length();
       shortestLocation=shortestLength;
    

    

 int p= shortestLocation;

这里不需要初始化p...只返回最短的位置。

 return p;
        
  

最后的代码是这样的

import java.util.Arrays;

public class Kata 
public static int findShort(String s) 

int shortestLocation = 0;
String[] words = s.split("");
int shortestLength=(words[0]).length();
    for(int i=0;i<words.length;i++)
      if ((words[i]).length() < shortestLength) 
        shortestLength=(words[i]).length();
        shortestLocation=shortestLength;
      

    

 return shortestLocation;
        
  

请记住,要获得“好”的结果,它会严重影响单词列表

正如 cmets 中指出的,初始化您的原始“int p”可能有助于调试。

【讨论】:

您好,感谢您的帮助。我已经让它工作了。我完全消除了shortestLocation 并直接使用return shortestLength 并且它起作用了。但是我的困惑仍然存在,如果我初始化像 x 这样的变量,并在单独的代码块中更改它的值,例如条件语句或循环。当我在该条件块之外返回它时,它会返回我初始化的值还是在通过该条件语句后该值会改变?简而言之,它是随处变化还是仅在 if 语句的范围内发生变化? 如果变量是在循环内部初始化的,那么它的作用域就绑定到该循环,但是您没有这样做,您的变量在外部初始化,因此作用域与类相关。查看静态范围规则 @enemy123 还有什么我可以澄清的吗? 是的,感谢您的帮助,所以我在循环外初始化的值将可以在课堂上的任何地方访问。但是,如果在假设语句中使用了该值,并且我更改了它的值。例如x=1 现在如果我在 if 语句中使用它,它的值将更改为假设 n。现在它的价值是什么?如果我现在在该循环之外访问它,它仍然是 1 还是已被 n 替换?对不起,如果我只是一个初学者感到困惑。 会做的,再次感谢您的帮助,感激不尽。

以上是关于在类外声明后访问变量的范围的主要内容,如果未能解决你的问题,请参考以下文章

Python 类中的变量范围

Python 类中的变量范围

C++面向对象:静态成员和静态成员函数

类的静态变量

static ,const

Python 类的构造,继承,多重继承