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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

选择黑马

黑马帝

  • 黑马币:0

  • 帖子:44

  • 精华:0

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就可以,谢谢!

11 个回复

倒序浏览
首先一点,你要知道父类是怎么产生出来的,父类是又子类提取共性的一些属性和方法产生的,如果父类里面还有私有的东西的话,已经不符合该类的原则问题了。
你可以定义私有的属性,但是必须要对外提供公共的方法区访问。
回复 使用道具 举报
private的只有在类内部才能访问,类内部不是类的对象,所以super也无法访问,private的根本就没有继承下来
回复 使用道具 举报
num在父类中被private修饰,所以子类不能继承。
子类中的num并没有重写父类的num,因为它根本就没有继承父类的num,所以当调用super.num时会报错:num可以在Fu中访问private.
而用this调用是调用子类的num,即输出值为9,如果不用this.num,同样也为9,即加不加this,结果都一样!
回复 使用道具 举报
本帖最后由 小张童鞋 于 2012-6-21 23:50 编辑

当你将this改成super后编译出错后给出得提示意思其实是:num不能再超类中访问被private修饰的变量.
Fu类中定义了num为私有,只有Fu类中的方法可以访问的到Fu类中的num,子类是不能访问的到它的,就算继承也不会继承父类的private修饰的变量。
super:访问的超类(父类);
this:访问的是自己的属性.
回复 使用道具 举报
如果子类中出现非私有的同名成员变量时,
子类要访问本类中的变量,用this
子类要访问父类中的同名变量,用super。

super的使用和this的使用几乎一致。
this代表的是本类对象的引用。
super代表的是父类对象的引用。
回复 使用道具 举报
韦念欣 黑马帝 2012-6-22 00:09:58
7#
楼主的代码中,因为子类也声明了和父类一样的num。则this.num指向的就是子类的num,而super.num指向的是父类的num。
又因为父类的num被private私有化了,所以子类不能直接操作父类的num,即不能操作super.num。
但是子类是能够操作自己的num,即this.num。
回复 使用道具 举报
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:46
9#
在继承中,子类不可以访问父类的私有成员,但是可以访问父类的受保护的成员和公有成员。因为父类的num被private私有化了,父类的num被封装在了父类中,又没有对外提供一个访问的方法,所以子类不能访问到父类的num,即不能操作super.num。但是子类是能够操作自己的num,即this.num。
回复 使用道具 举报
------05天07课private:私有,权限修饰符:用于修饰类中的成员(成员变量,成员函数)
私有只在本类中有效。
私有是不能被外界访问的,如果想让外界访问:一不私有;二将私有的数据对外提供访问的方法。如05天07课中的person类中的name和age的set和get方法。
回复 使用道具 举报
关于楼主的标题“为什么不能在父类变量前加私有”是有问题的,并不是在父类变量前不能加私有,而是私有变量不能被子类继承,
所报提示,num可以再Fu中访问private私有。这句话的意思就是Fu的私有变量num只能在本类中访问!建议楼主好好看看java 的修饰符权限知识!
回复 使用道具 举报
本帖最后由 游洪波 于 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();
}
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马