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

唐小斗

初级黑马

  • 黑马币:9

  • 帖子:9

  • 精华:0

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

5黑马币
public class Person {
    private String name;
    public Person(){
        Class classs = this.getClass();         
        System.out.println(this);
        this.name = "ths";     //@这是我的一个疑问
        System.out.println(this);
    }
    public String getName(){
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
public class Student extends Person{}
@Test
    public void testExtends(){
        new Student();
    }
简单说明一下上面的代码:一个student类继承person类,在测试类中我new了一个student对象,我们都知道在创建子类对象时默认会去调用父类的构造方法所以构造方法中的this代表student对象,可是让我很不明白的是this.name,不是说子类不继承父类的私有属性吗?那么这个this.name又算神马?不是说子类不可以直接使用吗?求大神详解一下!

33 个回复

正序浏览
唐小斗 发表于 2016-6-16 09:51
首先这是可以运行的用的是Junit测试,你最后所说的“在构造方法中this.name = "ths",进行的是对这个属性n ...

name属性是父类的,但在继承关系中,你创建Student类对象的时候,Person类对象也会自动调用父类构造方法创建对象。且父类对象在子类对象的内部,所以子类可以继承父类的属性和方法。比如:{子:{父:name}},外面的大括号代表子类对象,里面的大括号代表父类对象。name这个属性在父类对象里,但因为嵌套关系的存在,那么也在子类对象里。name这个属性在父类中定义,子类从父类继承过来获得name,这种类似于嵌套的模式下我的水平只能解释成这样了——name在父类中定义,子类继承获得(即使父类属性被私有化,子类任可继承,知识无法访问)。
回复 使用道具 举报
你创建了子类对象,子类对象创建时自动调用父类的构造方法,父类构造方法完成this.name的赋值.
回复 使用道具 举报
新手上路求多指教 还没学到这么多  进来一看   没有一个问题能看懂    我好方
回复 使用道具 举报
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,你可以用代码将他分为几个简单的问题,然后理解
回复 使用道具 举报
继承
      不管父类中的成员是public、protected、default还是private访问权限、子类都会拥有父类中的成员,也就是说,在堆内存中的子类对象里面有一个父类对象。
     拥有并不代表可以直接访问:private成员变量,子类对象无法直接访问;default成员变量,子父类同一个包,可以直接访问,不在同一个包是不能直接访问的。其他访问权限都是可以使用子类对象直接访问父类成员。
     父类中的成员变量是静态的、还是非静态的,子类都会拥有父类中的这些成员变量。只要没有被private修饰都是可以直接调用的。

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

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

回复 使用道具 举报
我个人觉得子类在继承父类对象时  会继承父类的私有属性,子类对象只是没有访问权限。
子类对象在new的时候会调用父类构造函数,这时父类构造函数中的this代表了子类对象。这时使用this给私有成员变量赋值时也是向子类私有属性赋值
回复 使用道具 举报
15603757970 发表于 2016-6-15 14:10
楼主,我是这样认为的,这里的this.name肯定是指的Person类本身,这没有错吧,当我们调用学生类无参构造的时候, ...

this指向Student  而不是Person
回复 使用道具 举报
这里是父类的构造方法给私有变量name赋值的,你的子类只是实例化了一个Person对象,给name赋值的是Person类的构造方法Person()。子类并没有调用父类的私有变量name。
回复 使用道具 举报
this代表的是当前调用  
回复 使用道具 举报
this调用的是父类的
回复 使用道具 举报
现在的this.name,等同于name
回复 使用道具 举报
1,子类继承父类,在对子类对象构造之前会先调用父类构造    构造就是对对象进行初始化
2,this代表当前对象的引用
2,私有属性只能在本类中被访问.   
所以在父类中用this.name有什么不可以?
你的问题是  :子类不可以直接使用父类私有属性.     这句话是正确的  ,  意思是不能在子类中使用父类的私有属性,
没有说不能在父类使用父类属性.
回复 使用道具 举报
    可是让我很不明白的是this.name,不是说子类不继承父类的私有属性吗?那么这个this.name又算神马?不是说子类不可以直接使用吗?求大神详解一下!
分析一下:
  1.说明一下子类可以继承父类私有属性,没有private修饰的变量可以 对象.name就表示这个属性,可以赋值(类似set方法)也可输出等等操作,但是private修饰变量之后就不能这样用了,只能setter,getter得到这个变量,但是他还是继承父类的属性,只是private的访问权限修饰符限定你不能直接使用实例变量,需要用方法访问,这就是面向对象思想,封装,让你继承使用,为了弥补单继承的缺陷就有了多态。所有的面向对象知识都是有关联的,好好理解,希望对你有帮助,祝成功!
回复 使用道具 举报
父类要有有set,get方法,子类就可以调用私有的成员变量
回复 使用道具 举报
this是一个关键字,他调用的就是本类中的成员变量,this可以被当作是本类中的一个对象,还有一个关键字是super他是访问父类中的成员的,继承中确实不能集成私有成员,这里的this.name是给Person中的变量name赋值。如果说的不对还请指点
回复 使用道具 举报
刚接触这块,虽然我不懂.但首先我们得弄明白继承问题:  私有是可以继承的,  但是真私有就不能继承.
  所以我们得清楚的明白 类的属性是写在 .h文件  还是.m文件中
回复 使用道具 举报
你仔细看你的代码...你没发现问题吗..你new 学生对象的方法没有卸载学生类的大括号里面啊...
回复 使用道具 举报
爱逗猫的鱼 来自手机 初级黑马 2016-6-22 00:57:06
15#
this的含义是谁调用我就代表谁,this.getClass和this是Student的.this.name是Person的,两个this不是同一个引用对象。又没规定this是不变的,固定指向一个对象,它是通过引用来发挥作用的。
回复 使用道具 举报
15603757970 发表于 2016-6-15 14:10
楼主,我是这样认为的,这里的this.name肯定是指的Person类本身,这没有错吧,当我们调用学生类无参构造的时候, ...

我也是这样认为的
回复 使用道具 举报
this.name = "ths"; 这句的意思是:将ths的字符串变量赋值给Person类中的name属性,通过this.name来代码属性Person的属性。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马