声明类型属于编译时行为,和运行时无关!
new的是什么类型就分配什么类型

解决方案 »

  1.   

    对象是在堆(heap)里建立的, 没有固定的大小. 只有简单类型有固定大小.
      

  2.   

    Parent obj; //定义引用,相当于c++的指针
    obj=new Child(); //实例化为子类的对象同意上面的:对象是在堆(heap)里建立的, 没有固定的大小. 只有简单类型有固定大小.
      

  3.   

    1。多态的实现,这样对象就是动态绑定的
    内存分配只于new XXX()有关,也就是说new什么对象就按什么对象来分配内存2。new XXX()分配内存,这时是在堆里面,如果有YYY y=x;这样的赋值语句,那么这时jvm会在栈为y分配一个句丙内存,赋值就指向了堆中的内存地址
    简单数据类型也分2种的:final static就是在堆中分配。其他都会在栈分配。简单数据类型都是拷贝赋值不存在引用的说法
      

  4.   

    谢谢大家的指点(刚刚开始学Java,很多地方不理解)
    其实我不是想解决什么问题,我在想Parent obj=new Child();为什么不直接用Child obj=new Child()
    ;呢?正如treeroot(旗鲁特)所说的:声明类型属于编译时行为,和运行时无关.
    搞不懂
      

  5.   

    如果有继承关系的2个类,用Parent obj=new Child();
    Parent obj//声明一个Parent类型的对象
    obj=new Child();//这句话是什么含义
    (一般是Parent obj=new Parent();)
    这样是不是为对象obj分配的是Child类型的对象所需要的内存空间大小而不是Parent类型的对象所 需要的内存空间大小
    ————————————————————————————————————————————
    不是,跟内存空间分配无关,只是方便动态邦定。可以执行时,动态选择执行子类的方法。
    对象分配的内存空间问题,建议看看thinking in java
      

  6.   

    编译时jvm还会优化,比如:
    你import java.util.ArrayList,事实上你的代码并没有用到ArrayList,jvm会忽略;再比如你声明了一个String s="12345678",然而你并没有利用变量s,jvm也会忽略,s也就没有内存空间。编译时和运行时是两码事。
      

  7.   

    Parent obj=new Child();
    关于这一句语句我要补充几句,以便大家都明白!动态绑定后,无论main函数在子类还是父类中,obj始终调用的是父类的方法或者变量!
      

  8.   

    可以理解为:对象obj只拥有父类的成员,而不拥有子类的吗?
      

  9.   

    to   asjj() 
        当你申明了一个String s="12345678" ,该字符串就会在constant pool里
     生成,无论你用不用它。
      

  10.   

    如果在jb下,你输入obj.的时候,jb为你显示的是parent而不是child的方法。
    为什么呢?自己想想,,,
      

  11.   

    to congbailing_914(奇迹玩家),谁说动态绑定一定始终调用父类的方法和实例字段了?
    class Parent
    {
     public void method1()
     {
      System.out.println("Parent's method1()");
     }
     public void method2()
     {
      System.out.println("Parent's method2()");
      method1();
     }
    }
    class Child extends Parent
    {
     public void method1()
     {
      System.out.println("Child's method1()");
     }
     public void method2()
     {
      System.out.println("Child's method2()");
      method1();
     }
     public static void main(String args[])
     {
      Parent obj=new Child();
      obj.method2();
     }
    }
    这个应该是典型的动态绑定的例子,你试试看运行的是父类的还是子类的。
      

  12.   

    angues1980(石头心)你有没有发现你的程序哪有点问题?
    你的子类的方法把父类的覆盖了!
    所以我上面的观点还是对的!
      

  13.   

    to angues1980(石头心):!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    你把你的子类中的那两个函数换成method3()和method4()。这样可以避免覆盖的问题!
    而且对于问题的解决也可以提供一个公平的环境!
    程序修改如下:
    class Child extends Parent
    {
     public void method3()
     {
      System.out.println("Child's method3()");
     }
     public void method4()
     {
      System.out.println("Child's method4()");
      method4();
     }
     public static void main(String args[])
     {
      Parent obj=new Child();
      //obj.method2();
     }
    }
    至于程序中我用注释的那个语句//obj.method2();你可以不管!
    那你试试用obj. 你看看obj.旁边提示的列表中有没有method3()和method4()。
    然后你再把main函数放到父类,你再看看obj.旁边提示的列表中有没有method3()和method4()。
      

  14.   

    大家可以拿程序试试,看看到底运行结果怎么样????
    对于 angues1980(石头心) 写的那个程序,表面上看确实是一个典型的动态绑定,但是在他的子类中写的那两个方法正好覆盖了父类的方法,所以即使程序和我说的那样是调用的父类的方法的话,由于 被子类覆盖,所以输出结果也就是子类方法中输出的那两句,很容易让读者误会!
      

  15.   

    to congbailing_914(奇迹玩家),
    对于你的说法,请允许我先汗一下 -_-||
    一、运行时自动选择正确的方法进行调用的现象被称为“动态绑定”(dynamic binding)。
    说白了,动态绑定就是编译器在运行时自动选择obj所指向的对象的实际类型相匹配的方法。
    二、即使像你说的没有覆盖父类的method1()和method2()方法,而是新写了method3()和method4()方法,其实在调用obj.method2()的时候,调用的还是子类从父类方法继承过来的子类自己的method2()方法,不过既然是完全继承过来,当然输出也会使Parent's method2,根本看不出来啊。所以你写的那个例子有意义么?
    三、关于obj点出来哪个方法那是跟你所用的IDE也就是开发环境来决定的,它只会根据对象声明的类型来选择方法,但是对于多态就没办法正确显示了。而动态绑定是编译器在程序运行时,跟你的开发环境是没关系的。
    四、不要总说“让读者误会”这类的话,好像你很有权威,真正让人误会的恐怕是你。
      

  16.   

    其实一开始treeroot(旗鲁特)和jFresH_MaN(The answer is ......) 就已经说得很明白了声明类型属于编译时行为,和运行时无关!
    new的是什么类型就分配什么类型1。多态的实现,这样对象就是动态绑定的
    内存分配只于new XXX()有关,也就是说new什么对象就按什么对象来分配内存2。new XXX()分配内存,这时是在堆里面,如果有YYY y=x;这样的赋值语句,那么这时jvm会在栈为y分配一个句丙内存,赋值就指向了堆中的内存地址
    简单数据类型也分2种的:final static就是在堆中分配。其他都会在栈分配。简单数据类型都是拷贝赋值不存在引用的说法
      

  17.   

    JAVA编程思想里有吧,我看过的。
    实现多态的一种方法。
    Parent obj=new Child();意思是创建Child的对象,引用交给Parent,实现向上转型(upcasting)呵呵,好久没看JAVA了。。