局部变量

“你好,我亲爱的学生!是时候认真对待变量了。但是这次我们不会讨论它们的内部结构。相反,我们将关注变量如何与它们所在的代码交互。

“在方法内部声明的所有变量都称为局部变量局部变量仅存在于声明它的代码块中。或者更准确地说,它从声明的那一刻起一直存在到块的末尾声明它的代码。”

“显然,我需要一个例子。”

“没问题。给你:

代码 变量可用性
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     while (true)
     {
       int x = a + b;
       System.out.println(x);
     }
     System.out.println(b);
   }

}


a
a
a
a, b
a, b
a, b
a, b, x
a, b, x
a, b
a, b
a
a

“让我们再复习一次访问局部变量的规则。这是一段代码。它的开始和结束标记是什么?”

“大括号?”

“正确。这可能是一个方法体,一个循环体,或者只是一个条件语句的代码块。在代码块中声明的变量一直存在到该代码块的末尾。告诉我,将在哪里如果在循环体中声明变量,则该变量存在?”

“它将只存在于循环体中。”

“没错,而且每次循环都会创建和销毁它。”

“这意味着你不能在一个方法中声明两个同名的局部变量——程序将无法编译。但如果声明变量的代码块不重叠,你就可以这样做。

“你是我的最爱是有原因的,阿米戈。再举一个例子来巩固你的大脑。

代码 可变可见性
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     System.out.println(b);
   }

   if (a < 20)
   {
     int b = 20;
     System.out.println(b);
   }
}


a
a
a
a, b
a, b
a
a
a
a
a, b
a, b
a

“我们能够声明第二个局部变量,b仅因为第一个变量在声明b第二个变量的代码块中不可见。b

参数

“正如我们之前所说,每个方法都可以有我们称之为参数的变量。它们的可见性和生命周期呢?”

“嗯……我难住了……”

“这里的一切都很简单。参数是在执行进入方法时创建的(即当方法的代码开始执行时)。当方法结束时它们被消除。”

“也就是说,它们在整个法体中都是可见的,而且只存在于那里?”

“是的。例子:

代码 可变可见性
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     while (true)
     {
       int x = a + b;
       System.out.println(x);
     }
     System.out.println(b);
   }

}

args
args, a
args, a
args, a
args, a, b
args, a, b
args, a, b
args, a, b, x
args, a, b, x
args, a, b
args, a, b
args, a
args, a

“正如我们之前所说,args它只是一个类型为字符串数组的变量。和所有参数一样,它在方法体内的任何地方都可用。也就是说,我们通常在示例中忽略它。

类中的变量

“请记住第 1 级的课程,我们说一个类可以有方法和变量。方法有时称为实例方法,而变量 — 实例变量或字段。

“类的变量(或字段)是什么?

它们是不是在方法中而是在类中声明的变量。”

“他们在那里干什么?”

“对于初学者来说,可以从一个类的任何(非静态)方法访问它们。粗略地说,实例变量是一个类的所有方法共享的变量。

例子:

代码 可变可见性
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     count++;
   }

   public void remove(int data)
   {
     sum = sum - data;
     count--;
   }
}


count
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum
count, sum

“在这个例子中,我们有两个方法——add()remove()add()方法增加sumcount实例变量,remove()方法减少sumcount变量。这两种方法都适用于共享实例变量。”

“我都明白了!局部变量在方法执行时存在。只要对象存在,类的实例变量就存在于类的对象中。”

“干得好,阿米戈。我们已经奠定了一些基础,你将在下一个级别了解有关某个类对象的详细信息。

静态变量

“和方法一样,类中的变量可以是静态的,也可以是非静态的。静态方法只能访问静态变量。

“我对静态变量还没有很清楚的认识。”

“哦,我知道,但别担心。现在,先适应它们。熟悉它们。在第 11 关中,我们将分析静态变量和方法的结构,您将了解这些的原因限制。

“要创建静态变量(类变量),必须static在其声明中写入关键字。

“静态变量不绑定到声明它们的类的对象或实例。相反,它们属于类本身。这就是为什么即使没有创建类的单个对象它们也存在的原因。你可以参考他们来自其他类,使用如下结构:

ClassName.variableName

例子:

代码 可变可见性
public class Solution
{
   public void add(int data)
   {
     Storage.sum = Storage.sum + data;
     Storage.count++;
   }

   public void remove(int data)
   {
     Storage.sum = Storage.sum - data;
     Storage.count--;
   }
}

public class Storage
{
   public static int count = 0;
   public static int sum = 0;
}

Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum



Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum

“在上面的示例中,我们创建了一个单独的Storage类,将countsum变量移入其中,并将它们声明为static。公共静态变量可以从程序中的任何方法访问(而不仅仅是从方法中访问)。”

“我不是很明白,但这对我来说似乎很方便。”

“确实如此。有时这是必要的。如果没有静态变量和方法,我们就会陷入困境。”

“希望,我能慢慢弄明白。”

“是的,你当然会。”