我写了两个类,第一个类Test1:
public class Test1 {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
第二个类Test2继承Test1:
public class Test2 extends Test1 {
public static void main(String args[]){
Test2 t2=new Test2();
t2.setName("a");
System.out.println(t2.getName());
}
}
为什么第二个类中t.setName("a")和t2.getName()都能访问到Test1的private的name?不是说子类不能继承父类的私有成员吗?

解决方案 »

  1.   

    私有成员不能直接访问
    setName()和getName()这不算直接访问
      

  2.   

    又是你,呵呵,那Test2具有name属性吗?
      

  3.   


    Test2有name属性,当然,它是私有的。
    即使是私有属性,也只是不能被别的类访问而已,自己还是可以的。
    所以在Test2类中,仍然可以直接访问name
      

  4.   

    哦抱歉,说错了一点,protected才可被子类直接访问
      

  5.   

    Test2类中是没有name属性的,Test2继承Test1,你在new一个Test2实例的同时会同时new一个Test1,所以,你访问的还是Test1中的name属性,private属性是不会被继承的。
      

  6.   

    你只是通过继承过来的get/set方法去访问父类的private属性。
      

  7.   

    那就是说Test2没有那么属性,但是可以访问name属性?怎么感觉这么乱呢
    能不能解释详细些,谢谢啦
      

  8.   

    我用公有方法可以访问到name,那这么name是Test2的还是Test1的?
      

  9.   

    qichao88888,能否解释下“new一个Test2实例的同时会同时new一个Test1”,那么Test2的实例和Test1的实例是怎么联系起来的?是test2的实例中有一个指向test1实例的引用吗?
      

  10.   

    是不能继承,但很矛盾的你提供了访问方法。get  set
    test2是没有name属性的,但是可以通过set get 访问,,这就是封装。
    父类不给子类直接访问的权限,但提供了间接访问的方法。
      

  11.   

    你自己提供了访问的方法,当然能访问了。
    你是访问的那个public方法,然后那个方法访问自己的private变量。
      

  12.   

    举个例子说明:Test1类是爸爸,Test2类是儿子,爸爸有自己的钱,儿子没有钱,连卡都没有。 但是爸爸把卖东西和买东西的权利对儿子开放了。  假如爸爸银行卡里面的钱开始为100块钱,然后儿子帮爸爸在卖了一件衣服值50块钱,这时候那爸爸的银行卡里就有150块钱了,后来儿子又帮爸爸买包烟20块钱,银行卡里面钱就只有130块钱了。 但这中间不论什么时候,银行卡里面的钱,都不是儿子的。 儿子在没有去买东西或者卖东西的操作的时候,永远都碰不到这个钱的。先就这样解释了,看我这解释能不能让楼主理解一下。
      

  13.   

     你应该去看看setter  getter的作用
      

  14.   


    public class Test2 extends Test1 {

    @Override
    public void setName(String name) {
    super.setName(name);
    } @Override
    public String getName() {
    return super.getName();
    } public static void main(String args[]){
       Test2 t2=new Test2();
       t2.setName("a");
       System.out.println(t2.getName());
    }
    }
      

  15.   

    实际上获取的还是中Test1对象中的name属性
      

  16.   

    Test1类中的setName是public的,所以可以直接用子类来调用。
      

  17.   

    Test2通过继承,自动拥有了Test1的所有成员(成员变量和方法)。
    可以这样
    public class Test2 extends Test1 {
    public static void main(String args[]){
    Test1 t1 = new Test1();
    t1.setName("A");
    System.out.println(t1.getName());
    Test2 t2=new Test2();
    t2.setName("a");
    System.out.println(t2.getName());
    }
    }
      

  18.   

    楼主,建议你可以去看看封装的条件,里面的get和set方法都是讲的这么个意思
      

  19.   

    Test1中定义了外部访问Test1中私有属性name的方法,Test2继承了Test1类,同时也继承了Test1中访问name的方法,所以第二个类中t.setName("a")和t2.getName()都能访问到Test1的private的name。
    在类的继承中,子类确实不能直接访问父类,直接访问就是 对象名.属性,这样的访问方式就是直接访问类中的属性
      

  20.   

    setName()和getName()这不算直接访问你通过设置这个方法,就可以进行访问的。 
      

  21.   

    extends继承
    楼主可以这么想,就是不管你父类设置了什么权限我都拿过来了
    只是你private的话,我就没有你的钥匙,打不开而已。
      

  22.   

    这样是有点明白了,但是假如我的get方法返回的是private属性的一个引用,对于这个get方法返回一个引用,我不就可以任意修改了吗?这样是不是和你说的“令别的类只能通过本类提供的有限方法访问私有属性”矛盾了,举个例子:
    假如getName()返回的不是String类型而是我定义Name类型,那么以下操作是不是可以任意访问private属性了?
    Name n=new Test1().getName();
    n.firstName="我改了你的姓氏";
    n.lastName="我改了你的名字";
    这样是不是与你说的“令别的类只能通过本类提供的有限方法访问私有属性”矛盾
      

  23.   

    这是什么意思?是说我的Test2和你写的Test2是同样的吗?
      

  24.   

    Test2也拥有Test1的私有属性吗?
      

  25.   

    中创建子类对象时,会先创建父类的对象。 
    实际上中内存块中的子类对象包含了父类的对象,继承实际上就可以看做是给子类添加了一个父类类型的属性:super。
      

  26.   

    子类继承父类在jvm中是怎么表示的?是不是子类实例中含有一个指向父类的引用?
      

  27.   

    LZ貌似有点混乱了。
    private的作用在于,限制被它修饰的属性:只能中本类中调用。
    但不是说不能被间接调用。
    比如说下面的:
    Name n=new Test1().getName();
    n.firstName="我改了你的姓氏";
    n.lastName="我改了你的名字";
    在Test1中应该是定义了 private Name name;
    这里的private只能限制name的属性只能中本类中直接调用。其他类无法对其直接修改(new Test1().name=?),但是可以间接修改。
    总得来说,private 只能限制调用,而不能限制值的改变。
    final 才是用来限制值不能修改的。
      

  28.   

    有,你这样试一下。
    class Test1 {
    private String name ="i am father";
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;

    }
    //第二个类Test2继承Test1:public class Test2 extends Test1 {
    //name = " i am son";此处不能象Test1那样赋值
    public static void main(String args[]){
    Test1 t1 = new Test1();
    //t1.setName("A");
    System.out.println(t1.getName());
    Test2 t2=new Test2();
    t2.setName("i am son");
    System.out.println(t2.getName());
    System.out.println(t1.getName());//t1的名称改了吗
    }
    }
      

  29.   


    对于原始数据类型以及String类型,通过get()方法拿到私有属性也没法修改
    对于String类型之外的对象类型属性,确实可以通过你说的方法进行修改。也就是说private的保护不是万能的,它只能提供一定程度的保护。
      

  30.   

    public class Test1 {
    private String name;
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;

    }
    第二个类Test2继承Test1:
    public class Test2 extends Test1 {private String name; //再定义一个相同的会不会报错??
    public static void main(String args[]){
    Test2 t2=new Test2();
    t2.setName("a");
    System.out.println(t2.getName());
    }
    }
      

  31.   

    楼主的疑惑是Test2是不是也继承的Test1的name。这个很好验证。
    public class Test1 {
       private String name = "Test1";
       public String getName() {
         return this.name;
       }}public class Test2 extends Test1 {
      private String name = "Test2";
      public Test2() {
        System.out.println(this.getName());
      }
      public static void main(String[] args) {
        Test2 t2 = new Test2();
      }
    }
    打印出来的是Test1。
      

  32.   

    就是因为子类继承父类的缘故,虽然private修饰的成员是不能被其他类访问的,但是通过getter和setter访问器就能对私有成员进行访问,如果没有继承特性,子类就不能去访问其父类的私有成员了