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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

类的继承会不会继承父类的私有成员?

11 个回复

倒序浏览
可以继承,但是不能直接访问,可以在父类里建一个能获取私有成员的public方法,就可以访问了
回复 使用道具 举报
没有继承。
看下代码:
namespace 对象
{
    class A
    {
        private string aa = "dfdf";
        private string print()
        {
            return "****";
        }
  
        public string AA
        {
            get { return aa; }
  
        }
    }
  
    class B : A
    {
        private int a = 1;
        public void test()
        {
            //Type type = typeof(A);
            //MethodInfo methodInfo = type.GetMethod("print", BindingFlags.NonPublic | BindingFlags.Instance);
            //A testA = (A)Activator.CreateInstance(type, false);
            //string str = (string)methodInfo.Invoke(testA, null);
            //Console.WriteLine(str);
  
            Type type2 = typeof(B);
            MemberInfo[] memberInfo = type2.GetMembers(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField);
            foreach (MemberInfo mi in memberInfo)
            {
                Console.WriteLine(mi.Name);
            }
        }
  
        class Program
        {
            static void Main(string[] args)
            {
                B b = new B();
                b.test();
            }
        }
    }
  
}

测试出来的结果是:没有父类的私有字段。ok。
回复 使用道具 举报
本帖最后由 刘宁 于 2012-3-14 16:14 编辑

可以继承但不可以直接访问。
子类可以继承父类的所有成员跟方法,继承下来不代表可以访问,要访问得看访问控制规则。私有属性也可以继承,不过根据访问控制规则,私有属性虽继承下来却不可以访问的,只有通过public的方法访问继承下来的私有属性。
例如在Person类中,age私有化以后,类以外即使建立了对象了也不能直接访问,需要在Person类中提供对应的访问age的方式。对外提供方法只有两种形式set和get。
这一块毕老师讲的很清楚,建议再看下视频。
class  Person
{
        private int age;
        //把属性都隐藏,提供公共方法对其访问。对外提供方法只有两种形式set和get。
       
        public void setAge(int a)
        {
                age = a;                       
        }

        public int getAge()
        {
                return age;
        }
        void speak()
        {
                System.out.println("age="+age);
        }
}

class PersonDemo
{
        public static void main(String[] args)
        {
                Person p = new Person();
                p.setAge(45);
                p.speak();
        }
}
回复 使用道具 举报
本帖最后由 adison 于 2012-3-14 16:46 编辑

同楼上:(代码改了自己的,觉得从输出语句那里更能体现楼主的问题,还有,个人觉得set,get不一定都得public,只要子类能调用就行)子类可以继承父类的所有成员跟方法,私有属性也可以继承,不过根据访问控制规则,私有属性只能在本类内部使用,所以只有通过方法访问继承的私有属性。如下面代码
class Fu
{
        private int num = 4;
        public void setNum(int num)
        {
                this.num =num;
        }
        public int getNum()
        {
                return this.num;
        }
}

class Zi extends Fu
{
}
class  ExtendsDemo
{
        public static void main(String[] args)
        {
                Zi z = new Zi();
                z.setNum(5);
                System.out.println(z.getNum());
                //System.out.println(z.num);不能这样访问,私有成员只能在本类中调用
                }
}
回复 使用道具 举报
明确不能继承...只有本类中能用  继承体系public 默认 protected都行就私有不行
回复 使用道具 举报
      要是能继承,当然就可以访问了。既然不可以访问,当然就不能继承。
      比如一个类有私有变量,那么我在该类的方法中可以直接使用私有变量,只不过在别的类里面无法来访问而已。假如可以继承私有变量,也就是说该私有变量成了继承类的私有变量了,按照这个说法,在继承的类中的方法里也是可以直接使用私有变量的,所以变成了继承类可以访问被继承类的私有变量了。这个说法矛盾
回复 使用道具 举报
张润政 黑马帝 2012-3-14 16:49:12
8#
子父类出现之后,类中成员的特点

这个问题是关于子父类继承关系出现之后类中成员的特点。
当父类中的成员变量或者函数声明为private私有的时候子类中的对象是不能访问父类中的私有成员的。
如果确实需要用到父类中定义的私有变量,我们一般会在父类中提供一个公有的set和get方法,来操作这个私有的成员。
例如:
class Person{
        private String name;
        private int age;
        public void setName(String name){
                this.name=name;
        }
        public String getName(){
                System.out.println(name);
                return name;
        }
        public void study(){
                System.out.println("good person study");
        }
}
class  Student extends Person { //学生类继承person类
        public void study(){
            System.out.println("good student study");
        }
}
class ExtendsDemo{
        public static void main(String[] args) {
                Student stu = new Student();
                stu.setName("lisi");
                stu.getName();
        }
}
另外,如果子父类中出现了非私有的同名成员变量时,子类要访问本类中的变量,用this.;子类要访问父类中的同名变量,用super.;
回复 使用道具 举报
袁野 黑马帝 2012-3-14 17:01:48
9#
需要个 public 的方法 间接的访问父类私有成员
回复 使用道具 举报
不能继承  只能通过父类提供的public get方法获取···注意是获取不是继承
回复 使用道具 举报
丁佼 黑马帝 2012-3-14 17:35:36
11#
1、假设父类person中有name私有成员变量,可以通过setName和getName方法进行改写和获取name中的内容
2、子类student继承person类,可以发现子类student同样具有name属性,但是子类无法直接在自己内部对name进行改写和读取,只能通过setName和getName方法来操作name。
3、通过构造函数也可以验证student中存在name属性
       person(String name,int age)   //父类person的构造函数,为了观看舒适我多添加了一个age属性
           {thi.name = name;this.age = age;}
       =====================================
           student(Sting name,int age)   //子类student的构造函数
           {super(name,age);}

从中可以看出,子类student是有name属性的,但是name已经被封装,只能通过person类的public方法setName和getName来进行操作。
回复 使用道具 举报
能继承、不能操作。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马