(JAVA)关于this的一个细节问题

悠树 发布于 2015/07/10 12:32
阅读 484
收藏 1
package t4;

	class Father{       
		private void print()
	    {   
	        System.out.println("Father") ;
	    }
	    public void fun()
	    {   
	    	System.out.println(this);
	        this.print() ;    // 调用print()方法
	    }
	};
	 
	class Child extends Father{    // 定义继承关系
		public void print(){    // 覆写父类中的方法
	        System.out.println("Child") ;
	    }
	    
	};
	public class Test4
	{
	    public static void main(String args[])
	    {
	        Child s = new Child() ;
	        s.fun() ;
	    }
	};

Father中的this是个什么鬼?为什么第10行打印出来是Child,第11行调用的print方法却是Father中的。





加载中
0
Shazi199
Shazi199
因为child没有覆盖father的print,所以在father的方法中调用的print就是father的print,你把father的print改为可覆盖,调用的就是child的print了
悠树
悠树
回复 @Shazi199 : 谢谢,意思是懂了,但具体细节不清楚,有这方面的文章介绍下吗?
Shazi199
Shazi199
回复 @悠树 : 你new的就是child的对象,所以this就是child对象。打印出father是因为**你没有覆盖print方法**!!!
悠树
悠树
谢谢!
悠树
悠树
那为什么第10行打印出来的this是Child对象? 在Child中调用this.print()打印出来是“Child”,在Father中调用this.print()打印出来是“Father“,但不管是Child中的还是Father中的this,System.out.println(this) 出来的都是Child对象,Child中的this和Father中的this有什么不一样?
0
shijacky
shijacky
this 是当前对象,只要是通过子类构造器生成的对象的this肯定都是子类,至于调哪个方法,子类继承所有父类的非private方法(子类可以定义新的覆盖掉父类的)
0
丶Lion
丶Lion
this是指当前对象,main函数中定义的是child,打印的自然都是chi'l'd
丶Lion
丶Lion
回复 @悠树 : 子类父类中都叫print()引起误导了吧·····这是一道很好的面试题哈哈
丶Lion
丶Lion
回复 @悠树 : 这样是不是容易理解??????既然没有被child覆盖,为何father中叫print(),child也叫print(),father中完全可以叫printfather()啊·····
悠树
悠树
回复 @毛茸飞天小熊猫丶 : 既然第10行this是Child对象,那第11行this.print()不就应该是调用Child的print()吗?对于父类private方法处理细节我是不懂的,是不是那方面的知识?
丶Lion
丶Lion
回复 @悠树 : 打印的结果是 【this对象 child】【字符串 father】 father中private void print()私有方法,子类无法覆盖重写。child调用的fun调用的仍然是父类中的print打印的是father。父类把prrivate改为public。打印结果就是【child】了。
悠树
悠树
运行结果打印出来的是 Father。
0
月影南溪
月影南溪

首先:

this作为参数传递给方法的时候,this表示当前类对象(this所在类),而你的this是写在父类中的,所以child对象自动转型为父类对象。

this.print(),则表示该方法是调用当前对象的print()方法,也就是Child的print()(因为你在Child中重写了父类的print()方法)。

Shazi199
Shazi199
此例中根本没有重写,不要误人子弟
悠树
悠树
结果不是这样的。
0
丶Lion
丶Lion

引用来自“毛茸飞天小熊猫丶”的评论

this是指当前对象,main函数中定义的是child,打印的自然都是chi'l'd

这样是不是容易理解??????既然没有被child覆盖,为何father中叫print(),child也叫print(),father中完全可以叫printfather()啊·····


public class Father {
private void printfather()
    {   
        System.out.println("Father") ;
    }
    public void fun()
    {   
        System.out.println(this);
        this.printfather();
    }
}
悠树
悠树
理解,谢谢!
0
哈库纳
哈库纳

你程序调用的入口是  fun,它是father里面的。因此会执行 father 的 fun方法。

fun 方法中又调用了print。此时 JDK 在编译这个代码的时候用的是 Father 的 print,因为编译器在编译 Father 时候并不知道 Child。 所以在执行这个代码的时候很自然的就去寻找 father 里面的那个 print。 

哈库纳
哈库纳
回复 @悠树 : 调试跟代码,了解JVM运行原理,分析字节码。
悠树
悠树
谢谢,意思是懂了,但具体细节不清楚,有这方面的文章介绍下吗?
0
不死鸟哇
不死鸟哇
http://my.oschina.net/u/1274710/blog/477316  可以看看
返回顶部
顶部