黑马程序员技术交流社区

标题: 第五天视频封装部分代码有个小问题 [打印本页]

作者: 刘 佳    时间: 2012-9-19 00:52
标题: 第五天视频封装部分代码有个小问题
本帖最后由 刘 佳 于 2012-9-19 13:15 编辑

第五天视频封装那一讲,有个地方迷惑。这段代码输出是age=0. 我知道age有个默认值是0,但是赋值是-40,虽然不符合条件,但为什么输出是0呢?

还有个小问题,setAge为什么返回值类型是void呢?这个方法不应该返回符合条件的age吗?

class Person
{
        private int age;
        public void setAge(int a)
        {
                if(a>0 && a<130)
                        age = a;
                else
                        System.out.println("feifa age");
        }

        public int getAge()
        {
                return age;
        }
        private void speak()
        {
                System.out.println("age="+age);
        }
}

class PersonDemo
{
        public static void  main(String[] args)
        {
                Person p = new Person();
                p.setAge(-40);
                p.speak();
        }
}

作者: 夏天    时间: 2012-9-19 01:10
本帖最后由 夏诗瑶 于 2012-9-19 01:21 编辑

setAge() 顾名思义,是设置年龄的意思。
比如用户想修改年龄,就通过setAge方法。但仅仅只是设置,你可以理解为:不让用户知道你是怎么去实现操作年龄这个方法的。
所以该方法只是实现设置年龄功能,并无返回类型。

但你总要给用户返回一个修改的值,这时就通过 getAge()方法,所以这个方法返回一个int。

再说说为什么输出0
首先,代码规范应该如下:
int age;//默认值是0
public void setAge(int age) {
  if (age < 0 || age > 130) {
   System.out.println("年龄输入非法,设置不成功!");
   return;// return表示如果用户输入错误年龄,直接结束这个方法,不进行下面的赋值
  }
this.age = age;
}
public int getAge() {
  return age;
}
当你调用set方法和get方法时,用的是同一个对象。既然设置年龄值不成功了,肯定会输出对象的默认年龄0。

作者: 武庆东    时间: 2012-9-19 01:11
第五天视频封装那一讲,有个地方迷惑。这段代码输出是age=0. 我知道age有个默认值是0,但是赋值是-40,虽然不符合条件,但为什么输出是0呢?
解答:因为age是int类型,int默认值是0,至始至终没有赋值,所以输出0
还有个小问题,setAge为什么返回值类型是void呢?这个方法不应该返回符合条件的age吗?
解答:因为void说明对外没有提供操作的数据,只是单纯的一个方法~!
如这个返回值是int   public int getAge()
        {
                return age;
        }
那么就可以   Person p = new Person();
                      int s=p.getAge();
作者: 郭阳    时间: 2012-9-19 01:24
第一个问题,a在判断的时候,不满足条件if(a>0 && a<130),则执行System.out.println("feifa age");,输出的是字符串feifa age,也就是说age没有被赋值成功。后面又输出了0是因为int age的默认值是0,它是被speak方法输出的
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二个问题,setAge方法只是将age赋值,不需要其返回什么数据。当然返回值类型为void。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
另外你还有一个问题,speak方法不能被private修饰,如果被private修饰的话,只能在类内部被调用,你自己编译一下肯定会失败的。对外提供的方法不能用private修饰!





class Person
{
        private int age;
        public void setAge(int a)
        {
                if(a>0 && a<130)
                        age = a;
                else
                        System.out.println("feifa age");
        }

        public int getAge()
        {
                return age;
        }
       private void speak() //此处将private去掉或者改为public
        {
                System.out.println("age="+age);
        }
}

class PersonDemo
{
        public static void  main(String[] args)
        {
                Person p = new Person();
                p.setAge(-40)//赋值失败,打印feifa age,age依然是默认值0
                p.speak();//打印age,即0
        }
}


作者: 黑马杨晨    时间: 2012-9-19 12:45
private int age;                               //这时age的值由于没有赋值所以age的值是默认值0。
         public void setAge(int a)         //这时把-40这个值传到这里。
         {
                 if(a>0 && a<130)        //由于-40这个值不符合条件所以下一句“age=a;”就没有执行到,这里age的值这是默认值0.
                         age = a;
                 else
                         System.out.println("feifa age");
         }


还有一般情况set...是没有返回值的,get...是有返回值的。你在很多程序上都会发现这个现象。
作者: 董志超    时间: 2012-9-19 13:05
setAge();是设置age,没有返回值,所以用void,而不用age

class Person
{
        private int age;
        public void setAge(int a)
        {
                if(a>0 && a<130)
                        age = a;
                else
                        System.out.println("feifa age");
        }

        public int getAge()
        {
                return age;
        }
       private void speak()//这去掉private或将其替换成public,private访问权限过低。
        {
                System.out.println("age="+age);
        }
}

class PersonDemo
{
        public static void  main(String[] args)
        {
                Person p = new Person();
                p.setAge(-40);//-40不符合if语句中的条件,age没被赋值。所以执行else中的语句。
                p.speak();//p.speak();输出的是age的值, age没被赋值 ,会输出默认值
        }
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2