java中定义调用方法时的一些问题?

publicclasswork{publicStringname;publicstaticvoidlearn(Stringname){System.out.println... public class work {
public String name;
public static void learn(String name){
System.out.println("我的名字是"+name);
return;
}
}
这是我定义的对象和方法
public class worktest {
public static void main(String[] args) {
work one = new work();
work.learn("张三");
}
}
这是调用方法
在定义方法时public static void learn(String name){当中为何要有static
没有static就报错 说必须有static
如何不加static呢
展开
 我来答
SystemJava
2012-04-18
知道答主
回答量:43
采纳率:0%
帮助的人:28.9万
展开全部
static修饰的成员是类成员:其调用可以用“类名。成员名”“对象名。成员名”这两种方式调用无差别。
非static修饰的成员是实例(对象)成员:其调用必须用“对象名。成员名”调用。
只要你使用上述方法去调用,无论你是在“static调用非static,还是在非static调用static,static调用static,非static调用非static”,都是可以的,而且是最标准的。(注:有得书上写static不能调用非static这句话的前提是同一个类内的直接调用,我本人不建议直接调用非static成员)
关于调用强调
非static调用非static若为同一个类的内部成员也可直接调用不必加对象名,但和加对象名的在内存中是有区别的;

哎又说多了。总之楼主牢记:无论在任何地方只要:static用“类名。成员名”调用,非static用“对象名。成员名”就不会错。语法就这样。

如果非要进一步:static成员属于类,非static成员属于对象(想理解这句话要更进一步)
更进一步,那就到java运行时内存分布了:
java 运行时内存分为堆,栈,方法区(还有寄存器,和本地方法栈,这两个用不到,除非你开发JVM)。一个class文件类加载后就放到了java运行时的内存区里,怎么放的如下:
类刚被加载时所有类的信息都放入方法区(也叫永久区,也就是永远存在的区),方法区里有常量池用来存放 常量 包括String常量,其他的(包括所有的修饰符啦,标示符啦方法代码了等等)也都放在方法区,总之类class被放在方法区。
这也就是说所有的类信息都在方法区,同时方法区会为常量,Static变量开辟额外空间存储其数值(非Static方法内的变量方法区内只存储其代码(方便理解叫代码,其实应该叫字符),其值是存在栈内)。
堆内存储的是对象(书上写的),严格意义上说,堆存储的是每个类非Static变量(类的实例成员属性)的值,和一个指向生成该对象的类的指针(目的指向类Static变量和常量池,这也是为什么static可以“对象名。成员名”调用的原因),一些指向其他对象的指针(对象不能嵌套,多维数组的相关语法来源于此)。因为方法区没有指针指向堆,所以非static成员你不能用类名。成员名调用

选我吧,打了这么多
你说的太对了丶我相信你丶真的
2012-04-18 · TA获得超过390个赞
知道小有建树答主
回答量:111
采纳率:0%
帮助的人:78.8万
展开全部
因为你是用类名.方法();这样的方法必须是静态的,
你那个new有什么作用呢?
你不用那个one.learn();为什么要用类名.方法呢?。
那你这个new就是完全没必要的啊,
为什么类名.方法必须用static,另一个已经说的很清楚了。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式