各位能不能从本质上帮我讲解一下这段代码

Object1231 2012-10-15 05:40:03
以下程序中this实际上代表子类对象是吧?为什么调用print时还是调用了父类呢?请给出有力的说明谢谢了
class Base
{

private void print()
{
System.out.println("父类方法被调用");
}
public void show()
{
this.print();
System.out.println(this.getClass().getName());
}
}

class Sub extends Base
{
void print()
{
System.out.println("子类方法被调用");
}
}

public class InheritanceDemo
{
public static void main(String[] args)
{
Sub s =new Sub();
s.show();

}
}
...全文
507 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
一只大老虎丶 2012-10-23
  • 打赏
  • 举报
回复
JVM运行机制就这样,没道理讲
Object1231 2012-10-23
  • 打赏
  • 举报
回复
无语 了
Kanepan 2012-10-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

Base中的print()是private的,private方法是不可以override的,因此是调用Base的print()而不是Sub的print().
[/Quote]

+10086

顺便贴一下,调用子类print的代码

class Base {

protected void print() {
System.out.println("父类方法被调用");
}

public void show() {
this.print();
System.out.println(this.getClass().getName());
}
}

class Sub extends Base {
protected void print() {
System.out.println("子类方法被调用");
}
}

public class InheritanceDemo {
public static void main(String[] args) {
Sub s = new Sub();
s.show();

}
}

linxijun1992 2012-10-23
  • 打赏
  • 举报
回复
不懂不懂
K_Key 2012-10-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

Base中的print()是private的,private方法是不可以override的,因此是调用Base的print()而不是Sub的print().
[/Quote] 正解
naddy 2012-10-23
  • 打赏
  • 举报
回复
1楼正解
public_lcc 2012-10-23
  • 打赏
  • 举报
回复
你从哪看的说this指向子类对象?this明明是指向当前对象。。。
胸口碎大石_ 2012-10-20
  • 打赏
  • 举报
回复
Base

中的print方法为 private 只对它自己可见 Sub中看不到

public void show()为public 对所有类可见

class Sub extends Base sub继承Base 也就继承了show方法

void print()
{
System.out.println("子类方法被调用");
}

是定义了一个新方法 并不是重写Base中的 print方法

Sub s =new Sub();
s.show();

调用了show方法 show方法调用了Base中的print


print_er 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 的回复:]
this的作用域是当前类,所以this方法调用的是父类print()方法。
[/Quote]
不明真相 mark一下....
我也迷糊了 this不是调用此方法的对象吗
明明是sub类型执行的show方法 为什么指向了base父类?

按照你的解释 this应该永远指向base类
可是在LZ的例子里 如果把base类里面print方法的private去掉 执行的就是sub类的print方法
这怎么解释?
Object1231 2012-10-19
  • 打赏
  • 举报
回复
我关心的是this编译类型和运行时类型不一样
aimsgmiss 2012-10-19
  • 打赏
  • 举报
回复
迷惑中.
insistdream 2012-10-19
  • 打赏
  • 举报
回复
this的作用域是当前类,所以this方法调用的是父类print()方法。
Object1231 2012-10-19
  • 打赏
  • 举报
回复
这个过程中发生了向上转型?(this)
y11111494 2012-10-19
  • 打赏
  • 举报
回复
的大得多的顶顶顶顶顶顶顶顶顶顶
wantshixiangru168 2012-10-19
  • 打赏
  • 举报
回复
sub 类继承了base类 当你的子类不存在方法 就会去调用父类方法 
走到父类时调用show方法时先调用私有的print方法 因为是父类自己可以调自己的方法 而你输出类的时候this指的是你当前创建实例的这个类 就是sub类
ketonfly 2012-10-18
  • 打赏
  • 举报
回复
看完了 ,也运行了 ,可就是还是不懂!
幽饮烛 2012-10-18
  • 打赏
  • 举报
回复
因为父类的 print 方法是私有的,才会出现这样的情况,
LZ 可以把私有该成保护或者公有,执行一下就知道了。
zhaoyixuejava 2012-10-18
  • 打赏
  • 举报
回复
我也求高手解释........我现在不懂,很不懂,为什么代表子类的呢...求解释[Quote=引用 14 楼 的回复:]
子类调用父类方法的过程中有没有发生向上转型啊,this编译类型是父类,实际代表的是子类对象的引用。求高手解释一下啊?
[/Quote]
zhaoyixuejava 2012-10-18
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
不用纠结了,官方说了,子类不继承父类的私有属性,所以不用再讨论了。

Private Members in a Superclass
A subclass does not inherit the private members of its parent class. However, if the superclass has public or protected methods fo……
[/Quote]我感觉这样说不合适,subclass是继承了 Superclass所有的属性了,包括私有的,只是,只是,subclass 不能访问它而已,继承了是肯定的,不能访问也是肯定的.
java_xiao_ye 2012-10-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

引用 17 楼 的回复:

不用纠结了,官方说了,子类不继承父类的私有属性,所以不用再讨论了。

Private Members in a Superclass
A subclass does not inherit the private members of its parent class. However, if the superclass has public or pr……
[/Quote]
http://topic.csdn.net/u/20121018/18/6faab391-6e22-42ea-b591-910251dadb9d.html?63004
我刚写的 关于父类私有方法如何调用
加载更多回复(18)

62,621

社区成员

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

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