黑马程序员技术交流社区

标题: 麻烦帮我看看这段简单代码的执行过程 [打印本页]

作者: 刘 佳    时间: 2012-9-14 18:10
标题: 麻烦帮我看看这段简单代码的执行过程
一段简单的代码,比较迷惑的是里面的age的值是怎么从setAge里传递到getAge里的,求解。。
还有setAge方法中返回值类型是void,里面又写return语句,返回的是什么?

代码如下:
class Person
{
        private int age;
        public int setAge(int i)
        {
                if(i<0 || i>130)
                        return;
                age=i;
               
        }
        public int getAge()
        {
                return age;
        }
}
class TestPerson
{
        public static void main(String[] args)
        {
                Person p1=new Person();
                p1.setAge(3);
                p1.setAge(-6);
                System.out.println(p1.getAge());
        }
}
作者: 马睿    时间: 2012-9-14 18:16
是这样的
当你p1.setAge(3);时
返回一个null,交给了setAge的返回值(但是并没有对p1.age进行任何操作)
而当你传入一个-6以后,执行的是age = i
于是p1.age被操作了,p1,age = -6


类中成员函数,是可以共享操作类中的成员变量的
getAge方法和和 setAge方法,都可以操作age,所以getAge就获得了age= -6
作者: 夏天    时间: 2012-9-14 18:23
本帖最后由 夏诗瑶 于 2012-9-14 18:24 编辑

  首先为什么会用set和get方法。有人会奇怪,类中不是可以定义构造函数吗?为什么还要设置set方法呢
其实是这样的。初始化的时候可以用构造函数,但是类中属性是私有化的,当你想修改的时候 只能通过set方法了。
比如你题目中的p1.setAge(3); 这时把3这个年龄给了p1这个对象。再调用p.getAge();获得的就是p1的年龄了
再说这段代码:
public int setAge(int i)
        {
                if(i<0 || i>130)
                        return;
                age=i;
               
        }
setAge 是设置年龄,并不需要返回,为什么用return,是因为如果设置的年龄不符合要求,直接让setAge()结束。并不做age=i; 这个赋值动作。
所以代码应该做如下修改
class Person {
private int age;
public void setAge(int age) {
  if (age < 0 || age > 130) {
   return;
  }
  this.age = age;
}
public int getAge() {
  return this.age;//这边的this可以省略,因为this就代表调用这个方法的对象。
}
}
public class TestPerson {
public static void main(String[] args) {
  Person p1 = new Person();
  p1.setAge(3);
  p1.setAge(-6);//这边赋值并没有成功!
  System.out.println(p1.getAge());//所以会输出3
}
}

作者: 夏天    时间: 2012-9-14 18:50
马睿 发表于 2012-9-14 18:16
是这样的
当你p1.setAge(3);时
返回一个null,交给了setAge的返回值(但是并没有对p1.age进行任何操作)

姐姐还是哥哥 ,你错了
作者: 谭立文    时间: 2012-9-14 19:50
public int setAge(int i)       //这个方法写的是有错误的
        {
                if(i<0 || i>130)
                        return;
                返回值必须为int类型
                       age=i;       //如果  i不满足 if 那这个方法就没有返回值 编译不能通过
               
        }
   p1.setAge(3);  // 3 ----> i(setAge方法中的形参)------>age = i (如果满足条件将形参 i的值赋值给age);
                 System.out.println(p1.getAge());  //因为每一个类的实例对象对实例的方法的操作,
                        //实际上是对该实例对象所指向的存储空间中的数据在操作
                 //即p1.getAge()返回的是堆中声明的int变量age了
作者: 冯培军    时间: 2012-9-14 20:28
本帖最后由 冯培军 于 2012-9-14 20:30 编辑

package it.heima.com;
class Person {
        private int age;

        // set是给一个对象的属性赋值,所以并没有返回结果,应该修改为void
        // public int setAge(int i)

        public void setAge(int i) {
                if (i < 0 || i > 130)
                        return;
                age = i;

        }
        public int getAge() {
                return age;
        }
}
public class Test04 {
        public static void main(String[] args) {
                //代码执行过程如下
                /**
                 * 创建一个对象,调用默认的构造方法初始化对象,此时age的属性是0
                 * 调用对象的方法setAge给对象赋值,因为3不符合条件,所以将变量3复制给age,此时对象的age=3
                 * 再次调用对象的setAge给对象赋值,因为-6符合条件,执行了if里面的语句,直接return,跳出方法,所以此时的age=3;
                 * 所以最终输入3,
                 * 美女可能问的是 return不是表示返回,应该有返回类型,如果是return   不能用void,
                 * 如果没有具体的返回类型,不明确的时候可以用关键字void表示,return语句则可以省略。(这个是重点)
                 * 其实return还有另外一个功能,类似于break,跳出此方法。break是跳出当前循环
                 */

                Person p1 = new Person();
                p1.setAge(3);
                p1.setAge(-6);
                System.out.println(p1.getAge());
        }
}

另外,给你说说函数的特点
函数的定义
        明确一:定义此函数的返回值是什么,其实明确函数的返回类型。
        明确二: 定义此函数是否需要未知内容参与运算,其实就是明确此函
数的参数列表。
        注意返回值类型和参数类型没有直接的关系。一般定义函数只要功
能,关于调用者怎么使用,跟函数没关系,他要的只是功能。(定义函数
只操作数据,输出不输出有外部决定)
        第二,函数中只能调用函数,不可以在函数内部定义函数。
        第三,如果没有具体的返回类型,不明确的时候可以用关键字void
表示,return语句则可以省略。

作者: 刘 佳    时间: 2012-9-14 21:03
谭立文 发表于 2012-9-14 19:50
public int setAge(int i)       //这个方法写的是有错误的
        {
                if(i130)

写错了,是public void setAge(int i)
作者: 夏天    时间: 2012-9-14 21:35
刘 佳 发表于 2012-9-14 21:03
写错了,是public void setAge(int i)

我的回答 解决不了你的问题吗。。:(




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