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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王晓明 中级黑马   /  2012-11-7 11:30  /  3300 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王晓明 于 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,但是在主函数里调用不了,真心求教!学的不好,大家见教!

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

11 个回复

倒序浏览
我也刚学习到这里,不知到我的理解是不是对的,不对的话,我们共同学习。
我的想法是这样的:

public int getAge(int a)
      {
                 return age = a;
         }

        void speak()
         {
                 System.out.println("ape="+getage());
         }
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
注意函数的参数,getAge()是无参数的,不能传入参数。
应该 p.setAge(20);
        p.getAge();  
先设置后取出。

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
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();
        }
}
我给你修改后的,看看。你的代码写的太乱,我都看晕了

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
因为:
       主函数里面调用的是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;
}

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
int a=getAge();
getAge()方法是不用传入参数的,只是为了返回值,所以要定义一个变量去接收返回值
你理解错了。

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
陈军 中级黑马 2012-11-7 13:19:27
7#
你没传递或者/设置age就,getAge这是没有意义的。
要么通过构造方法传递,要么通过setAge()方法设置age.

之后再get。就可以了

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
梁胜海 发表于 2012-11-7 12:24
package com.lsh.error;

class Person

呵呵,我是边听边做注释,有的代码是重复的,谢谢了!
回复 使用道具 举报
徐军涛 发表于 2012-11-7 13:01
因为:       主函数里面调用的是p.getAge(20)方法,是带有参数的,而在Person中定义的public intgetAge() ...

OK,讲的很清楚,多谢了!
回复 使用道具 举报
我学的也不多,认真的看了下你的代码
在方法体中:  
public void setAge(int a){}
//这儿有参数,在调用的时候必须传入参数
public int getAge(){}
//这儿是没有参数的,意思就是在调用的时候,一定不能传入参数!
    你在主函数中的调用是错误的,
应该是:
setAge(20);//这里的意思是将age的默认值初始化为20;
getAge();//这里的意思就是取出setAge(int age)方法中设定的age的值;

以上是我的理解,希望对你有所帮助!!
   

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我也刚刚开始学习,个人认为private将对象私有化后,外界只能通过setter方法对其进行设置,而getter方法是获取外界已经设置好的值,所以你的程序是不能通过 p.getAge(20);方法进行传值的,如果该类内部有输出语句,通过setter方法设置后,调用即可!private私有化只是对外界进行私有化,不让外界访问,但内部是可以访问到的
回复 使用道具 举报
private int age 私有属性是不是外界访问的,要访问,要创建两个方法提供外界使用。先setAge(int a)传参,给私有属性赋值,然后用getAge()方法return这个属性值,这个值是有类别的,这是语法,方法名前要有返回值类型!
===============================================
G:\黑马\练习\day05>javac PersonDemo.java
PersonDemo.java:61:   无法将 Person 中的 getAge() 应用于 (int)
                p.getAge(20);
=====================================
这个方法是没有参数的,只是想通过个方法取到一个属性值。
希也难望对你有所帮助!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马