java新人关于继承关系中方法调用的问题

拥抱下分钟 2017-09-28 07:52:31
class Person {
private void print(){
System.out.println("Person-->void print(){});
}
public void fun(){
this.print();
}
}
class Student extends Person{
void print(){
System.out.println("Student-->void print(){}));
}
}
public class OverrideDemo {
public static void main(String[] args){
new student().fun();
}
}
此处执行结果是Person-->void print(){}
我知道这里没有进行方法的重写,子类中重新定义了一个print()方法。但是在调用父类fun()方法后,为什么不是调用子类中的print()方法而是调用父类的print()方法
...全文
460 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
拥抱下分钟 2017-09-29
  • 打赏
  • 举报
回复
引用 15 楼 miaoch 的回复:
[quote=引用 14 楼 javatzl 的回复:] [quote=引用 12 楼 miaoch 的回复:] [quote=引用 11 楼 miaoch 的回复:] 关于this指代哪个对象我还真的不是特别清楚呢。 我只知道某个对象调用某个方法,会隐式地传入一个this指针,指代当前这个对象。 但是此处你已经进入了父类的方法里,讲道理我们不管this是什么,那肯定也只能是当前类的一个对象。 所以我觉得此处你可以假象子类对象已经被向上转型了(另外一种假象就是子类对象中存在父类对象,此处用到了父类对象) 无论如何,此时this指代的对象的类型肯定是父类的,加上没有涉及多态,所以就是调用父类的私有方法。 中间关于this的猜想纯属猜想,如果有误,请指正
个人觉得假想子类对象已经被向上转型了比较说得通,这样如果涉及多态也能正确调用子类的方法[/quote] 我也有考虑向上转型。。。 那如果把父类和子类的print()的权限全改为public ,那么父类方法被子类重写,在执行过程中,当调用fun()方法时,就采用动态绑定,然后执行子类的方法 这样想对吗[/quote] 这个是肯定的,多态本身就是这样[/quote] 好的,谢谢
miaoch 2017-09-29
  • 打赏
  • 举报
回复
引用 14 楼 javatzl 的回复:
[quote=引用 12 楼 miaoch 的回复:] [quote=引用 11 楼 miaoch 的回复:] 关于this指代哪个对象我还真的不是特别清楚呢。 我只知道某个对象调用某个方法,会隐式地传入一个this指针,指代当前这个对象。 但是此处你已经进入了父类的方法里,讲道理我们不管this是什么,那肯定也只能是当前类的一个对象。 所以我觉得此处你可以假象子类对象已经被向上转型了(另外一种假象就是子类对象中存在父类对象,此处用到了父类对象) 无论如何,此时this指代的对象的类型肯定是父类的,加上没有涉及多态,所以就是调用父类的私有方法。 中间关于this的猜想纯属猜想,如果有误,请指正
个人觉得假想子类对象已经被向上转型了比较说得通,这样如果涉及多态也能正确调用子类的方法[/quote] 我也有考虑向上转型。。。 那如果把父类和子类的print()的权限全改为public ,那么父类方法被子类重写,在执行过程中,当调用fun()方法时,就采用动态绑定,然后执行子类的方法 这样想对吗[/quote] 这个是肯定的,多态本身就是这样
拥抱下分钟 2017-09-29
  • 打赏
  • 举报
回复
引用 12 楼 miaoch 的回复:
[quote=引用 11 楼 miaoch 的回复:] 关于this指代哪个对象我还真的不是特别清楚呢。 我只知道某个对象调用某个方法,会隐式地传入一个this指针,指代当前这个对象。 但是此处你已经进入了父类的方法里,讲道理我们不管this是什么,那肯定也只能是当前类的一个对象。 所以我觉得此处你可以假象子类对象已经被向上转型了(另外一种假象就是子类对象中存在父类对象,此处用到了父类对象) 无论如何,此时this指代的对象的类型肯定是父类的,加上没有涉及多态,所以就是调用父类的私有方法。 中间关于this的猜想纯属猜想,如果有误,请指正
个人觉得假想子类对象已经被向上转型了比较说得通,这样如果涉及多态也能正确调用子类的方法[/quote] 我也有考虑向上转型。。。 那如果把父类和子类的print()的权限全改为public ,那么父类方法被子类重写,在执行过程中,当调用fun()方法时,就采用动态绑定,然后执行子类的方法 这样想对吗
拥抱下分钟 2017-09-29
  • 打赏
  • 举报
回复
引用 10 楼 Demon_168 的回复:
另外你的代码里也不存在多态性。满足多态性的三个条件: 1.继承 2.方法重写 3.父类引用指向子类对象 你的代码里面既没有方法重写,也没有父类引用。 你可以尝试一下把代码改成多态性再去验证一下自己的想法
如果把父类和子类的print()的权限全改为public ,那么父类方法被子类重写,在执行过程中,当调用fun()方法时,就采用动态绑定,然后执行子类的方法 这样想对不对啊
miaoch 2017-09-29
  • 打赏
  • 举报
回复
引用 11 楼 miaoch 的回复:
关于this指代哪个对象我还真的不是特别清楚呢。 我只知道某个对象调用某个方法,会隐式地传入一个this指针,指代当前这个对象。 但是此处你已经进入了父类的方法里,讲道理我们不管this是什么,那肯定也只能是当前类的一个对象。 所以我觉得此处你可以假象子类对象已经被向上转型了(另外一种假象就是子类对象中存在父类对象,此处用到了父类对象) 无论如何,此时this指代的对象的类型肯定是父类的,加上没有涉及多态,所以就是调用父类的私有方法。 中间关于this的猜想纯属猜想,如果有误,请指正
个人觉得假想子类对象已经被向上转型了比较说得通,这样如果涉及多态也能正确调用子类的方法
miaoch 2017-09-29
  • 打赏
  • 举报
回复
关于this指代哪个对象我还真的不是特别清楚呢。 我只知道某个对象调用某个方法,会隐式地传入一个this指针,指代当前这个对象。 但是此处你已经进入了父类的方法里,讲道理我们不管this是什么,那肯定也只能是当前类的一个对象。 所以我觉得此处你可以假象子类对象已经被向上转型了(另外一种假象就是子类对象中存在父类对象,此处用到了父类对象) 无论如何,此时this指代的对象的类型肯定是父类的,加上没有涉及多态,所以就是调用父类的私有方法。 中间关于this的猜想纯属猜想,如果有误,请指正
Demon_168 2017-09-29
  • 打赏
  • 举报
回复
另外你的代码里也不存在多态性。满足多态性的三个条件:
1.继承
2.方法重写
3.父类引用指向子类对象

你的代码里面既没有方法重写,也没有父类引用。

你可以尝试一下把代码改成多态性再去验证一下自己的想法
拥抱下分钟 2017-09-29
  • 打赏
  • 举报
回复
引用 8 楼 miaoch 的回复:
所以你要是这么写代码的话,意思就是调用当前类的一个私有方法,也不涉及多态。就是单纯的去调用那个private方法而已
所以意思是调用fun()的时候,this指代父类对象吗
miaoch 2017-09-29
  • 打赏
  • 举报
回复
所以你要是这么写代码的话,意思就是调用当前类的一个私有方法,也不涉及多态。就是单纯的去调用那个private方法而已
miaoch 2017-09-29
  • 打赏
  • 举报
回复
引用 4 楼 javatzl 的回复:
[quote=引用 3 楼 miaoch 的回复:] private void print() 父类的方法是private的 这种方法是不能被重写的。。。 所以你既没有重写fun 也没有重写print
那为什么fun()中调用print()不是调用子类中新定义的print()而是父类中的print()啊[/quote] 举个不恰当的例子, 你现在认为这个对象是父类,且你不知道子类有print()方法。那你还会去子类里找这个方法然后去调用吗
Demon_168 2017-09-29
  • 打赏
  • 举报
回复
this关键字的含义,this代表当前类的对象引用,而你在用this.print()方法时首先会去父类查看你的print方法。存在多态的情况下时,如果父类的方法在子类没有被重写调用的是父类里的方法,如果有重写就调用子类中的方法。
dangyb 2017-09-29
  • 打赏
  • 举报
回复
我的想法跟一楼一样,但是一楼被扔了2板砖,有点不敢说了。 另外,同小白。。
拥抱下分钟 2017-09-29
  • 打赏
  • 举报
回复
引用 3 楼 miaoch 的回复:
private void print() 父类的方法是private的 这种方法是不能被重写的。。。 所以你既没有重写fun 也没有重写print
那为什么fun()中调用print()不是调用子类中新定义的print()而是父类中的print()啊
miaoch 2017-09-29
  • 打赏
  • 举报
回复
private void print() 父类的方法是private的 这种方法是不能被重写的。。。 所以你既没有重写fun 也没有重写print
拥抱下分钟 2017-09-29
  • 打赏
  • 举报
回复
this指代当前对象不是new Student吗
miaoch 2017-09-29
  • 打赏
  • 举报
回复
public class Test {
	public static void main(String[] args) {
		new Student().fun();
	}
}
class Person {
	private void print(){
		System.out.println("Person-->void print(){}");
	}
	public void fun(){
		System.out.println(this.getClass().getSimpleName());//Student 可见对象还是子类对象
		//所以我觉得把这个认为是this当成是: (Person) new Student() 比较合理
		this.print();
	}
}
class Student extends Person{
	void print(){
		System.out.println("Student-->void print(){})");
	}
}
刚刚想到又做了个测试,应该是这样子的
TY_495478072 2017-09-28
  • 打赏
  • 举报
回复
this首先在当前类找,找到了就执行。

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧