初学问题

Feynmann 2009-09-09 12:05:45
刚开始学java,有个问题搞不清楚,请教各位。
写了下面的一段程序
public class test{
class test{
int i;
char c;
}
public static void main(String[] args){
System.out.println(new test());
}
}
为什么JDK编译器说静态方法不能调用非静态变量呢?
我换成下面这么写编译和运行都对的。
public class test{
public static void main(String[] args){
class test1{
int i;
char c;
}

System.out.println(new test1());
}
}

这么写也是对的:
class test1{
int i;
char c;
}
public class test{
public static void main(String[] args){
System.out.println(new test1());
}

不太懂static的意思,我看到Thinking in Java上第一个程序大概就是这么写的:
import java.util.*;
public class test{
public static void main(String[] args){
System.out.println(new Date());
}
我查了一下JDK的文档,Date好像也不是一个static的对象,为什么能在static的main方法里用呢?而我一开始那个程序却编译不过。
...全文
93 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanliang_xt 2009-09-09
  • 打赏
  • 举报
回复
静态方法往往不用实例化就可以访问,所以它要求它所使用的方法和属性必须同样是静态才行,如果要使用非静态的就必须先实例化。当然在方法体内部就没有静态与非静态之说了.像new Date();因为在方法体内部申明的所以与静态还是非静态无关。

public class test{
class test{
int i;
char c;
}
public static void main(String[] args){
System.out.println(new test());
}
}



这为什么编译失败?

因为println()中的new test()是内部类,必且是类范围里的,你可以把这看作是一个类的属性,显然静态方法无法访问非静态的,必须有一个外部类的引用才能访问,所以在new test()时还要有个外部类的实例。形如:外部内实例.new test();


public class test{
public static void main(String[] args){
class test1{
int i;
char c;
}

System.out.println(new test1());
}
}



这个为什么可以编译成功?

你同样可以把在这儿定义的类看成定义的一个变量,显然在方法内部可以对它进行任意的访问,不管它是什么修饰符。


import java.util.*;
public class test{
public static void main(String[] args){
System.out.println(new Date());
}



System.out.println(new Date());
你可以看成是 Date d = new Date()
System.out.println(d);
因为它是方法自己申明的,当然没有问题的。方法在初始化时可以对其进行初始化。
sforiz 2009-09-09
  • 打赏
  • 举报
回复
如果你是初学者,最好不要从Thinking In Java这本书,从一些基础些的书籍开始。
你遇到的问题,可能Thinking In Java没有很充分的回答,它不是基础书籍。
static ,inner class,instance object 这些关键字或概念就很容易理解你遇到的这几个问题了。
jayqean 2009-09-09
  • 打赏
  • 举报
回复
类加载时候,先加载静态变量,再初始化成员变量
i不是静态变量,静态方法main()不能访问非静态变量
Date是util包中的一个类 不是类的修饰符 不存在静态之说
new Date() new出一个时间对象的引用
我也只能这么解释了``俺也只是个新手
yanchong 2009-09-09
  • 打赏
  • 举报
回复
你程序的两个方法重名了!
jayqean 2009-09-09
  • 打赏
  • 举报
回复
sf

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧