A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜天伟 中级黑马   /  2012-12-13 18:39  /  2045 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜天伟 于 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呢?

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
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也就没有关系。

点评

那为什么 ("name="+name+"...age="+age 这个里边 隐藏了this 而 构造函数里边就没隐藏呢 ?  发表于 2012-12-13 19:08

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
张学永 发表于 2012-12-13 18:46
public void speak()
        {
                System.out.println("name="+name+"...age="+age);

构造函数你传入了name,它就会去找离它最近的这个变量。就是你传入的这个name.变量的使用都有就近原则的。
回复 使用道具 举报
这就是变量作用域问题了,,你构造函数
Person(String name){
    name = name;
//没加this. 虚拟机会先从函数块内去找是否有name这个变量,如果没有去类中找,
//你这里就是函数块内自己对自己赋值,而且赋完值就被当垃圾处理了
}
this的name根本没有被赋值,所以是内存的默认值null

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
这个问题我也疑问过,其实最后一句话中的“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。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
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;
}
其实构造函数是用来对一个类以及变量进行实例化。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马