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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

唐小斗

  • 黑马币:9

  • 帖子:9

  • 精华:0

© 唐小斗   /  2016-6-15 10:12  /  7427 人查看  /  33 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

    可是让我很不明白的是this.name,不是说子类不继承父类的私有属性吗?那么这个this.name又算神马?不是说子类不可以直接使用吗?求大神详解一下!
分析一下:
  1.说明一下子类可以继承父类私有属性,没有private修饰的变量可以 对象.name就表示这个属性,可以赋值(类似set方法)也可输出等等操作,但是private修饰变量之后就不能这样用了,只能setter,getter得到这个变量,但是他还是继承父类的属性,只是private的访问权限修饰符限定你不能直接使用实例变量,需要用方法访问,这就是面向对象思想,封装,让你继承使用,为了弥补单继承的缺陷就有了多态。所有的面向对象知识都是有关联的,好好理解,希望对你有帮助,祝成功!

点评

我回答的很详细了,希望得到分,目前急需  发表于 2016-6-26 01:18
回复 使用道具 举报
1,子类继承父类,在对子类对象构造之前会先调用父类构造    构造就是对对象进行初始化
2,this代表当前对象的引用
2,私有属性只能在本类中被访问.   
所以在父类中用this.name有什么不可以?
你的问题是  :子类不可以直接使用父类私有属性.     这句话是正确的  ,  意思是不能在子类中使用父类的私有属性,
没有说不能在父类使用父类属性.
回复 使用道具 举报
现在的this.name,等同于name
回复 使用道具 举报
this调用的是父类的
回复 使用道具 举报
this代表的是当前调用  
回复 使用道具 举报
这里是父类的构造方法给私有变量name赋值的,你的子类只是实例化了一个Person对象,给name赋值的是Person类的构造方法Person()。子类并没有调用父类的私有变量name。
回复 使用道具 举报
15603757970 发表于 2016-6-15 14:10
楼主,我是这样认为的,这里的this.name肯定是指的Person类本身,这没有错吧,当我们调用学生类无参构造的时候, ...

this指向Student  而不是Person
回复 使用道具 举报
我个人觉得子类在继承父类对象时  会继承父类的私有属性,子类对象只是没有访问权限。
子类对象在new的时候会调用父类构造函数,这时父类构造函数中的this代表了子类对象。这时使用this给私有成员变量赋值时也是向子类私有属性赋值
回复 使用道具 举报
继承
      不管父类中的成员是public、protected、default还是private访问权限、子类都会拥有父类中的成员,也就是说,在堆内存中的子类对象里面有一个父类对象。
     拥有并不代表可以直接访问:private成员变量,子类对象无法直接访问;default成员变量,子父类同一个包,可以直接访问,不在同一个包是不能直接访问的。其他访问权限都是可以使用子类对象直接访问父类成员。
     父类中的成员变量是静态的、还是非静态的,子类都会拥有父类中的这些成员变量。只要没有被private修饰都是可以直接调用的。

这不属于直接使用啊,你的构造方法里面默认了调用了父类的构造方法,这才使用的,就像你用
Student对象调用 set.get方法一样呗
class Student extends Person{

        /*public Student() {     //没有构造参数,系统默认添加无参构造参数
                super();                        //默认调用父类的无参构造方法
        }*/       
}

回复 使用道具 举报
public class Demo_Extends {
        public static void main(String[] args) {
                new Son();
        }
}
        class Father{
                private int num=3;
                public  int i = 4;
                Father(){
                        System.out.println(this.num);
                }
        }
                class Son extends Father{
                       
                }
他这个this就是父类的this,你可以用代码将他分为几个简单的问题,然后理解
回复 使用道具 举报
新手上路求多指教 还没学到这么多  进来一看   没有一个问题能看懂    我好方
回复 使用道具 举报
你创建了子类对象,子类对象创建时自动调用父类的构造方法,父类构造方法完成this.name的赋值.
回复 使用道具 举报
唐小斗 发表于 2016-6-16 09:51
首先这是可以运行的用的是Junit测试,你最后所说的“在构造方法中this.name = "ths",进行的是对这个属性n ...

name属性是父类的,但在继承关系中,你创建Student类对象的时候,Person类对象也会自动调用父类构造方法创建对象。且父类对象在子类对象的内部,所以子类可以继承父类的属性和方法。比如:{子:{父:name}},外面的大括号代表子类对象,里面的大括号代表父类对象。name这个属性在父类对象里,但因为嵌套关系的存在,那么也在子类对象里。name这个属性在父类中定义,子类从父类继承过来获得name,这种类似于嵌套的模式下我的水平只能解释成这样了——name在父类中定义,子类继承获得(即使父类属性被私有化,子类任可继承,知识无法访问)。
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马