7
回答
(JAVA)关于this的一个细节问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
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中的。





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

首先:

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

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

--- 共有 2 条评论 ---
Shazi199此例中根本没有重写,不要误人子弟 2年前 回复
悠树结果不是这样的。 2年前 回复

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

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();
    }
}
--- 共有 1 条评论 ---
悠树理解,谢谢! 2年前 回复

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

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

--- 共有 2 条评论 ---
哈库纳回复 @悠树 : 调试跟代码,了解JVM运行原理,分析字节码。 2年前 回复
悠树谢谢,意思是懂了,但具体细节不清楚,有这方面的文章介绍下吗? 2年前 回复
顶部