黑马程序员技术交流社区

标题: 关于私有成员的调用问题 [打印本页]

作者: 倪大大    时间: 2014-5-30 16:58
标题: 关于私有成员的调用问题
本帖最后由 倪大大 于 2014-6-2 13:48 编辑

        如下
public class ry01
{
        
        public static void main(String[] args)throws Exception
        {
                        System.out.println(new anmiol(10).method(new anmiol(10)));
                        错误:System.out.println(new anmiol(100).age);//这里a不能直接调用age ,因为age是private
        }
}

        class anmiol
        {
                private int age ;
                anmiol(int age)
                {
                        this.age=age;
                        
                }
                public boolean method(anmiol a)
                {        
                        return this.age==a.age; //这里a为什么可以直接调用age
                }
        }
作者: Aron    时间: 2014-5-30 17:57
这个问题有些基础了 建议你多动手查查
这里还是给你说一说
1.私有权限(private)

private可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,不考虑内部类)。被private修饰的成员,只能在定义它们的类中使用,在其他类中不能调用。

2.默认权限(default)

类,数据成员,构造方法,方法成员,都能够使用默认权限,即不写任何关键字。默认权限即同包权限,同包权限的元素只能在定义它们的类中,以及同包的类中被调用。

3.受保护权限(protected)

protected可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,不考虑内部类)。被protected修饰的成员,能在定义它们的类中,同包的类中被调用。如果有不同包的类想调用它们,那么这个类必须是定义它们的类的子类。

4.公共权限(public)

public可以修饰类,数据成员,构造方法,方法成员。被public修饰的成员,可以在任何一个类中被调用,不管同包或不同包,是权限最大的一个修饰符。
明白了没? 知道为什么了吧
作者: 丁绍然    时间: 2014-5-30 18:43
mathod是赋值语句,你anmiol(()里调用的是构造函数传入age值。
怎么能在.age呢并且还不加参数。
new出一个新对象不赋给一个变量就没办法在调用了。mathod是在anmiol里直接打印出来了,当然可以


你在static这部分的视频在看看,你类和方法的调用也不怎么熟练啊。
多敲代码练习两次就好了
作者: sheng6699    时间: 2014-5-30 20:20
1 把私有成员变量封装在类内。就不能用通过(对象.变量)调用了,这是java封装型的表现之一。当然可以通过创建
get 方法来获取私有变量。你给你添加和修改了下代码,这样就可以比较了和访问了
  class Rey
{
         
        public static void main(String[] args)throws Exception
         {
                         System.out.println(new anmiol(10).method(new anmiol(10)));
                          System.out.println(new anmiol(100).getAge());   // 调用方法age();
         }
}

        class anmiol
         {
                 private int age ;
                 anmiol(int age)
                 {
                         this.age=age;
                        
     }
                public int getAge(){
      
      return age;
   
    }
                 public boolean method(anmiol a)
                 {        
                        return this.age==a.getAge(); // 调用方法age();
                 }
         }

作者: 倪大大    时间: 2014-5-31 14:38
Aron 发表于 2014-5-30 17:57
这个问题有些基础了 建议你多动手查查
这里还是给你说一说
1.私有权限(private)

大哥 我知道private不能调用 ,这个怎么可能不知道 我只是想问 为什么method方法中可以直接用对象调用私有变量
作者: 倪大大    时间: 2014-5-31 14:40
丁绍然 发表于 2014-5-30 18:43
mathod是赋值语句,你anmiol(()里调用的是构造函数传入age值。
怎么能在.age呢并且还不加参数。
new出一 ...

说实话 我真没看懂你说的是什么意思. 一句都没读通
我只是想问 为什么在 method函数里 我传入的anmiol对象 可以在method里直接调用私有变量
作者: 倪大大    时间: 2014-5-31 14:43
sheng6699 发表于 2014-5-30 20:20
1 把私有成员变量封装在类内。就不能用通过(对象.变量)调用了,这是java封装型的表现之一。当然可以通过创 ...

大哥 我知道能这样
我只是想问  我上面代码中  method方法中传入的anmiol对象 为什么可以直接调用私有变量 a.age
作者: fenzheng    时间: 2014-5-31 14:43
问题解决:package com.itheima;
//     如下
public class ry01
{
        
        public static void main(String[] args)throws Exception
        {
                        System.out.println(new anmiol(10).method(new anmiol(10)));
                        System.out.println(new anmiol(100).age);//这里a不能直接调用age ,因为age是private
        }
}

        class anmiol
        {
                public static int age ;
                anmiol(int age)
                {
                        this.age=age;
                        
                }
                public boolean method(anmiol a)
                {        
                        return this.age==a.age; //这里a为什么可以直接调用age
                }
        }
作者: fenzheng    时间: 2014-5-31 14:44
只有在本类中才可以使用私有字段,在其他类中调用是不可以的,没有为什么java这样贵点的语法:改成public 就好了
作者: Blackay    时间: 2014-5-31 14:46
因为方法中形参就相当于是对象的引用啊 就相当于在类中访问啊 当然可以啊
作者: 倪大大    时间: 2014-5-31 15:47
Blackay 发表于 2014-5-31 14:46
因为方法中形参就相当于是对象的引用啊 就相当于在类中访问啊 当然可以啊 ...

看来看去 只有你的回答靠谱点 其他全是在给我普及private的基础,要疯了 没看懂问题就开始答

作者: superob123    时间: 2014-5-31 17:28
倪大大 发表于 2014-5-31 14:40
说实话 我真没看懂你说的是什么意思. 一句都没读通
我只是想问 为什么在 method函数里 我传入的anmiol对 ...

整个程序就是这里出错的,楼主可能问为什么编译class anmiol时没提示错误,而编译System.out.println(new anmiol(10).method(new anmiol(10)));这句时提示错误。好像毕老师视频里有说过,编译类加载时,编译只会编译表达式是否符合语法规则,不会考虑其他的。
而编译到anmiol的对象时,它会先把method先运行一次,而new anmiol(10).age超出了private的调用范围,所以提示错误。


作者: Blackay    时间: 2014-5-31 19:26
倪大大 发表于 2014-5-31 15:47
看来看去 只有你的回答靠谱点 其他全是在给我普及private的基础,要疯了 没看懂问题就开始答
  ...

你传进来的那个形参就是一个对象引用 相当于拿到了对象 当然就可以访问私有变量啊
作者: sheng6699    时间: 2014-5-31 22:54
fenzheng 发表于 2014-5-31 14:44
只有在本类中才可以使用私有字段,在其他类中调用是不可以的,没有为什么java这样贵点的语法:改成public 就好 ...

对啊,可以改变public




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