A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


  1. public class ExtendsTest {

  2.         public static void main(String[] args)
  3.         {
  4.                 Animal animal = new Dog();
  5.                 //这里 animal  不能 访问Dog里面的属性和方法
  6.                 //我想知道是 在 new Dog() 的时候, 底层是怎么运行的,
  7.                 //Dog()的属性是没有分配内存空间,还是分配了不允许调用!!
  8.                
  9.                 Dog dog = (Dog) animal;
  10.                 //如果没有分配内存空间,为何将animal 强转后可以访问到 dog 的属性,并且已经赋值了;
  11.                 //难道 强转是 重新new的一个对象?????
  12.                 //如果把Dog修改成单例模式,animal 和 dog 在内存中 应该就是一个对象吧!
  13.                 //
  14.                 //说了这么多,大家应该明白我疑惑的地方了吧~ ~~  秋香姐!!!!
  15.                 //
  16.                 System.out.println(dog.arg1);
  17.                
  18. //                Animal animal = Dog.getDog();
  19. //                Dog dog = (Dog) animal;
  20. //                System.out.println(animal==dog);
  21. //                System.out.println(dog.arg1);
  22.         }
  23.        
  24. }


  25. class Animal{

  26. }

  27. class Dog extends Animal{
  28.         String arg1="arg1";
  29.         String arg2="arg2";
  30. //        private static Dog dog = new Dog();
  31. //        private  Dog()
  32. //        {
  33. //               
  34. //        }
  35. //       
  36. //        public static Dog getDog()
  37. //        {
  38. //                return dog;
  39. //               
  40. //        }
  41.        
  42. }
复制代码

5 个回复

倒序浏览
这么说把,如果你现在家里只有一只猫,以后又打算养狗,还打算养别的,那你想简单的话就建立一个动物类型的引用,指向 动物的子类
比如  Animal animal = new dog() ;这样是由开辟内存空间的,这样做的方法是为了让你以后能够在添加点什么动物而不用去改代码
至于为什么不能用dog的方法呢?因为编译器在编译的时候他只读左边的数据(这里学到java高新技术张老师会说的)所以他不看你右边是什么,然后你如果用了右边的方法,那么编译就会因为找不到方法而报错,所以你要抢转...
回复 使用道具 举报
很多代码在写的时候还要考虑到以后,不能只是现在,还有一些就不用去想了,黑马要求学完的视频看完就能懂了
回复 使用道具 举报
本帖最后由 隋丙跃 于 2012-5-23 02:36 编辑

Animal animal = new Dog();
            //这里 animal  不能 访问Dog里面的属性和方法
            //我想知道是 在 new Dog() 的时候, 底层是怎么运行的,

????底层实际上它就是一条狗啦!这么说吧,有一个动物,它是狗,但是它也可以是猪啊!
所以现在得animal 是不能知道你new的那个具体动物的属性的。

Dog dog = (Dog) animal;

至于这条语句,底层也没有做什么改变,只是和JVM这个家伙说一声,这个animal是狗啊,所以animal就知道你new的是一条狗,而不是猪,猫。也就自然知道该有什么属性了

内存空间?只要你new了一个东西,系统就会分配空间!

单例和你说的那个扯不上关系




评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
攻城狮 + 1 赞一个!
郭宁 + 2 很给力!

查看全部评分

回复 使用道具 举报
林豪 发表于 2012-5-23 01:52
这么说把,如果你现在家里只有一只猫,以后又打算养狗,还打算养别的,那你想简单的话就建立一个动物类型的 ...

刚下课回来,看了 大家的解释,明白了~
谢谢哈~~~
回复 使用道具 举报
隋丙跃 发表于 2012-5-23 02:14
Animal animal = new Dog();
            //这里 animal  不能 访问Dog里面的属性和方法
            //我 ...

明白啦~
哈哈
太感谢了~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马