java中的对象实例化 10
packagecom.lzw;importstaticjava.lang.System.out;publicclasstest{Stringstr1="ccc";publ...
package com.lzw;
import static java.lang.System.out;
public class test {
String str1="ccc";
public test(){
String str1="abc";
}
public static void main(String[] args) {
test a=new test();
out.println(a.str1);
}
}
请问为什么显示的是ccc,而不是abc??? 实例化test类不是要自动调用构造方法么? 展开
import static java.lang.System.out;
public class test {
String str1="ccc";
public test(){
String str1="abc";
}
public static void main(String[] args) {
test a=new test();
out.println(a.str1);
}
}
请问为什么显示的是ccc,而不是abc??? 实例化test类不是要自动调用构造方法么? 展开
15个回答
展开全部
关于对象的实例化过程:
1 检查类是否加载,如果没有加载就加载这个类,
要加载所有父类。(读取.class文件到内存)
* 懒惰式加载(按需加载):如果第一次用到就加载,
只加载一次。通过CLASSPATH指定的路径寻找类文件(.class),
加载以后是一个对象,类型是Class。
获得这个类对象:Student.class-> Class 实例
2 分配父类型空间, 按照属性分配空间, 属性自动初始化为"零"
3 执行父类属性的初始化代码, 如: int a =1
4 执行父类构造器代码
5 父类构造器结束,返回子类构造器, 分配子类空间
按照属性分配空间, 属性自动初始化为"零"
6 执行子类属性的初始化代码, 如: int b =2
7 执行子类构造器代码
1 检查类是否加载,如果没有加载就加载这个类,
要加载所有父类。(读取.class文件到内存)
* 懒惰式加载(按需加载):如果第一次用到就加载,
只加载一次。通过CLASSPATH指定的路径寻找类文件(.class),
加载以后是一个对象,类型是Class。
获得这个类对象:Student.class-> Class 实例
2 分配父类型空间, 按照属性分配空间, 属性自动初始化为"零"
3 执行父类属性的初始化代码, 如: int a =1
4 执行父类构造器代码
5 父类构造器结束,返回子类构造器, 分配子类空间
按照属性分配空间, 属性自动初始化为"零"
6 执行子类属性的初始化代码, 如: int b =2
7 执行子类构造器代码
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
public test(){
String str1="abc";
}
你又声明了一个新的str1,是个局部变量,作用域仅限于此方法。
应该这样
public test(){
str1="abc";
}
String str1="abc";
}
你又声明了一个新的str1,是个局部变量,作用域仅限于此方法。
应该这样
public test(){
str1="abc";
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
类中的String str1="ccc",是个全局变量,也是类test的一个属性,它的作用范围是整个类.
构造方法public test(){
String str1="abc";
}中的String str1是个局部变量(这牵扯到局部变量与全局变量的概念),只不过这个局部变量也叫str1.局部变量的作用范围仅限与之相临的最内层的两个大括号之间,这里是public test(){}方法中的两个大括号之间.出了这个作用范围,局部变量str1所占用的内存就会被释放.
你在主方法main中打印的是a.str1,编译器调用的是对象a的str1属性的值,而它的值就是ccc.
简言之,这两个str1,是2个不同的变量,在内存中占有两个不同的内存空间.
构造方法public test(){
String str1="abc";
}中的String str1是个局部变量(这牵扯到局部变量与全局变量的概念),只不过这个局部变量也叫str1.局部变量的作用范围仅限与之相临的最内层的两个大括号之间,这里是public test(){}方法中的两个大括号之间.出了这个作用范围,局部变量str1所占用的内存就会被释放.
你在主方法main中打印的是a.str1,编译器调用的是对象a的str1属性的值,而它的值就是ccc.
简言之,这两个str1,是2个不同的变量,在内存中占有两个不同的内存空间.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
String str1="ccc"; 定义了test类的成员变量
而String str1="abc"; 定义的是test () 方法的内部变量,它是一个新的内部变量,并没有修改同名的成员变量
所以在实例化test类时,实例里的str1是成员变量定义的,其值是"ccc”
如果想让str1变成"abc”,把构造方法的改成this.str1="abc"即可
而String str1="abc"; 定义的是test () 方法的内部变量,它是一个新的内部变量,并没有修改同名的成员变量
所以在实例化test类时,实例里的str1是成员变量定义的,其值是"ccc”
如果想让str1变成"abc”,把构造方法的改成this.str1="abc"即可
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为你定义了两个变量,一个全局变量和一个局部变量,把构造方法中str1前面的String关键字去掉就会输出abc。以你现在的写法,虽然变量名称相同,但是内存地址不同。而你在主函数中引用的是全局的str1,所以输出ccc.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |