黑马程序员技术交流社区

标题: 关于继承,为什么不能在父类变量前加私有 [打印本页]

作者: 选择黑马    时间: 2012-6-21 23:35
标题: 关于继承,为什么不能在父类变量前加私有
class Fu
{
        private int num = 7;
}
class Zi extends Fu
{
        int num = 9;
        void show()
        {
                System.out.println(super.num);
        }
}

class  Extends2
{
        public static void main(String[] args)
        {
                Zi z = new Zi();
                z.show();
        }
}
所报提示,num可以再Fu中访问private私有。为什么在show方法打印语句中加入super不可以,加入this就可以,谢谢!
作者: 吴小东    时间: 2012-6-21 23:45
首先一点,你要知道父类是怎么产生出来的,父类是又子类提取共性的一些属性和方法产生的,如果父类里面还有私有的东西的话,已经不符合该类的原则问题了。
你可以定义私有的属性,但是必须要对外提供公共的方法区访问。
作者: 鲍永章    时间: 2012-6-21 23:47
private的只有在类内部才能访问,类内部不是类的对象,所以super也无法访问,private的根本就没有继承下来
作者: 钟成军    时间: 2012-6-21 23:48
num在父类中被private修饰,所以子类不能继承。
子类中的num并没有重写父类的num,因为它根本就没有继承父类的num,所以当调用super.num时会报错:num可以在Fu中访问private.
而用this调用是调用子类的num,即输出值为9,如果不用this.num,同样也为9,即加不加this,结果都一样!
作者: 张立江    时间: 2012-6-21 23:48
本帖最后由 小张童鞋 于 2012-6-21 23:50 编辑

当你将this改成super后编译出错后给出得提示意思其实是:num不能再超类中访问被private修饰的变量.
Fu类中定义了num为私有,只有Fu类中的方法可以访问的到Fu类中的num,子类是不能访问的到它的,就算继承也不会继承父类的private修饰的变量。
super:访问的超类(父类);
this:访问的是自己的属性.

作者: 山水游客    时间: 2012-6-21 23:57
如果子类中出现非私有的同名成员变量时,
子类要访问本类中的变量,用this
子类要访问父类中的同名变量,用super。

super的使用和this的使用几乎一致。
this代表的是本类对象的引用。
super代表的是父类对象的引用。
作者: 韦念欣    时间: 2012-6-22 00:09
楼主的代码中,因为子类也声明了和父类一样的num。则this.num指向的就是子类的num,而super.num指向的是父类的num。
又因为父类的num被private私有化了,所以子类不能直接操作父类的num,即不能操作super.num。
但是子类是能够操作自己的num,即this.num。
作者: 燃烧端午    时间: 2012-6-22 00:29
super.num是访问父类的成员变量,this.num是访问子类的成员变量。
子类不可以访问父类的私有成员,但是可以访问父类的受保护的成员和公有成员
  1. class Fu
  2. {
  3.         private int num = 7;//分别改为public 和 protected 试试
  4. }
  5. class Zi extends Fu
  6. {
  7.         int num = 9;
  8.         void show()
  9.         {
  10.                 System.out.println(super.num);
  11.                 System.out.println(this.num);//给你加一句便于比较

  12.         }
  13. }

  14. class  Extends2
  15. {
  16.         public static void main(String[] args)
  17.         {
  18.                 Zi z = new Zi();
  19.                 z.show();
  20.         }
  21. }
复制代码

作者: 孙飞    时间: 2012-6-22 15:42
在继承中,子类不可以访问父类的私有成员,但是可以访问父类的受保护的成员和公有成员。因为父类的num被private私有化了,父类的num被封装在了父类中,又没有对外提供一个访问的方法,所以子类不能访问到父类的num,即不能操作super.num。但是子类是能够操作自己的num,即this.num。
作者: 黑马-李勇    时间: 2012-6-23 09:30
------05天07课private:私有,权限修饰符:用于修饰类中的成员(成员变量,成员函数)
私有只在本类中有效。
私有是不能被外界访问的,如果想让外界访问:一不私有;二将私有的数据对外提供访问的方法。如05天07课中的person类中的name和age的set和get方法。
作者: 任传敏    时间: 2012-6-23 14:52
关于楼主的标题“为什么不能在父类变量前加私有”是有问题的,并不是在父类变量前不能加私有,而是私有变量不能被子类继承,
所报提示,num可以再Fu中访问private私有。这句话的意思就是Fu的私有变量num只能在本类中访问!建议楼主好好看看java 的修饰符权限知识!
作者: 游洪波    时间: 2012-6-23 19:46
本帖最后由 游洪波 于 2012-6-23 19:51 编辑

父类中可以定义一些私有的变量,但是这些私有变量是无法被他们的子类所继承的,所以你刚才用super.num是访问不到的,private修饰的变量作用域只能在本类中使用。你通过this.num调用到的只是子类中的num如果你想要访问父类中的私有变量的话,不防给它们提供一个出口,就是类似于setter(),getter()这些方法,下边我给你举个例子。
class Fu{
   private int num;
   public void setNum(int num){
      this.num=num;
  }
   public int getNum(){
       return this.num;
  }
}
class ExtendDemo extends Fu{
     public void show(){
         System.out.println(super.getNum());//这样就可以访问到父类中的num了
    }

}
public class Test(){
   public  static void  main(String args[]){
    ExtendDemo  demo=new ExtendDemo ();
    demo.show();
}
}




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