关于static访问外部变量的问题

Java中static方法在访问外部方法和变量时有一些约定,例如:

    static方法中在没有创建对象的情况下是不能直接引用非staitc方法或变量的,否则将会发生编译错误:

[java]  view plain  copy
  1. package com.test;  
  2. public class Test1 {  
  3.   
  4.     int a;  
  5.     public void printStr()  
  6.     {  
  7.         System.out.println("Welcome!");  
  8.     }  
  9.     public static void main(String[] args) {  
  10.           
  11.         System.out.println(a);  
  12.         printStr();  
  13.     }  
  14. }  

此代码将会发生编译错误,由于在static main方法中访问了外部非static变量a和方法printStr();

此时只需要将变量a和方法printStr()声明为static即可。

当然还有另外一种解决方法:通过创建对象来引用外部非static变量和方法,好了,上代码:

[java]  view plain  copy
  1. package com.test;  
  2. public class Test1 {  
  3.   
  4.     int a;  
  5.     public void printStr()  
  6.     {  
  7.         System.out.println("Welcome!");  
  8.     }  
  9.     public static void main(String[] args) {  
  10.           
  11.         Test1 test=new Test1();  
  12.         System.out.println(test.a);  
  13.         test.printStr();  
  14.     }  
  15. }  



这里多嘴提一下

public class Test {
public static void main(String args[]) {
int i= 1; //为什么???
}

}

这段代码并没有问题

静态方法不可以调非静态变量,而a属于局部变量,方法内定义的,可以使用

首先理解为什么静态方法不能调用或者使用非静态变量:

一个先后顺序。静态变量是在编译的时候就划分存储空间了,而非静态变量在运行时在划分存储空间。所以静态变量不能调用非静态变量。

专业:
你说法有问题:不是静态方法不能存在非静态变量,而是静态方法不能调用非静态变量。现在的变量a仅仅是main方法一部分当然可以存在咯。

通俗(举例):
静态方法相当于 长辈,非静态方法(变量)相当于晚辈。静态方法不能调用非静态变量是因为,当长辈出生的时候,他不知道会有晚辈。而晚辈出生的时候他是知道有个长辈的。

以下代码才有误
public class Test {
private int a ;
public static void main(String args[]) {
a = 1;
}
}
按通俗的说, 长辈main出生的时候,晚辈a 还没出生,也就是世界上没有晚辈a,所以main不能调用a
而晚辈a出生的时候,长辈main已经存活于世上。如果a是方法,那么他能调用main

而你写的代码。变量a仅仅是main方法一部分。通俗的说,你写的代码里的变量a是他一部分比如一只手,或者一只脚。



你可能感兴趣的:(关于static访问外部变量的问题)