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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

类的组合:
  1. class Animals {
  2.         private void beat() {
  3.                 System.out.println("心脏跳动。。。");
  4.         }

  5.         public void breath() {
  6.                 beat();
  7.                 System.out.println("呼吸中。。。");
  8.         }
  9. }

  10. class Dog {
  11.         // 将Animal嵌入到类里面
  12.         private Animals animals;

  13.         public Dog(Animals animals) {
  14.                 this.animals = animals;
  15.         }

  16.         // 定义一个自己的breath()方法
  17.         public void breath() {
  18.                 // 直接复用Animals提供的方法
  19.                 animals.breath();
  20.         }

  21.         public void Run() {
  22.                 System.out.println("陆地上奔跑");
  23.         }
  24. }

  25. class Bird {
  26.         // 将Animal嵌入到类里面
  27.         private Animals animals;

  28.         public Bird(Animals animals) {
  29.                 this.animals = animals;
  30.         }

  31.         // 定义一个自己的breath()方法
  32.         public void breath() {
  33.                 // 直接复用Animal提供的方法
  34.                 animals.breath();
  35.         }

  36.         // 定义自己的fly方法
  37.         public void fly() {
  38.                 System.out.println("天空里面飞翔!");
  39.         }
  40. }

  41. public class Combination {
  42.         public static void main(String[] args) {
  43.                 Dog dog = new Dog(new Animals());
  44.                 dog.breath();
  45.                 dog.Run();
  46.                 Bird bird = new Bird(new Animals());
  47.                 bird.breath();
  48.                 bird.fly();
  49.         }
  50. }
复制代码
类的继承:
  1. class Animals {
  2.         private void beat() {
  3.                 System.out.println("心脏跳动。。。");
  4.         }

  5.         public void breath() {
  6.                 beat();
  7.                 System.out.println("呼吸中。。。");
  8.         }
  9. }
  10. class Dog extends Animals {
  11.        
  12.         public void Run() {
  13.                 System.out.println("陆地上奔跑");
  14.         }
  15. }
  16. class Bird extends Animals{
  17.        
  18.         // 定义自己的fly方法
  19.         public void fly() {
  20.                 System.out.println("天空里面飞翔!");
  21.         }
  22. }
  23. public class Inheritance {
  24.         public static void main(String[] args) {
  25.                 Dog dog = new Dog();
  26.                 dog.breath();
  27.                 dog.Run();
  28.                 Bird bird = new Bird();
  29.                 bird.breath();
  30.                 bird.fly();
  31.         }
  32. }
复制代码

以上输出的结果都是一样的,那么那种对系统的开销最小呢??


4 个回复

倒序浏览
这个要请高人来回答了。我觉得比起开销,哪一种设计更合理才是更加重要的问题:is a VS has a
回复 使用道具 举报
fantacyleo 发表于 2014-7-10 18:03
这个要请高人来回答了。我觉得比起开销,哪一种设计更合理才是更加重要的问题:is a VS has a ...

这个倒是没什么错,我主要还是想搞懂这两种方式的实现细节,比如在内存中是如何分配的?类的组合和内部类有什么区别?
回复 使用道具 举报
mytongyong 发表于 2014-7-10 18:10
这个倒是没什么错,我主要还是想搞懂这两种方式的实现细节,比如在内存中是如何分配的?类的组合和内部类 ...

这个,初学者真没必要搞得太细,没有对底层的基本了解是很难搞明白的。内存分配倒是不太难,老毕视频里教的内存分析知识就足够把图画出来了。内存占用应该差不多(因为还有些更底层的细节,比如字节对齐,不敢肯定100%相同)。但内存分配只是一方面,还有比如方法调用时的搜寻开销,也就是说,如果一个方法在本类找不到,那么虚拟机沿着继承体系往上寻找的开销有多大,这我就不清楚了
回复 使用道具 举报
fantacyleo 发表于 2014-7-10 18:25
这个,初学者真没必要搞得太细,没有对底层的基本了解是很难搞明白的。内存分配倒是不太难,老毕视频里教 ...

嗯,初学Java,路还很长,受教了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马