请教Java继承的问题!!

secondflying 2005-12-03 11:29:29
代码如下:
class Base1 {
public int mm = 2;
public void pri(){
System.out.print(mm);
}
}

class Sub1 extends Base1{
public int mm = 5;
public void pri(){
System.out.print(mm);
}
}

class test {
public static void main(String[] args){
Base1 app1 = new Sub1();
app1.pri();//为什么这里调用的是子类得pri方法而下面这句中输出的是父类的属性值??!
System.out.print(app1.mm);
}
}

难道子类能改写父类中同名的方法不能改写父类中同名的属性值???!请大家指教,谢谢!
...全文
187 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
faen 2005-12-03
对,动态绑定指得是方法,不使用于属性。
回复
crazycy 2005-12-03
多态是对方法来的;
Base1 app1 = new Sub1();把Sub1的对象上升到Base1,
调用变量时就是调用这个对象实例的变量;
调用方法时,是调用这个对象实例的方法;这里有个特殊性,就是调用生成的对象的方法;这个地方是多态的体现;
总之,多态是体现在方法上而不是变量上
回复
zsjin0208 2005-12-03
app1是父类类型的,app1.mm应该是父类类型的mm,也就是2了。app1.pri()是动态绑定,执行的是子类的pri().
回复
bryantd 2005-12-03
我来回答你的问题,我开始学习java的时候,也在这方面的问题上胡涂过,赫赫。
你的例子是明显的超类引用指向子类对象,这是一种常用的“多态”机制,主要是为了用超类的应用管理子类的对象方便,估计你是个新手,如果以后学习到接口的时候,你就会越来越明白为什么要这么做了。当用这种多态机制的时候,往往还要伴随着子类重写夫类的同名方法(包括实例方法和静态方法),也许还会有同名的变量(包括实例变量和静态变量)。下面这个例子就会让你彻底明白这一系列的问题到底是怎么回事:
//: ConversionTest.java

//package g3ds.joop.ch4;

class Super{
static String str1="超类的静态变量";
String str2="超类的实例变量";

static void showStatic(){
System.out.println("超类的静态方法");
}

void showNonStatic(){
System.out.println("超类的实例方法");
}
}

class This extends Super{
//定义与超类重名的静态变量
static String str1="子类的静态变量";

//定义与超类重名的实例变量
String str2="子类的实例变量";

//当改写超类的静态方法时,在当前类中也必须设计为静态的,否则报错!
static void showStatic(){
System.out.println("子类的静态方法");
}

//改写超类的实例方法
void showNonStatic(){
System.out.println("子类的实例方法");
}

//添加子类特有的成员变量,可以是静态的或者非静态的
static String str3="子类特有成员变量";

//添加子类特有的成员方法,可以是静态的或者非静态的
void showDetail(){
System.out.println("子类特有的成员方法");
}
}

public class ConversionTest{
public static void main(String arg[]){
//测试:以超类声明以子类实例化,存在转型
Super obj=new This();

//对静态和非静态成员的多态机制测试
System.out.println(obj.str1);
System.out.println(obj.str2);
obj.showStatic();
obj.showNonStatic();

}
}

执行的结果如下:
超类的静态变量
超类的实例变量
超类的静态方法
子类的实例方法

这下楼主应该明白了吧???
总结以下几点:
1、对于实例变量和静态变量,多态机制反应的是“超类的属性”。
2、对于静态方法,多态机制反映的是“超类的属性”。
3、对于实例方法,多态机制反应的是“子类的属性”。
当然我不知道你学习了“包”机制没有,在不同的包中,子类和超类里的同名方法并不一定是“覆盖”关系了,这点要你在以后的学习中特别要注意!

不知道我的回答你满意吗?

回复
bmw219 2005-12-03
当app1调用方法时,是本实例的方法,也就是Sub1的方法
回复
发动态
发帖子
Java SE
创建于2007-09-28

6.1w+

社区成员

Java 2 Standard Edition
申请成为版主
社区公告
暂无公告