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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜桂发 黑马帝   /  2011-9-16 17:54  /  3298 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

构造函数的作用是给对象建立之时初始化,也就是一个赋值过程.理论上说在构造函数里给对象定义一个属性也说得通.但实际上定义了虽然编译不会出错,却读不到这个值:
class  demo
{
        public static void main(String[] args)
        {
                Teacher tc = new Teacher("zhangsan");
                System.out.println(tc.name);
                System.out.println(tc.age);
        }
}

class Teacher
{
        String name;
        Teacher(String name)
        {
                this.name = name;
                int age = 20;
        }
}

红色部分会提示找不到符号.呵呵,对构造函数理解还是不大透彻.

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

9 个回复

倒序浏览
因为你的Teacher内部类里面少了一个age 变量。
回复 使用道具 举报
黑马网友  发表于 2011-9-16 18:42:39
藤椅

回复 沙发 的帖子

我的意思就是想把属性定义在构造函数里.因为构造函数对对象初始化的时候给对象定义并赋值,为什么行不通:Q
回复 使用道具 举报
呵呵,你写的是System.out.println(tc.age);
你的实例对象调用的是类里面的变量,而你根本没有创建age这个变量。
而构造函数的初始化只是决定了你的实例对象以什么样的方式来创建罢了,如果你没有在构造方法以外使用变量来“接应”,那么你已经在构造方法里面初始化的这个变量,自然就无效了。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-16 21:40:20
报纸
你构造函数中的age只是一个局部变量,跟Teacher类没有关系的。所以不会传递过去的。
回复 使用道具 举报
黑马网友  发表于 2011-9-16 22:01:04
地板
构造函数也是函数,在一个函数中定义的变量都是局部变量,局部变量的作用域是从定义的地方开始到函数的结尾,函数运行结束,局部变量也就被释放了
Teacher tc = new Teacher("zhangsan");
会调用一次构造函数,但是构造函数调用以后,age变量也就不存在了,所以当你调用tc.age,会提示你找不到符号,我觉得你对这个问题之所以会有疑惑,是对局部变量的作用域不太理解,希望能够帮到你

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 回答的很好!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-18 10:28:24
7#

回复 沙发 的帖子

大哥 你看好了 那不是内部类!!!!!你知道啥叫内部类吗?
回复 使用道具 举报
黑马网友  发表于 2011-9-18 10:30:34
8#

回复 楼主 的帖子

楼主找不到符号是啥意思?  很明白了。。。。就是没有定义变量!!!还问为啥的呢。。。。
回复 使用道具 举报
黑马网友  发表于 2011-9-18 11:54:50
9#
class  demo
{
        public static void main(String[] args)
        {
                Teacher tc = new Teacher("zhangsan");
                System.out.println(tc.name);
                System.out.println(tc.age);
        }
}

class Teacher
{
        String name;
        Teacher(String name)
        {
                this.name = name;
                int age = 20;
        }
}
我明白你的意思,你的Teacher类中的属性只有一个Name属性,你想在构造函数中定义一个AGE属性,然后正好通过构造函数对其进行初始化,但是您别忘了变量的生命周期,你在构造函数中定义的只是一个局部变量,也就是说它只能在这个函数的内部有效,所以您要用这个类的对象来访问它当然访问不到了
回复 使用道具 举报
黑马网友  发表于 2011-9-18 13:07:42
10#
你的teacher类里只有一个属性,就是name,没有age这个属性,那么你用tc.age是得不到属性的。一般这样写逻辑比较清晰:
package heima.javase;
/**
* 老师类
* @author ila
*
*/
public class Teacher {

        private String id;
        private String name;
        private int age;
       
        /**
         * @return the id
         */
        public String getId() {
                return id;
        }
        /**
         * @param id the id to set
         */
        public void setId(String id) {
                this.id = id;
        }
        /**
         * @return the name
         */
        public String getName() {
                return name;
        }
        /**
         * @param name the name to set
         */
        public void setName(String name) {
                this.name = name;
        }
        /**
         * @return the age
         */
        public int getAge() {
                return age;
        }
        /**
         * @param age the age to set
         */
        public void setAge(int age) {
                this.age = age;
        }
        public Teacher() {
        }
        public static void main(String[] args) {
                Teacher t = new Teacher();
                t.setName("张三");
                t.setAge(18);
                System.out.println(t.getName()+"今年"+t.getAge()+"岁了。");

        }

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