今日写了一个程序,发现了一些问题:代码如下。public class 复习1 { public static void main(String[] args) { son s=new son();
System.out.println(s.b);
System.out.println(s.s);
s.print();
}
}class father{
public String s="mqslll";


public int b=1;

public void print(){
System.out.println(s);
}
}class son extends father{
public String s="lllmqs";
}当运行这个方法的时候,为什么输出的是父类的域呢??
s.print();

解决方案 »

  1.   


    子类的print()方法是继承到父类的,所以调用也是调用的父类
    public void print(){
    System.out.println(s);   // 相当于this.s,即父类的"mqslll"
    }
      

  2.   

    LZ是不是认为会输出son中定义的那个S?
    那个是属性不会出现多态的。多态可能要在去看看。
      

  3.   

    要想达到效果,需覆盖父类的print方法
      

  4.   

    System.out.println(s.b);
    子类木有的的属性,从父类找,一直到Object,没有则为NULL
    System.out.println(s.s);
    这个子类有,就先访问自己的了,没有一直往上找
    s.print();
    没有重写这个方法,则访问父类的,父类里面是打印自己的属性,父类是不能访问到子类的属性的
      

  5.   

    public class Test { /**
     * @param args
     * @throws SQLException 
     */
    public static void main(String[] args) throws SQLException {
    Son son = new Son();
    System.out.println(son.s);
    } }
    class Father {
    public String s = "father";
    void print(){
    System.out.println(s);
    }
    }class Son extends Father {

    }
    输出结果为:father
    为什么会输出father,这难道不是属性继承吗?
      

  6.   

    (1)子类继承父类属性和方法  private修饰的不继承
    (2)实例化子类,会递归分配所有父类的空间
    (3)属性是静态绑定的,是绑定到类的。
          
      

  7.   

    你这个print()方法就是用的父类的,当然s也是父类的;如果想要子类的s,可以重写一个
    class son extends father {
    public String s = "lllmqs";

    @Override
    public void print(){
    System.out.println(s);
    }
    }
      

  8.   

    所谓王八的PP——规定。类的继承并不是将父类的属性复制到子类,而是在子类中存在一个父类对象(虽然实际实现略有不同,但这样理解是最贴切的)。在父类的方法中调用this取到的不是子类实例,而是子类实例中包含的父类实例,因此通过this是取不到子类实例中的属性和方法的。PS:虽然并不是完全不可能从父类取到子类的方法,但实现方法很曲折且不是OOP思想想要教大家的东西。
      

  9.   

    所以结果是
    1 lllmqs mqslll