回 帖 发 新 帖 刷新版面

主题:不能解决!!的难题

class Super{
    public int id=10;
     public void setId(int id){
           id=id; }

        public int getId(){
          return id; }

    public Super(){
        System.out.println(id);
        setId(5);
        System.out.println(getId());
    }}

class Sub extends Super{

    public int id=20;   

     public void setId(int id){

           id=id;}

public Sub(){

        System.out.println(id);

        setId(15);

        System.out.println(getId());

}}
public class Main{

    public static void main(String[] args){
        Super s=new Sub();
     }

}
我读程序之后的结果是:10,5,20,15;
可在计算机上运行的结果是:10,10,20,10;
谁能告诉我是怎么个情况啊?晕了好几天了
 

回复列表 (共8个回复)

沙发

建议LZ应该研究下继承与重写
首先两个“id=id”应该是“this.id=id”吧?
再者Super s = new Sub()因为建立的是Sub的实例对象,所以父类调用的setId应该是子类的吧?因为被重写了,无论如何父类的id都不可能改变,再说setId()方法,为什么要重写一遍呢,内容都一样子类直接拿来用不就得了

板凳

this.id=id这里的this是可以省略的。

3 楼

class Super{
    public int id=10;
     public void setId(int id){
           this.id=id; }

        public int getId(){
          return id; }

    public Super(){
        System.out.println(id);
        setId(5);
        System.out.println(getId());
    }}

class Sub extends Super{

    public int id=20;   

     //public void setId(int id){

         //  this.id=id;}

public Sub(){

        System.out.println(id);

        //setId(15);

        System.out.println(getId());

}}
public class Main{

    public static void main(String[] args){
    Sub s=new Sub();
     }

}
如果这样的话,结果为
10
5
20
5

4 楼

父类中的方法确实屏蔽了子类中的方法

5 楼

LZ加上this来引用实例变量就OK了

6 楼

你那个set()里面的方法里面{id=id;}并没有对实例变量赋值而是局部变量对局部变量的
赋值根本不会对实例变量变量造成影响,子类调用了超类的方法也没有改变超类中的实例变量赋值所以会显示这样的结果

7 楼

不懂,我的猜想跟楼主一样啊

8 楼

我把程序改写了一下.大家跑跑这个程序就明白了.

/**
 * <pre>
 * Copyright:        Copyright(C) 2008, javaxx.com
 * Class:            Sub
 * Date:            Jan 10, 2009 10:14:10 PM
 *
 * </pre>
 **/
package com.javaxx.exmple;

/**
 * @author wulliam
 * @since Jan 10, 2009 10:14:10 PM
 */




public class Main {
    
    class Super {
        public int id = 10;

        public void setId(int id) {
            id = id;
            out("Super setid " + id);
        }

        public int getId() {
            out("Super getId " + id);
            return id;
        }

        public Super() {
            out("Super1 " + id);
            setId(5);
            out("Super2 " + getId());
        }
    }

    class Sub extends Super {

        public int id = 20;

        public void setId(int id) {
            out("Sub setId " + id);
            id = id;
        }

        public Sub() {

            out("sub1 " + id);

            setId(15);

            out("sub2 " + getId());

        }
    }
    
    public Main() {
        Super s = new Sub();
    }
    
    public static void out(Object o) {
        System.out.println(o);
    }
    

    public static void main(String[] args) {
        Main main = new Main();
    }

}

我来回复

您尚未登录,请登录后再回复。点此登录或注册