A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. public class test {
  2.         String a="a";
  3.         int x=1;
  4.         static int y=2;
  5.        
  6.         public static void main(String[] args) {
  7.                 int z=3;
  8.                
  9.                 System.out.println(a);
  10.                 System.out.println(x);
  11.                 System.out.println(y);
  12.                 System.out.println(z);
  13.         }
复制代码
编译时,就不让我输出
System.out.println(a);
System.out.println(x);

但是允许输出
System.out.println(y);
System.out.println(z);

为什么?我觉得a和x作为全局变量可以输出啊。
如果这个时候都不能输出?
那么什么时候可以输出呢?
或者怎样输出呢?

评分

参与人数 2技术分 +1 黑马币 +60 收起 理由
刘峰 + 60 赞一个!
Rancho_Gump + 1

查看全部评分

12 个回复

倒序浏览
静态是不能访问非静态的:主函数的静态的,而你的成员变量y和z是非静态的,所以不能打印了
你可以看一下报的是什么错,这样也可以帮你学习的
回复 使用道具 举报
a,x是不是静态的变量,main是静态的
回复 使用道具 举报
static:被修饰后的对象/变量,称为静态变量,静态变量的生命周期和所属的类是一样的.他所属于类,直接用类名. 变量/方法调用.
静态方法内:只能有静态变量,
当一个方法体内有静态变量时,他也应该声明为静态方法.
回复 使用道具 举报
将a,x变量设置成静态的就可以了,或者直接放到主函数里,因为主函数是静态的,所以只能调用静态方法或用静态变量。你可以试试在类里定义一个非静态方法,主函数调用肯定会出错。。。。毕向东老师JAVA视频第5天还是第6天将static里有解释。希望能帮到你。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 鼓励个

查看全部评分

回复 使用道具 举报
静态方法只能访问静态
主函数为静态的你的函数不是静态 主函数不能调用
语法:static:被修饰后的对象/变量,称为静态变量,静态变量的生命周期和所属的类是一样的.
方法作用:直接用类名. 变量/方法调用.
当一个方法体内有静态变量时,他也应该声明为静态方法.
回复 使用道具 举报
大哥啊 我感觉你对这个static的理解的不够深入啊
这么给你说吧,static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。
只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。

在你的这个程序里因为主函数是静态的,所以只能调用静态方法或用静态变量static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
类名.静态方法名(参数列表...)
类名.静态变量名
用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块(用处非常大,呵呵)。
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,
JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
我给你举一个复杂一点的例子 比如:
public class Test5 {
private static int a;
private int b;
static{
Test5.a=3;
System.out.println(a);
Test5 t=new Test5();
t.f();
t.b=1000;
System.out.println(t.b);
}
static{
Test5.a=4;
System.out.println(a);
}
public static void main(String[] args) {
// TODO 自动生成方法存根
}
static{
Test5.a=5;
System.out.println(a);
}
public void f(){
System.out.println("hhahhahah");
}
}
运行结果:
3
hhahhahah
1000
4
5

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
张子凯 发表于 2013-2-26 11:31
将a,x变量设置成静态的就可以了,或者直接放到主函数里,因为主函数是静态的,所以只能调用静态方法或用静态 ...

因为主函数是静态的,所以只能调用静态方法或用静态变量。
这句很受用
回复 使用道具 举报
王文正 发表于 2013-2-26 13:08
大哥啊 我感觉你对这个static的理解的不够深入啊
这么给你说吧,static表示“全局”或者“静态”的意思, ...

让您费心了,谢谢
回复 使用道具 举报
黑马-张洋 发表于 2013-2-26 13:43
让您费心了,谢谢

呵呵 相互学习 不用客气 好好看视频!
回复 使用道具 举报
主函数是static修饰的,静态时只能访问静态,不能访问非静态成员
你把不能输出的 a, x用static修饰就可以输出了
回复 使用道具 举报
还是建议LZ看一下基础视频吧,就是关于静态的那块,看了应该就能了解了。
回复 使用道具 举报
被主函数调用的成员变量跟成员方法都要定义成静态的,因为main方法是静态的么
  1. public class test {
  2. static String a="a";
  3. static int x=1;                          //这样就O了
  4.         static int y=2;
  5.         
  6.         public static void main(String[] args) {
  7.                 int z=3;
  8.                
  9.                 System.out.println(a);
  10.                 System.out.println(x);
  11.                 System.out.println(y);
  12.                 System.out.println(z);
  13.         }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马