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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜佳瑞 中级黑马   /  2012-7-24 22:01  /  1641 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

私有变量不是不能继承吗?在毕老师课件7天-10抽象类练习中定义了那么多私有变量,在子类中也能继承?

7 个回复

倒序浏览
这个涉及到面向对象的相关问题,你所说的这种父类定义,专门准备被继承的属性需要用protected修饰,将这个属性改成protected的就可以了
回复 使用道具 举报
抽象类的方法里调用抽象类里的私有变量,子类只是调用这个方法,间接访问抽象类的私有成员,不是直接访问的。

点评

好像靠谱,谢谢!  发表于 2012-7-24 23:43

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
子类通过getter/setter访问,不能直接访问
回复 使用道具 举报
public class ArrayDemo

{
        private  int x = 9;
        public class Inner //内部类可以,我想你看到的是比老爷写的内部类
        {                 
                public void test()
                {
                        System.out.println(x);
                }
        };
        public static void main(String[] args) {
           new ArrayDemo().new Inner().test();
        }

}
//内部类可以直接访问所属类的属性值因为内部类里有个隐身的this关键字代表本类
回复 使用道具 举报
首先,不得不赞叹楼主的细心,能够发现这个问题。
父类的私有变量确实不能在子类中直接访问。
但是,建立子类对象时父类私有成员变量也会在内存中加载。
因为在建立子类对象时,子类对象除了持有this引用,还持有super引用
如果父类不重载构造函数,这个super引用就会隐式的在子类中声明super()
也就是毕老师所说的“无父何谈子”,这样super()一加载就会在内存中创建父类对象,私有变量自然就加载了。
但是由于是私有变量,不能在其他类中直接引用,子类也一样不可以。
所以毕老师视频里讲的那个小练习着重是为了讲抽象类,声明的私有变量是不可以在子类引用的。
而且那个小例子里父类Employee中也有抽象方法,父类不也没有被abstract修饰嘛。
那个例子就是在着重讲抽象的用法,稍微忽略了一点语法的只是而已。
希望对楼主有所帮助,望楼主继续努力。。。
回复 使用道具 举报
毕老师那个视频中,父类Employee确实定义了不少私有变量,但是子类Manager和Pro是通过super()来调用父类的构造函数的,并没有继承父类的私有变量,只是通过super()将父类中的私有变量作为了一个引用。
回复 使用道具 举报
首先要明确私有变量的访问权限:只在本类中可以访问。

所以父类中的私有属性,子类是访问不到的。如果想访问其父类的私有属性,必须在父类中定义get、set方法对其私有的属性进行操作,
然后子类再通过调用父类中的get和set方法。从而实现间接的访问其父类的私有成员。



各修饰符访问权限如下:

1) private
  类中限定为private的成员,只能被这个类本身访问。
  如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。

2) default
  类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。

3) protected
  类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。

4) public
  类中限定为public的成员,可以被所有的类访问。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马