java中的动态方法是需要实例化才能调用的。那为什么,变量也能调用方法。

例如Stringa;没有初始化也能调用方法,Stringa=null;与Stringa=newString();有什么区别。求教... 例如String a;没有初始化也能调用方法,String a=null;与String a=new String();有什么区别。求教 展开
 我来答
mading314
2012-09-07 · TA获得超过863个赞
知道小有建树答主
回答量:355
采纳率:100%
帮助的人:350万
展开全部
修正下你说的问题,首先,一个对下没有实实例化时,可以调用其静态方法或静态变量(也叫类变量),所谓静态变量或静态方法就是使用static修士过后的变量或方法。否则编译器都通不过的。

但是对于实例变量或实例方法,则必须实例化对象之后才能通过对象调用。

String a=null,告诉解析器字符串a是null的,JVM没有为之分配内存地址,所以不能通过a调用a里面的任何属性或者方法,包括类变量或类方法(静态变量或静态方法),否则在运行期间就会出现空指针异常(编译是能正常通过的)。

String a=new String();
这句话告诉JVM要马上为变量a分配存储空间,这样,a就能调用属于它的任何方法。
清晰旭日
2012-09-07 · TA获得超过202个赞
知道答主
回答量:33
采纳率:100%
帮助的人:13.2万
展开全部
1--首先string也是一个类,是JAVA中已经事先定义好的,这样就方便我们开发者直接使用(你知道了这点我想你大概应该清楚了)
2--每当我们创建一个对象的时候会在栈内存(或堆内存中开辟空间)
3--string a时,我们就在栈内存中开辟了一个空间,空间的名字就叫a,此时不会在栈内存中开辟空间。
4--string a=null和string a是一样的,当我们用的时候由于没有初始化,所以都不能用的,因为没有a没有指向任何地址,引用
5--string a=new string()有点不一样,不但在内存中开辟了一个空间,空间名为a,还在堆内存总开辟了一段空间,里面存的是你给a赋的值,并会将此空间的地址给a空间,那么a空间中存储的是堆中那个空间的地址。这时a已经有所指向了。

注:你要理解string也是一种类

希望我的回答对你有用
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wenkuhulu
2012-09-07 · TA获得超过176个赞
知道小有建树答主
回答量:267
采纳率:100%
帮助的人:198万
展开全部
如果是把String a定义成“成员变量”,就是说在方法外部定义的,jvm会自动给这个变量初始化成a=null;a=null是已经实例化了的。当用null的a去调用String中的方法时会报空指针异常,如System.out.println(a.length());//报nullpointexception异常

而把String a定义在方法体内,如main方法中定义了String a2;然后不给a2赋值初始化,马上写
System.out.println(a2.length());//此时,不是报空指针异常,而是编译都不通过(即不符合语法要求),因为此时a2没有初始化化,不能调用方法!a则是已经初始化了的,null值也是一个初始值。

至于null跟 new String()的区别,很好理解的:
a=null; 是说:a还没成形,内存中还没有这个对象;
a=new String(); 是说,a已经成了一个对象,在内存中分配了一个空间给a,只是此时这个空间上时一张白纸,还没有放东西到这快空间上;
简言之:(String比喻成一个碗)
a=null; 还没有这个碗;
a=new String(); 有这个碗,但碗里没有饭菜
a=new String("abcd"); 有这个碗,而且碗里有饭菜。

不知这么说你明不明白。。。仅供参考。
追问
那String a="abc"和String a= new String("abc");有什么区别
追答
public static void main(String[] args) {
String s1 = "abc";//s1指向一个字符串常量
String s2="abc";//s2指向同一个常量
System.out.println(s1.equals(s2));//true 说明:字符串里的字符内容相同
System.out.println(s1==s2);//true 说明:s1和s2是同一个对象,在内存中占用同一块内存空间
System.out.println("--------new String-----------");
String s3 = new String("abc");//这里abc作为一个新对象(String对象,不是常量)
System.out.println(s1.equals(s3));//true 说明:s1和s3的字符内容相同
System.out.println(s1==s3);//false 说明:但s1和s3不是同一个对象,s1指向的是一个字符串,s3指向另一个字符串对象,2者占用不同的内存空间。
System.out.println("********");
System.out.println(s2.equals(s3));//true
System.out.println(s2==s3);//false

}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
我的探讨
2012-09-08
知道答主
回答量:30
采纳率:0%
帮助的人:8.7万
展开全部
1、类在类加载的时候他的静态方法和静态属性会被初始化,就是说就算这个类没有新建对象,他的静态方法和静态属性也是存在的。
2、Object a=null;声明了一个Object类型的引用(相当于一个指针),但是它没有指向任何对象。
3、new Object();这一句会在内存中根据Object类构建出一个Object类的对象,然后将这个对象的内存地址返回。就是说Object a=new Object();这个式子的意思是:赋值号右边的式子返回了一个Object对象的内存地址,然后通过赋值号赋给了a。
4、当声明Object a=null;时,a就算没有指向对象,但是Object这个类已经被加载的话,他的静态变量和方法就已被初始化了,所以可以调用。
5、关于String a=“abc”; 和String a=new String(“abc”);的区别:因为字符串对象是一个非常非常常用的对象,所以jvm会开辟一片公共内存来保存字符串。String a="abc";这一句会直接在公共区创建字符串“abc”,然后让a指向公共区的“abc”。String a=new String("abc");也会在公共数据区新建一个"abc",但是还会另外开辟一片空间保存一个"abc"字符串,然后将这个另外开辟的空间的地址返回给a,即创建了两个"abc"。另外需要注意的是,当String a="abc"; String b=“abc”;时,因为"abc"在公共区在第一句String a="abc";已经创建过,所以在第二句 String b=“abc”;时,不会创建新的"abc",而是将“abc”地址直接返回,所以在a==b这个判断式,会返回true。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式