对静态方法(main)不能调用非静态方法 理解不了

烟草味淡淡 2011-10-11 09:02:04

public class MainTest {
TT t = new TT();
public void go() {
System.out.println("is going");
}

public static void main(String[] args) {
t.play();
go();
}
}

class TT {
public void play() {
System.out.println("TT play");
}
}

代码如上。我知道main方法是静态的 ,但是就是不能理解一些用法。比如上面的代码。
t.play(); 和go();都调用错了。
为什么把 TT t = new TT(); 放到main方法里面以后,t.play()就能调用呢,
go方法又该怎么调用呢
很菜的问题。希望高手解答下
...全文
863 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
烟草味淡淡 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 stonefeng 的回复:]

引用 6 楼 sammiriche 的回复:
想请问下创建对象MainTest m = new MainTest(); 为什么要写在main()方法以内呢。写在外面就不能
用m.go()这个形式了

main方法是程序的入口,程序从这里开始运行,main方法刚开始运行的时候,MainTest类的其他部分还只是定义,并没有参与运行。如果你要在main方法里面调用go(),就要通过go()所……
[/Quote]

谢谢。茅塞顿开。
疯癫行者 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sammiriche 的回复:]
想请问下创建对象MainTest m = new MainTest(); 为什么要写在main()方法以内呢。写在外面就不能
用m.go()这个形式了
[/Quote]
main方法是程序的入口,程序从这里开始运行,main方法刚开始运行的时候,MainTest类的其他部分还只是定义,并没有参与运行。如果你要在main方法里面调用go(),就要通过go()所在的对象调用,因此,在调用之前保证这个对象存在,也就是在main方法里面创建该对象,因为只有在main方法里面才能够被执行到。
阳明 to life 2011-10-11
  • 打赏
  • 举报
回复
class Test
{
public Test()
{
//这里是定义构造函数,默认的不写也可以
}
T t;//这里是成员变量
public static void main(String[] args)
{
T t;//这里是局部变量
new Test();//可以认为是调用构造函数,new对象,这里不是定义构造函数
}
}
阳明 to life 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sammiriche 的回复:]

引用 1 楼 zhouyuqwert 的回复:

静态加载后,对象可能未建立,所以为避免这种错误,编译不让过
静态可以调用静态 非静态既可以调用静态也可以调用非静态
你这里改成new MainTest ().t.play();new MainTest ().go();
这些都是成员属性 要对象来访问

恩。
还想问下。如果不用你说的方法,如果在main方法里面定义
TT t =……
[/Quote]
main方法里面就不是MainTest的成员了 那是局部变量
那不是定义构造函数,那是new对象,这两个是有区别的
烟草味淡淡 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 stonefeng 的回复:]

静态成员从属于类,非静态成员从属于对象,即只有创建对象之后非静态成员才有意义,所以要调用非静态成员,必须通过对象调用。因此在主方法中在没有创建对象的情况下,想调用对象的成员是不合乎逻辑的,因此编译器会报错,提示程序逻辑有问题。
[/Quote]

想请问下创建对象MainTest m = new MainTest(); 为什么要写在main()方法以内呢。写在外面就不能
用m.go()这个形式了
烟草味淡淡 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhouyuqwert 的回复:]

静态加载后,对象可能未建立,所以为避免这种错误,编译不让过
静态可以调用静态 非静态既可以调用静态也可以调用非静态
你这里改成new MainTest ().t.play();new MainTest ().go();
这些都是成员属性 要对象来访问
[/Quote]
恩。
还想问下。如果不用你说的方法,如果在main方法里面定义
TT t = new TT();
就可以直接用t.play().这又是为什么呢?

还有MainTest()的构造方法也为什么要写在main方法以内呢。
写在main以外,类以内为什么不行呢
疯癫行者 2011-10-11
  • 打赏
  • 举报
回复
静态成员从属于类,非静态成员从属于对象,即只有创建对象之后非静态成员才有意义,所以要调用非静态成员,必须通过对象调用。因此在主方法中在没有创建对象的情况下,想调用对象的成员是不合乎逻辑的,因此编译器会报错,提示程序逻辑有问题。
孟祥月 2011-10-11
  • 打赏
  • 举报
回复
java中都是对象,方法都是通过对象去调用的
walkman_22 2011-10-11
  • 打赏
  • 举报
回复
顶楼上。
阳明 to life 2011-10-11
  • 打赏
  • 举报
回复
静态加载后,对象可能未建立,所以为避免这种错误,编译不让过
静态可以调用静态 非静态既可以调用静态也可以调用非静态
你这里改成new MainTest ().t.play();new MainTest ().go();
这些都是成员属性 要对象来访问

62,614

社区成员

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

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