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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 莫嘉伟 中级黑马   /  2013-3-1 21:50  /  2794 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

子类能获得父类的private属性吗,经我自已试验好像是不行,private属性对子类也是不可见的,不过不知是我眼贱还是脑子进水我总觉得好像不知在哪本书上看过子类也能获得父类的private属性,求个大神把这事说明白让我安心。

8 个回复

倒序浏览
哥们 为了回答你这个问题,我去查了下oracle官网
http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
其他的都不懂,不过官网有这么一句话:A subclass does not inherit the private members of its parent class. However, if the superclass has public or protected methods for accessing its private fields, these can also be used by the subclass.
我英语不太好,不能准确的翻译,大概意思是:一个子类不继承父类的私有成员,然而,如果父类有提供公共的,或者受保护的方法,那么子类可以利用这些方法访问私有属性了!
回复 使用道具 举报
public修饰的就先不说了,protect修饰的也可以被同一个包和子类访问,我的问题其实是我现在有个父类,他有几个属性我想让他只能通过指定的方法获取和修改,保护数据嘛,然后这个父类有一个子类,这个子类继承了父类,可他却没有父类的部份属性·这让我感到有点违和,其实我也想过干脆咱就在那子类那定义几个一样的属性算了,不过这做法好像不是很好,完全体现不出继承这个特点,我也试过在子类那新建一个父类对象,用父类对象获取的属性作为子类的属性,可是这样一来我不就相当于在子类里又搞了个属性嘛,好像还是没体现出继承,不过它的类型是父类而已···我就这感觉。
回复 使用道具 举报
子类对象在初化的过程中:
1、首先是执行父的构造函数(生成父类的一个对象),且这个父类对象属于子类对象的一部分;
2、然后再执行自身的构造函数。也就是说生成一个子类对象的同时成生成了一个类父对象;
3、因为父类的私有成员对子类不可见,这样也可以说成子类没有继承父类的私有成员,但它的确是在存的
4、子类在复父类员成时,其实子类父的成员还是同时存在的,只是子类在执行同名成时,是执行子类的那一份而已,
测试代码:
package test2;
public class FuZiTest {

public static void main(String[] args) {
  Zi zi = new Zi();
   //自始终我们只建立了一个子类对象
   //通过子类对象获取父类中的私有成员
   System.out.println(zi.getFuA1());//fua1父类的私有员,
   //通过子类对象获取父类中的非私有成员
   System.out.println(zi.getFuA2());//fua2父类的同名成员a2
   
   System.out.println(zi.getZiA2());//Zia2子类的同名成员a2
   
   System.out.println(zi.a3);//父类的a3被继承了,内存中应该只
   zi.setA3();
   //证明当子父没有复盖的成员是同一份a3
   System.out.println(zi.a3);//zia3
   System.out.println(zi.getFuA3());//zia3
   //结论:产生子类对象过程中会有一个父类对象产生;
   //复盖不是真正的发生,只是在继成过种产生了跟复盖一样效果
}
}
class Fu {
private String a1 = "fua1";
String a2 = "fua2";
String a3 = "funa3";
public String getA1() {
  return a1;
}
public String getA2() {
  return a2;
}
}
class Zi extends Fu{
String  a2 = "Zia2";
//获取父类那个a1
public String getFuA1() {
  return super.getA1();
}
//获取 子类那个a1
public String getZiA2() {
  return a2;
}
//获取父类那个a2
public String getFuA2() {
  return super.getA2();
}
//获取父类那个a3
public String getFuA3() {
  return super.a3;
}
//设置子类的那个看不见的a3
public void setA3(){
  a3="zia3";
}



}


回复 使用道具 举报
谢谢类上的哥们~
回复 使用道具 举报
在面向对象程序设计中运用继承原则,就是在每个由一般类和特殊类形成的一般——特殊结构中,把一般类的对象实例和所有特殊类的对象实例都共同具有的属性和操作一次性地在一般类中进行显式的定义,在特殊类中不再重复地定义一般类中已经定义的东西,但是在语义上,特殊类却自动地、隐含地拥有它的一般类(以及所有更上层的一般类)中定义的属性和操作。特殊类的对象拥有其一般类的全部或部分属性与方法,称作特殊类对一般类的继承。
回复 使用道具 举报
class Person {         
      private String name;        
      private int age;           
      public void setName(String name)
              {               
               this.name = name;                 
               }        
      public void setAge(int age)
               {               
               this.age = age;         
                }         
       public String getName()
               {                 
               return name;         
               }      
        public int getAge()
              {               
                return age;        
                }
}  
class Student extends Person {      
           private String school;         
           public void setSchool(String school)
                  {                 
                   this.school = school;        
                    }        
           public String getSchool()  
                    {               
                    return school;         
                     }
}
             public class TestPerson
                  {         
                    public static void main(String[] args)
                         {                 
                         Student student = new Student();                 
                          student.setName("John");//子类继承父类的方法                 
                          student.setAge(18);               
                           student.setSchool("SCH");                 
                          System.out.println(student.getName());               
                          System.out.println(student.getAge());               
                          System.out.println(student.getSchool());        
                          }
}
(1) 子类是不能访问父类中private的属性和方法的,但子类能访问父类的public的属性和方法,因为student这个类继承父类Person,而父类Person里的setName()是public的,所以子类能访问setName()这个方法,setName()这个方法又是在父类Person里的,在同一个类里的方法当然可以访问这个类的属性,总的来说:就是子类student通过setName()来间接访问父类Person的私有属性  
(2) 子类虽然不能访问父类的私有变量,但是子类继承了父类的变量和方法,Student类实际上有3个变量,分别是name age school,有6个方法,分别是父类的4个和自己的两个,实际上你在main方法是给自己的private变量name age school 赋值,所以你在get时取到的是自己的private 变量值 而不是父类private变量的值   一般是把父类的属性设置为private的,然后提供一个public的方法可以获得该属性,这样父类就可以实现封装,子类可以继承父类属性和方法
回复 使用道具 举报
获得了,这个属性在子类的堆内存中是存在的,只不过不可见。但你可以使用公共方法来设置或修改它。

可以想一下,公共方法是可以继承到的吧,公共方法操作的是私有属性,要是没继承到这个私有属性,怎么可能去操作它。
回复 使用道具 举报
帮你查了一下
子类继承父类,子类拥有父类所有的属性和方法,于是使用程序去验证,发现父类的私有属性和私有方法,子类是不能访问的,当然一些父类的私有属性可能可以通过相应的方法访问到,但是私有的方法似乎不能简单的访问。
这里暂不考虑Java反射机制,于是我分析,子类不能继承父类私有的属性及方法,但是分析了内存后,我发现我是错的,在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象。
所以所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用。就像有些东西你可能拥有,但是你并不能使用。所以子类对象是绝对大于父类对象的,所谓的子类对象只能继承父类非私有的属性及方法的说法是错误的。可以继承,只是无法访问到而已。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马