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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

唐小斗

初级黑马

  • 黑马币:9

  • 帖子:9

  • 精华:0

© 唐小斗 初级黑马   /  2016-6-15 10:12  /  7429 人查看  /  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又算神马?不是说子类不可以直接使用吗?求大神详解一下!

最佳答案

查看完整内容

楼主,我是这样认为的,这里的this.name肯定是指的Person类本身,这没有错吧,当我们调用学生类无参构造的时候,默认使用的是父类的,this.name和Person中的getName表达的意思不是一样的吗,都是返回本类的成员变量,所以当你Student s = new Student();学生的时候,显示的s.geName还是显示ths,你想想.

33 个回复

倒序浏览
楼主,我是这样认为的,这里的this.name肯定是指的Person类本身,这没有错吧,当我们调用学生类无参构造的时候,默认使用的是父类的,this.name和Person中的getName表达的意思不是一样的吗,都是返回本类的成员变量,所以当你Student s = new Student();学生的时候,显示的s.geName还是显示ths,你想想.

评分

参与人数 1黑马币 +1 收起 理由
噜噜吧 + 1 赞一个!

查看全部评分

回复 使用道具 举报
15603757970 发表于 2016-6-15 14:10
楼主,我是这样认为的,这里的this.name肯定是指的Person类本身,这没有错吧,当我们调用学生类无参构造的时候, ...

,这里的this.name肯定是指的Person类本身的,可是我打印this是指student对象,这怎么理解?
回复 使用道具 举报
15603757970 发表于 2016-6-15 14:10
楼主,我是这样认为的,这里的this.name肯定是指的Person类本身,这没有错吧,当我们调用学生类无参构造的时候, ...

你说“这里的this.name肯定是指的Person类本身”可是打印this却是student对象地址,这怎么理解?还有我想问一下:子类继承父类对于父类的私有属性到底存在不存在子类的堆内存中?
回复 使用道具 举报
本帖最后由 阿姆1Q84 于 2016-6-16 01:03 编辑

首先,你这个程序的测试类中没有main方法无法运行
退一步,讲程序正常运行,new Student(),创建子类的匿名对象,系统会通过子类的默认构造方法去访问父类的无参构造方法并对子类进行初始化数据,这个无参的构造方法也就是你自己所写的Person()这个构造方法,this代表的是子类对象的引用,此时也就是代表的是Student这个类的引用,System.out.println(this);打印输出也是Student这个类的对象的引用地址值,随后,在构造方法中this.name = "ths",进行的是对这个属性name 的显示初始化操作.
回复 使用道具 举报
阿姆1Q84 发表于 2016-6-16 00:58
首先,你这个程序的测试类中没有main方法无法运行
退一步,讲程序正常运行,new Student(),创建子类的匿名对象 ...

首先这是可以运行的用的是Junit测试,你最后所说的“在构造方法中this.name = "ths",进行的是对这个属性name 的显示初始化操作.”我知道是显示初始化操作,我想问这个name属性是属于哪个对象的?
回复 使用道具 举报
sgzqsw 中级黑马 2016-6-16 13:09:43
7#
Student这个类的引用,System.out.println(this);打印输出是Student这个类的对象的引用地址值
你是在构造方法里命名的this.name ,子类调用父类构造方法,构造方法在父类中操作,这时this.name 是可以访问到名字的,也就是父类的名字,但是你构造函数执行完后,退出了构造方法后学生本身是没有name属性。这时name属性是父类的。等于间接帮父类命名了。而且你用Studentd调用getName方法因为学生没定义这个方法,还是返回父类去找,到了父类中看见rerun this.name  虽然这时对象是学生对象 ,但是因为学生没有name属性又继承了父类,所以调用返回的还是父类的名字。
回复 使用道具 举报
this.name = "ths";  这代码表示的是通过this对指向父类Person对象name属性的初始化。
回复 使用道具 举报
dubei1993 来自手机 中级黑马 2016-6-18 00:23:07
9#
首先我也不太懂。程序我运行了下,会打印4个值。两个父类,两个子类地址。如果输出this.name 属性,最后一个是ths. 换句话说,子类的属性已经有了name属性。感觉各位的回答不够直接。换个角度想一下,继承了set和get方法却没有name属性。。很可怕
回复 使用道具 举报
和楼上想法差不多
回复 使用道具 举报
面向对象的继承,父类的是有对象,子类不能调用,但是,父类的构造函数里操作的方法总得实现吧?
回复 使用道具 举报
爱逗猫的鱼 来自手机 初级黑马 2016-6-20 01:24:08
12#
创建子类对象时会默认访问父类的空参构造方法
回复 使用道具 举报
Java继承的定义是“ Java继承是面向对象的最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力”
继承是针对“类”,
调用“属性”的时候,不能从继承方面想。
“this.属性 ”,表示本类属性。
你又会问了,那Student里面的this.name不是继承了Person的name属性吗?咱们可以从“新的类能吸收已有类的数据属性和行为,并能扩展新的能力”。这里想。新类也就是子类已经具备了属性name以后。再有以后的操作。那么在Student类中“this.name”,也是代表本类属性。

总起来说this关键字可以做三件事:
1, “this.属性 ”,表示本类属性

2,调用本类方法

3,this表示当前对象。


package aa;
public class AAA {
        public static void main(String args[]){
                Student ss=new Student();
        }
}
class Person {
    public String name="9";
    public Person(){            
        System.out.println(this);
        this.name = "ths";     //@这是我的一个疑问
        System.out.println(this.getClass().getName());  
        System.out.println(this.name);//"this.属性",表示本类属性
        this.print();//this表示当前对象Student,调用Student的方法print.
    }
    public String getName(){
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
        public void print() {
        }
}
class Student extends Person{
        public void print() {
                System.out.println("Student="+this.name);//子类继承父类的属性
        }
}
回复 使用道具 举报
this.name = "ths"; 这句的意思是:将ths的字符串变量赋值给Person类中的name属性,通过this.name来代码属性Person的属性。
回复 使用道具 举报
15603757970 发表于 2016-6-15 14:10
楼主,我是这样认为的,这里的this.name肯定是指的Person类本身,这没有错吧,当我们调用学生类无参构造的时候, ...

我也是这样认为的
回复 使用道具 举报
爱逗猫的鱼 来自手机 初级黑马 2016-6-22 00:57:06
16#
this的含义是谁调用我就代表谁,this.getClass和this是Student的.this.name是Person的,两个this不是同一个引用对象。又没规定this是不变的,固定指向一个对象,它是通过引用来发挥作用的。
回复 使用道具 举报
你仔细看你的代码...你没发现问题吗..你new 学生对象的方法没有卸载学生类的大括号里面啊...
回复 使用道具 举报
刚接触这块,虽然我不懂.但首先我们得弄明白继承问题:  私有是可以继承的,  但是真私有就不能继承.
  所以我们得清楚的明白 类的属性是写在 .h文件  还是.m文件中
回复 使用道具 举报
this是一个关键字,他调用的就是本类中的成员变量,this可以被当作是本类中的一个对象,还有一个关键字是super他是访问父类中的成员的,继承中确实不能集成私有成员,这里的this.name是给Person中的变量name赋值。如果说的不对还请指点
回复 使用道具 举报
父类要有有set,get方法,子类就可以调用私有的成员变量
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马