黑马程序员技术交流社区

标题: 关于子类继承父类中的私有成员变量继承问题 [打印本页]

作者: 何旭栋    时间: 2012-5-22 20:06
标题: 关于子类继承父类中的私有成员变量继承问题
本帖最后由 何旭栋 于 2012-5-22 20:09 编辑
  1. <div class="blockcode"><blockquote>class Fu
  2. {
  3.         private int a;

  4.         Fu(int a)
  5.         {
  6.                 this.num = a;
  7.         }
  8. }
  9. class Zi extends Fu
  10. {
  11.         private int b;
  12.         Zi(int a, int b)
  13.         {
  14.                 super(a);
  15.                 this.b = b;
  16.         }
  17.         void show()
  18.         {
  19.                 System.out.println("a="+this.a+"\nb="+this.b);
  20.         }
  21. }
复制代码
上面编译报错show()中的this.a换a、super.a都不行
在下菜鸟,弱弱问下:子类继承了父类中的私有成员变量,该如何访问?

作者: 黄奕豪    时间: 2012-5-22 20:39
本帖最后由 黄奕豪 于 2012-5-22 20:46 编辑

所谓私有,就是被private修饰后!!只能在本类中访问,要是能被子类或其他类直接访问的话就不叫私有了!!就像老爸的手,是老爸私有的,就算是儿子也不能够直接用吧?所以要用到老爸的手,或者别人的手(别的类的私有成员)的时候肯定要通过一个方法了,一个老爸或其他人(其他类)同意的方法,这个方法是请求也好,其他也好,由那个手的主人订了,是吧?言归正传,所以即使是子类访问父类也要通过父类定义的访问的方法,这里你需要在父类新建一个不是私有的,或public修饰的,或者是默认权限的getA()的方法,意思是取A的值,具体的代码看下面
class Fu
{
       private int  a;
       Fu(int  a)
       {
             this.a = a;
       }
       public int getA()//这个方法是可以public,或者默认不写修饰的,返回这个类的私有a的值,不能定义为私有哦,要不就是另外一个手了!
       {
              return a;
        }
}

然后你在其他的类里面,比如说子类里面就可以这样调用来取得a的值了:int b = Zi.getA();
OK了~~~~~


作者: 黄奕豪    时间: 2012-5-22 20:57
黄奕豪 发表于 2012-5-22 20:39
所谓私有,就是被private修饰后!!只能在本类中访问,要是能被子类或其他类直接访问的话就不叫私有了!! ...

可是这样就能更好的保护自己的手了啊!!!谁都能不经我同意就用我的手,等下拿去做烤猪蹄怎么办?这个是Java所谓的封装特性!!也是对私有数据的一种保护吧!!!
作者: 于陈    时间: 2012-5-22 21:47
一般这种情况下是给父类的是有变量添加set() 和get()方法,如果是在my eclipse里面的话是可以直接生成的,很方便!
比如你这里是有变量a
添加set和get方法就是:
      public void setA(int a) {
                this.a = a;
        }
        public int getA() {
                return a;
        }
这样就可以在其他的类通过这两个public方法来给a赋值和获取a值了。
不要觉得这个很麻烦,其实这就是为了提高数据的安全性,java的封装性的体现!
作者: 李红飞    时间: 2012-5-23 10:19
通过set() 和get()方法,进行封装属性达到保护隐私的目的
添加set和get方法就是:
      public void setA(int a) {
                this.a = a;
        }
        public int getA() {
                return a;
        }
这样在本类的外部只要访问set()和get()方法即可
作者: 张成龙    时间: 2012-5-23 10:48
private修饰后就是私有的,只在本类中访问,私有的部分是无法被子类所知的,所以子类是无法继承的。
如果私有的变量需要被访问到,就需要对外提供set或者get方法
作者: 付左军    时间: 2012-5-23 23:12
子类怎么可能继承父类的私有变量呢?
就像古时候的武林世家的武术密集传男不传女,你他女儿都不管用,对子类来说你根本不知道这个变量的存在
作者: 彩虹    时间: 2012-5-23 23:38
        子类继承父类,不能直接访问其父类的私有变量,只能通过父类中的成员方法来对其私有变量进行访问,继承的子类只能访问父类中的public成员。
作者: 谭威    时间: 2012-5-24 01:49
让子类自己提供getter setter方法,你要清楚私有的定义。只能本内访问。还可以将父类private关键字改为protected,那么该类及其子类也可以访问,同一个包中的类也可以访问。但是不推荐用protected关键字,因为protected会破坏java的封装性。或许有人认为用protected修饰字段是一个好办法,这样在子类需要的时候能够访问这个字段,但是 子类是可以继续派生子类的,任何人只要在定义的类派生出子类就可以访问该字段。安全性就不好了。




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