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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Zi类的对象去调用的show,当前对象应该是子类对象啊,为什么输出的结果是父类的成员变量的默认值?

[Java] 纯文本查看 复制代码
class Demo {
	public static void main(String[] args) {
		Zi z= new Zi();
		z.show();//子类的对象去调用的show,当前对象应该是子类对象啊,为什么输出的结果是父类的成员变量值?
	}
}
class Fu {
	public int a;
	private String s;
	
	public int getA() {
		return a;
	}
	public void setA(int a) {
		this.a = a;
	}
	public String getS() {
		return s;
	}
	public void setS(String s) {
		this.s = s;
	}
	
	public void show(){
		System.out.println(this.a);
		System.out.println(this.s);
	}
}

class Zi extends Fu{
	int a = 123;
	String s = "niao";	
}

21 个回复

倒序浏览
构造方法不能继承,你要在子类重写构造方法,对父类初始化
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
回复 使用道具 举报
楼上你在说什么,虽然没有构造方法,但是也手动赋值了,楼主问的不是构造方法啊
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
今天学了静态,也很困惑
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
子类对象在内存中分为两个区域,分别标记为this和super,访问父类中成员默认都会加super.成员,在你这个show方法里,就相当于super.this.a,show方法中的this其实是指向一个父类地址,去掉this变量名就近访问,输出就肯定是子类成员变量
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
回复 使用道具 举报
若白衣卿相 发表于 2016-10-26 13:12
子类对象在内存中分为两个区域,分别标记为this和super,访问父类中成员默认都会加super.成员,在你这个sho ...

去掉this也是一样的结果哦
回复 使用道具 举报
本帖最后由 evan.zhou 于 2016-10-26 14:06 编辑
若白衣卿相 发表于 2016-10-26 13:12
子类对象在内存中分为两个区域,分别标记为this和super,访问父类中成员默认都会加super.成员,在你这个sho ...

这个解释还是有点晕啊
对着运行结果,解释下运行过程呗。谢谢
回复 使用道具 举报
zhangpanqin 发表于 2016-10-26 11:57
构造方法不能继承,你要在子类重写构造方法,对父类初始化

我不是问的构造方法的问题啦
看运行结果,解释运行过程
回复 使用道具 举报
回复 使用道具 举报

啥意思???
回复 使用道具 举报
若白衣卿相 发表于 2016-10-26 12:59
楼上你在说什么,虽然没有构造方法,但是也手动赋值了,楼主问的不是构造方法啊
...

创建对象,默认是无惨构造,所以是创建了对象,而没有赋值,你在子类写的没有用
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
运行时子类调用父类的无参构造
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
简单的说吧,子类中调用方法,先在子类中找,子类中没这个方法就调用父类中方法。然后你想父类方法定义的时候都不一定有这个子类,父类方法中访问的成员变量肯定是父类的成员变量,输出就是这个结果了
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
再加点内容吧。在子类对象调用方法的时候,可以有this访问本对象成员,super访问父类成员。this指向调用方法的对象本身,super呢?用法和this一样,肯定也指向一个对象,而且是父类对象,才能调用父类成员。子类调用方法子类中不存在,调用父类中的方法,其实就是super.成员方法。在这个成员方法中也可以用this指向调用方法的对象,也就是super,这里this.属性访问的就是父类中的属性,父类中属性都是没有手动赋值系统给的默认值,就这样了。
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报 1 0
一句话概括:成员变量不具备多态性,自行补脑。

点评

这里不存在多态的问题吧!  发表于 2017-6-16 20:06
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
。。看文字有点晕。。能不能说子类没有的就去找父类。。??

点评

关键是这里子类有啊,子类不是定义了 int a = 123;嘛,要是子类找不到就不存在楼主这个问题了!  发表于 2017-6-16 20:05
回复 使用道具 举报
hmgmx 初级黑马 2016-10-28 14:28:58
19#
子类传承父类,子类调用方法,先在子类找,子类没有的找父类
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
poi1234bnm 发表于 2016-10-28 13:56
。。看文字有点晕。。能不能说子类没有的就去找父类。。??

子类有的优先使用子类?
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马