父类:public class People
{
int index = 1;
}
子类:public class Man extends People
{
int index = 2;
}
测试类:public class Start
{
public static void main(String[] args)
{
People p = new Man();

System.out.println(p.index);
}
}打印出来的为什么是父类的值啦?请问java内存是怎么分配的他们的。请详细解说。

解决方案 »

  1.   

    第一个代码是是Java的,应该都看得懂吧,点快了,呵呵
      

  2.   

    和overriding道理一样
    void foo(Object x) {
      System.out.println("Object");
    }void foo(String x) {
      System.out.println("Object");
    }Object x = "abc";
    foo(x); // 这个在编译的时候,找的是第一个方法,虽然实际上它是一个String
    道理和你那个一样
      

  3.   

    p是people类型的,可以new man只不过是因为man继承people,他们是同一类型
      

  4.   


     People p = new Man();你可以理解为向上转型。People是父类,Man是子类,Java中子类可以向父类转型。所以p实质上的类型是People 你打印i,当然是打印的People中定义的啊。
      

  5.   

    因为有两个index
    一个是Person.index, 一个是Man.indexPeople p = new Man();
    System.out.println(p.index);
    System.out.println(((Man)p).index);你这样运行一下就看得很清楚了,两个index同时存在,以什么类型访问就得到该类型的index
      

  6.   

    同意楼上~~ 
    p 在声明时虽然被new成了Man类型,但是其引用的声明还是People类型,或者说只能看的到People属性的内容,看不到Man属性相关的内容,此时如果People中如果没有index变量的话(例如修改成int indexOther = 1;),在main方法中使用p.index编译器还会报错,需要强制转换成Man类型才可以使用。这么说你更明白些了吧!
      

  7.   

    多态有三个条件:继承、方法的重写、父类引用指向子类的对象;
    楼主的代码中没有体现“方法的重写”这一条件。
    如果把上面的代码改成如下内容:People类public class People {
    public void printInf() {   
            System.out.println("I'm People");   
        }  
    }
    Man类
    public class Man extends People {
    public void printInf() {   
            System.out.println("I'm man");   
        }  
    }
    测试:public class TestManPeople {
    public static void main(String[] args) {
    People p = new Man();     
    p.printInf();
    }
    }这次输出的结果就是“I'm man”啦!
      

  8.   

    试一下
    class People
    {
        int index = 1;
        
        
        void display(){System.out.println(index);};
    }
     class Man extends People
    {
        int index = 2;
      //  void display(){System.out.println(index);};
    }
    public class Test{
    public static void main(String [] args){
    People p=new Man();
    p.display();

    }
    }结果是1
    package MERAN;
    class People
    {
        int index = 1;
        
        
        void display(){System.out.println(index);};
    }
     class Man extends People
    {
        int index = 2;
        void display(){System.out.println(index);};
    }
    public class Test{
    public static void main(String [] args){
    People p=new Man();
    p.display();

    }
    }结果是2  明白了吧?
      

  9.   

    System.out.println(new String("123"));
    System.out.println(new Integer("23"));
    System.out.println(new Char('c');懂了 System.out.println(“hello world");
    就弄懂了OOP
      

  10.   

    怎么这么多人迷糊,难道现在的java教材太滥了,连属性没有多态也不说明一下
    属性没有多态,只有方法有多态,即属性是静态绑定,方法是动态绑定
    当编译成字节码时
    People p = new Man(); //编译器只知道p是什么类型,不知道p具体指向什么对象,只有运行期才知道
    System.out.println(p.index); //所以这里编译就把p.index直接编译为固定的People类的getFiled指令,这就是所谓的静态绑定,字节码编译时就已经被写死了属性的(相对)地址。
    而方法编译的时候,会编译为一个invoke_virtual指令,真正运行的时候,才会从virtual-table里查找方法的地址,然后才执行,这就是所谓的动态绑定,编译时并没有直接写死方法的调用地址
      

  11.   


    多态三要素,  类继承, 子类重写父类方法,持有子类对象的父类型引用  。  你这个是属性 木有多态,
    至于你想知道具体怎么回事。  jvm 中有个方法表 ,在 解析阶段会将方法引用指向方发表。 具体解析过程你去我博客看