黑马程序员技术交流社区
标题:
关于this的疑问
[打印本页]
作者:
杜天伟
时间:
2012-12-13 18:39
标题:
关于this的疑问
本帖最后由 杜天伟 于 2012-12-14 11:26 编辑
先上代码
class Person
{
private String name;
private int age;
Person(String name)
{
name = name;
}
Person(String n,int a)
{
name = n;
age = a;
}
public void speak()
{
System.out.println("name="+name+"...age="+age);
}
}
class PersonDemo3
{
public static void main(String[] args)
{
Person p = new Person("lisi");
p.speak();
这个没有标记this 所以 输入的"lisi"不能赋值给对象中的name ,这个我知道 毕老师将了是因为有两个name ,栈内存中有name了所以就不去堆内存中赋值了,所以赋值不成功 。
但是我疑问的是,函数speak,中输出的"name="+name+"...age="+age 这个里边的name ,这时候栈内存中的name是"lisi",而堆内存中是null。按照前面栈内存中有值应该用的是栈内存中的值呀,为什么打印出来的确实堆内存中的null呢?
作者:
张学永
时间:
2012-12-13 18:46
public void speak()
{
System.out.println("name="+name+"...age="+age);
}
你这段代码其实隐含了this关键字的。也就是这个name和age其实是this.name和this.age.用的就是类中的成员变量name和age.
而你的构造函数 Person(String name)
{
name = name;
}
这个构造函数的name全是传入的String name,和类中的成员没有关系,只在构造函数中有效。类中其它位置调用的name和你传入的这个name也就没有关系。
作者:
张学永
时间:
2012-12-13 19:11
张学永 发表于 2012-12-13 18:46
public void speak()
{
System.out.println("name="+name+"...age="+age);
构造函数你传入了name,它就会去找离它最近的这个变量。就是你传入的这个name.变量的使用都有就近原则的。
作者:
陈泽鑫
时间:
2012-12-13 19:56
这就是变量作用域问题了,,你构造函数
Person(String name){
name = name;
//没加this. 虚拟机会先从函数块内去找是否有name这个变量,如果没有去类中找,
//你这里就是函数块内自己对自己赋值,而且赋完值就被当垃圾处理了
}
this的name根本没有被赋值,所以是内存的默认值null
作者:
刘丰伟
时间:
2012-12-13 23:48
这个问题我也疑问过,其实最后一句话中的“name”+name,这个那么访问的name始终是private string name里的name,如果没有重名(name=n)的话,n的值是付给private stringname里的name,因为只有一个name,如果(name=name)的话,栈内存里面有name,就不会赋值给private string name里的name,但是函数“name”+name调用的还是private string name,所以打印的值肯定为null。
作者:
王斌
时间:
2012-12-14 14:10
java的构造函数其实很简单。
一个类 被实例化 也就是被new的时候 最先执行的是 构造函数,如果你有留心。你会发现很多类里面根本没有写构造函数。
在java类中,如果不显示声明构造函数,JVM 会给该类一个默认的构造函数。一个类 可以有多个构造函数。构造函数的主要作用 一是用来实例化该类。二是 让该类实例化的时候执行哪些方法,初始化哪些属性。当一个类声明了构造函数以后,JVM 是不会再给该类分配默认的构造函数。
比如一个实体类
public class entity{
private int id;
private String userName;
get...set..方法
}
如果这样写该类就是默认的构造函数。该类实例化的时候 id 和 username 就是默认值 即 id=0,username=null.
如果在里面加入这样一个方法
public entity(int id,String userName){
调用get..set..
}
如果这样写 该类实例化的时候 必须给出 id 和username参数。 JVM不会再给这个类默认构造函数
你也可以理解成 在没有给构造函数的时候 JVM 给你的类加了一个这样的函数
public entity(){
this.id=0;
this.userName=null;
}
其实构造函数是用来对一个类以及变量进行实例化。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2