黑马程序员技术交流社区
标题: 麻烦帮我看看这段简单代码的执行过程 [打印本页]
作者: 刘 佳 时间: 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 |