子类和父类的转化

数据娃掘 2006-06-26 11:20:06
class test_super_sub{
public static void main(String[] args) {

B b=new B();
System.out.println("1."+b.i);
System.out.println("2."+b.j);

A a=new B();
System.out.println("3."+a.i);
System.out.println("4."+a.j);

a.m1();
a.m2();

System.out.println("5."+a.i);
System.out.println("6."+a.j);
}
}
class A{
int i=1;
static int j=3;

void m1(){
System.out.println("A.m1()");
i=5;
}
static void m2(){
System.out.println("A.m2()");
j=7;
}
}
class B extends A{
int i=2;
static int j=4;


void m1(){
System.out.println("B.m1()");
i=6;
}
static void m2(){
System.out.println("B.m2()");
j=8;
}
}

----------
输出的是:
1.2
2.4
3.1
4.3
B.m1()
A.m2()
5.1
6.7
-----------------------------------------------

为什么会输出
B.m1()
A.m2()
5.1
呢?

a.m1();到底执行的是哪个方法?

谢谢各位!


...全文
339 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
数据娃掘 2006-07-07
  • 打赏
  • 举报
回复
我没看见警告
kevinliuu 2006-06-26
  • 打赏
  • 举报
回复
sorry, 才仔细看了一遍代码

刚才说的那个有问题m2在A和B中都是类方法

对于 Father f = new Son() 形式的创建对象,f是父类句柄指向子类对象

编译时,f是作为父类对象,而运行时f是子类对象

但是对于成员变量及类方法,一定是调用的父类的(编译和执行)


你可以尝试将父类的m2方法注释掉,这时编译器会告诉你找不到m2方法

因此a.j是执行调用父类的成员j
数据娃掘 2006-06-26
  • 打赏
  • 举报
回复
那么a.i呢,也是执行子类的属性吗?

不是a.j,我打错了.
数据娃掘 2006-06-26
  • 打赏
  • 举报
回复
" A a=new B(); 父类句柄指向子类对象
a.m1()执行子类方法 "

那么a.j呢,也是执行子类的属性吗?
mvmouse 2006-06-26
  • 打赏
  • 举报
回复
a.m1()执行的是子类的方法,因为子类的方法覆盖(overwrite)了父类的方法
kevinliuu 2006-06-26
  • 打赏
  • 举报
回复
A a=new B(); 父类句柄指向子类对象
a.m1()执行子类方法
a.m2()执行父类方法 ; //因为子类的m2是类方法,而不是对象方法
success_dream 2006-06-26
  • 打赏
  • 举报
回复
这三行都是警告!
System.out.println("2."+b.j);
System.out.println("4."+a.j);
System.out.println("6."+a.j);
改为
System.out.println("2."+B.j);
System.out.println("4."+A.j);
System.out.println("6."+A.j);
就没警告符号了!而且运行结果是一样的!楼主发现没啊??
数据娃掘 2006-06-26
  • 打赏
  • 举报
回复
A类中的j 和 B类中的j没有任何联系,成员变量(无论static or non-static)不会被override.

终于彻底明白了
wts173 2006-06-26
  • 打赏
  • 举报
回复
所以
a.m1();//执行的子类的m1
a.m2();//执行的父类的m2
wts173 2006-06-26
  • 打赏
  • 举报
回复
子类的方法override(覆盖)了父类的方法
但是父类的static方法无法被覆盖
Tiwen 2006-06-26
  • 打赏
  • 举报
回复
创建一个新的子类对象的话,首先要明白这个创建的空间里。有它超类的方法和属性,拿一个子类本身的引用变量去指向这块空间的话他会指向这子类那部分,反之。当超类的引用变量指向这块空间时它指向的是超类这部分。看看引用变量指向的哪部分就应该会明白这题

62,614

社区成员

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

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