黑马程序员技术交流社区
标题: 学到第五天,关于封装的问题 [打印本页]
作者: 王晓明 时间: 2012-11-7 11:30
标题: 学到第五天,关于封装的问题
本帖最后由 王晓明 于 2012-11-7 14:59 编辑
学到第五天,第七小节:关于封装
毕老师讲到在私有函数里,对外的成员变量通常有两种访问方式,一个是设置,一个是获取!即set和get!
但是set方式的返回值必须是void,因为它不需要返回数据并且要设置参数(int a),
get方式就因为要返回数据,所以返回值是int,这样就不要设置参数了!
以上是毕老师讲的,我听懂了,但是关于get方式的返回我一直没搞懂!也不知道是哪没搞懂,以下是我的代码(注释多了一些,见谅!)
class Person
{
private int age;//将age私有化以后,类以外即使建立了对象也不能直接访问对象了!只能在类中访问
//但是人应该有年龄,就需要在Person类中提供对应的age的方式。于是就有了以下的权限
/*
public void haha(int a)//这样就可以在Person中访问age了,并对其进行修改!类以外的就可以通过a来进行访问
//如:p.haha(20),就可以访问并更改age了!
{
age = a;
}
*/
/*
public void setAge(int a)//上面的访问函数不太规范,这是比较规范的写法!
//一般一个成语变量通常有两种访问方式,一个是设置,一个是获取!即下面这两个方式!
//但是set方式的返回值必须是void,因为它不需要返回数据并且要设置参数(int a),
//get方式就因为要返回数据,所以返回值是int,这样就不要设置参数了!
{
if(a>0 && a<130)//我们之所以对外提供访问方式,就是因为可以在访问方式中加入逻辑判断等语句。
//对访问的数据进行操作。提高代码的健壮性。
{
age = a;
speak();
}
else
System.out.println("非法age");
}
*/
public int getAge()//get方式就因为要返回数据,所以返回值是int,这样就不要设置参数了!
{
return age;
}
void speak()
{
System.out.println("ape="+age);
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person();
//p.age = -20;//这样的话,就不能访问person,因为它已经私有了,不便于外面访问!
//p.haha(20);
p.getAge(20);
p.speak();
//System.out.println("Hello World!");
}
}
运行出错:
1 错误
G:\黑马\练习\day05>javac PersonDemo.java
PersonDemo.java:61: 无法将 Person 中的 getAge() 应用于 (int)
p.getAge(20);
我是真心不懂,毕老师不是说get是要有返回值的吗?所以用了int,但是在主函数里调用不了,真心求教!学的不好,大家见教!
作者: 黑马周磊 时间: 2012-11-7 11:48
我也刚学习到这里,不知到我的理解是不是对的,不对的话,我们共同学习。
我的想法是这样的:
public int getAge(int a)
{
return age = a;
}
void speak()
{
System.out.println("ape="+getage());
}
}
作者: 葛旭东 时间: 2012-11-7 11:53
注意函数的参数,getAge()是无参数的,不能传入参数。
应该 p.setAge(20);
p.getAge();
先设置后取出。
作者: 梁胜海 时间: 2012-11-7 12:24
package com.lsh.error;
class Person
{
private int age;
public int getAge()//这里是获取年龄,需要返回值
{
return age;
}
public void setAge(int age){ //这里是设置年龄,无需返回值
this.age=age;
}
void speak()
{
System.out.println("ape="+age);
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person();
p.setAge(20);
p.getAge();
p.speak();
}
}
我给你修改后的,看看。你的代码写的太乱,我都看晕了
作者: 徐军涛 时间: 2012-11-7 13:01
因为:
主函数里面调用的是p.getAge(20)方法,是带有参数的,
而在Person中定义的public intgetAge()是不带代数的;
主函数调用了getAge(20)方法,Person中没有,就出现了编译失败。
解决:
调用getAge()就是为了获取年龄,而不是getAge(20)传进去一个年龄参数。
/*改正、添加的部分代码*/
/*构造函数对对象初始化*/
publicPerson(String name, int age)
{
this.name = name;
this.age = age;
}
/*获取年龄的方法*/
public intgetAge() {
return age;
}
作者: 林晓泉 时间: 2012-11-7 13:10
int a=getAge();
getAge()方法是不用传入参数的,只是为了返回值,所以要定义一个变量去接收返回值
你理解错了。
作者: 陈军 时间: 2012-11-7 13:19
你没传递或者/设置age就,getAge这是没有意义的。
要么通过构造方法传递,要么通过setAge()方法设置age.
之后再get。就可以了
作者: 王晓明 时间: 2012-11-7 15:00
梁胜海 发表于 2012-11-7 12:24
package com.lsh.error;
class Person
呵呵,我是边听边做注释,有的代码是重复的,谢谢了!
作者: 王晓明 时间: 2012-11-7 15:03
徐军涛 发表于 2012-11-7 13:01
因为: 主函数里面调用的是p.getAge(20)方法,是带有参数的,而在Person中定义的public intgetAge() ...
OK,讲的很清楚,多谢了!
作者: 余磊 时间: 2012-11-8 17:28
我学的也不多,认真的看了下你的代码
在方法体中:
public void setAge(int a){}
//这儿有参数,在调用的时候必须传入参数
public int getAge(){}
//这儿是没有参数的,意思就是在调用的时候,一定不能传入参数!
你在主函数中的调用是错误的,
应该是:
setAge(20);//这里的意思是将age的默认值初始化为20;
getAge();//这里的意思就是取出setAge(int age)方法中设定的age的值;
以上是我的理解,希望对你有所帮助!!
作者: 朝花夕拾 时间: 2012-11-9 23:24
我也刚刚开始学习,个人认为private将对象私有化后,外界只能通过setter方法对其进行设置,而getter方法是获取外界已经设置好的值,所以你的程序是不能通过 p.getAge(20);方法进行传值的,如果该类内部有输出语句,通过setter方法设置后,调用即可!private私有化只是对外界进行私有化,不让外界访问,但内部是可以访问到的
作者: 张钧杰 时间: 2012-11-11 00:08
private int age 私有属性是不是外界访问的,要访问,要创建两个方法提供外界使用。先setAge(int a)传参,给私有属性赋值,然后用getAge()方法return这个属性值,这个值是有类别的,这是语法,方法名前要有返回值类型!
===============================================
G:\黑马\练习\day05>javac PersonDemo.java
PersonDemo.java:61: 无法将 Person 中的 getAge() 应用于 (int)
p.getAge(20);
=====================================
这个方法是没有参数的,只是想通过个方法取到一个属性值。
希也难望对你有所帮助!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |