重写的问题 神人快来啊

猫儿爷爷 2010-03-17 09:41:57
class A
{
int ivar = 7 ;

void m1 ()
{
System.out.println("A`s m1 , ");
}
void m2 ()
{
System.out.println("A`s m2 , ");
}
void m3 ()
{
System.out.println("A`s m3 , ");
}
}

class B extends A
{
void m1 ()
{
System.out.println("B`s m1 , ");
}
}

class C extends B
{
void m3 ()
{
System.out.println("C`s m3 , " + ( ivar + 6 ));
}
}

public class Mixed2
{
public static void main ( String [] args )
{
A a = new A();
B b = new B();
C c = new C();
A a2 = new C(); //他具体是怎样一个意思呢啊。。。。。麻烦详细的说明啊。。

a2.m1(); //引用的是哪个方法呢
a2.m2();//引用的是哪个方法呢
a2.m3();//引用的是哪个方法呢


}
}

结果

B`s m1 ,
A`s m2 ,
C`s m3 , 13


为什么输出这个结果呢 。。。。。。
...全文
165 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
gzsky133 2010-03-18
  • 打赏
  • 举报
回复
楼主上面的N多问号好像是不赞同这是多态,方法的重写也应该属于多态的一种吧,new C()可以赋给A a2,同样new b()也可以赋给A a2,传递不同子类对像给父类的引用来调用所对应的重载方法!难道这不是多态吗?
Sylar0126 2010-03-17
  • 打赏
  • 举报
回复
这个我感觉可以从2个方向想,第一个按就近原则,A a2=new C() 定义C类的对象。先会调用C()内部的方法,当没有才会调用C继承的方法,依次向上。第二种就是从上到下一次推方法,有同名方法,就用内部方法覆盖继承的方法!最后就会得到C()的所有方法。
keeya0416 2010-03-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 c5153000 的回复:]
那是不是 c继承B 然后C也继承了b b继承a 的方法 或则c也从写了b b从写了a 的某些方法 然后程序会从
A a2 = new C(); 父类指向c子类 然后从指向的这个空间开始执行程序??
[/Quote]
对的 就是这个意思
keeya0416 2010-03-17
  • 打赏
  • 举报
回复
对象的方法的创建是放在堆里的,而对象里的属性(如一些基本数据类型的变量)都是加载到栈里的。
记住一点就可以了
栈里的东西是根据引用类型来决定用哪个的
而堆里的东西是决定于谁NEW出来的就用谁的
不过通常来说是没有人会在父子类中定义相同的变量名的。
猫儿爷爷 2010-03-17
  • 打赏
  • 举报
回复
那是不是 c继承B 然后C也继承了b b继承a 的方法 或则c也从写了b b从写了a 的某些方法 然后程序会从
A a2 = new C(); 父类指向c子类 然后从指向的这个空间开始执行程序??
keeya0416 2010-03-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 c5153000 的回复:]
a2.m1(); //引用的是哪个方法呢
a2.m2();//引用的是哪个方法呢
a2.m3();//引用的是哪个方法呢
[/Quote]
为了便于理解,你可以把C 里边的方法都写出来,C 没有覆盖的方法就是直接用的父类的方法。
a2.m1(); //引用的是哪个方法呢 //这里调用的都是 C 的方法,只是有的a2.m2();//引用的是哪个方法呢 //是从父类那继承过来的,有的自己又把
a2.m3();//引用的是哪个方法呢 //父类的方法给覆盖了
wzju64676266 2010-03-17
  • 打赏
  • 举报
回复
A a = new A();
B b = new B();
C c = new C();
A a2 = new C(); //他具体是怎样一个意思呢啊。。。。。麻烦详细的说明啊。。

a2.m1(); //引用的是哪个方法呢
a2.m2();//引用的是哪个方法呢
a2.m3();//引用的是哪个方法呢


a2.m1();a2.m2();a2.m3();//调用的都是C类的方法,实例方法是动态绑定的,也就是看谁分配的内存空间,这里是c分配 的空间
keeya0416 2010-03-17
  • 打赏
  • 举报
回复
JAVA里对象的方法是动态绑定的,也就是说方法的调用都是用的对象创建的那个类型的方法,与引用的类型没有任何关系;A a2 = new C(); 这也是为了实行多态的一种形式。
假设 A{ i ; a_m(){} } ,B extends A { i ; a_m(){} } // i 为基本数据类型。
那么 A a = new B(); a.i 就是指向的 A 中的 i ,想要指向 B 中的 i 就得((B)a).i;
而方法就不用了,不管是什么引用类型(当然是父类或自己的了),方法的调用都是取决于是哪个类型的对象。Thinking in Java 里关于方法的绑定过程讲的比较详细,建议看看
猫儿爷爷 2010-03-17
  • 打赏
  • 举报
回复
是不是可以这样理解 这个方法 是从main开始执行 从子类找离这个main最近的方法 然后子类没有就在父类里找呢?
yy_dan 2010-03-17
  • 打赏
  • 举报
回复
A a2 = new C(); //简单来说就是一个向下转型问题,创建的是A的对象,但是new C()这么一下,就转型成C的对象了

a2.m1(); //引用的是B类中的m1方法
a2.m2();//引用的是A类中的m2方法
a2.m3();//引用的是C类中的m3方法

你要明白一点:继承是不可以多个继承的,但是可以多重继承;接口可以多个实现
yinongstudio 2010-03-17
  • 打赏
  • 举报
回复
引用型的变量里存的值是他指向的对象的地址。
通过该变量调用的方法是他指向的对象的所属类的方法。

这个和c++有些区别,或则说java里的函数都是 virtual 的。
猫儿爷爷 2010-03-17
  • 打赏
  • 举报
回复
a2.m1(); //引用的是哪个方法呢
a2.m2();//引用的是哪个方法呢
a2.m3();//引用的是哪个方法呢
那这几个有都引用的那个方法呢?? 高人 本人小白菜 给我详细说明好嘛?
soulx 2010-03-17
  • 打赏
  • 举报
回复
基本的JAVA继承机制,LZ看下JAVA基础的书,基本都会讲到。
jimyx123 2010-03-17
  • 打赏
  • 举报
回复
A a2 = new C(); //他具体是怎样一个意思呢啊。。。。。麻烦详细的说明啊。。
创建一个A类型的引用 指点向一个C类型的对象
猫儿爷爷 2010-03-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lliiqiang 的回复:]
方法覆盖而已
[/Quote]
能不能给我详细的说下 我上面注释的那些呢 那些我不是很明白啊
lliiqiang 2010-03-17
  • 打赏
  • 举报
回复
方法覆盖而已
猫儿爷爷 2010-03-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 c5153000 的回复:]
那是不是 c继承B 然后C也继承了b b继承a 的方法 或则c也从写了b b从写了a 的某些方法 然后程序会从
A a2 = new C(); 父类指向c子类 然后从指向的这个空间开始执行程序??
[/Quote]
难道我的这个意思也是多态?多态是我的这个意思???????? 这就是多态???????
lyh200731 2010-03-17
  • 打赏
  • 举报
回复
多态的问题 A a2 = new C() 这是多态典型的特点 父类引用指向子类对象
gzsky133 2010-03-17
  • 打赏
  • 举报
回复
这是多态吧,A a2 = new C();a2指向C对象中所包含的A对象的部分。

62,614

社区成员

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

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