`
vanadiumlin
  • 浏览: 505690 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

谈谈Java中的继承与组合

阅读更多

1.继承和组合的概念
在新类里简单地创建原有类的对象。我们把这种方法叫作“组合”,因为新类由现有类的对象合并而成。我们只是简单地重复利用代码的功能,而不是采用它的形式。
第二种方法是创建一个新类,将其作为现有类的一个“类型”。我们可以原样采取现有类的形式,并在其中加入新代码,同时不会对现有的类产生影响。这种魔术般的行为叫作“继承”(Inheritance),涉及的大多数工作都是由编译器完成的。对于面向对象的程序设计,“继承”是最重要的基础概念之一。对于组合和继承这两种方法,大多数语法和行为都是类似的(因为它们都要根据现有的类型生成新类型)。
2.组合也就是一个类的对象是另外一个类的成员,一般的程序都有组合的意味,只不过是基本数据类型是成员变量,下面请看具体的例子
class Head
{
       Head(){
      System.out.println(" head ");
      }
}
class Body
{
      Body(){
      System.out.println(" body ");
      }
}
class Person()
{
      Head h=null;
      Body b=null;
     Person()                                //人是由头和身体组成的,Head和Body的对象是Person的一部分
    {
      h=new Head();
      b =new Body();
    }
 
}
 
3.继承作为面向对象的三个重要特性的一个方面,在面向对象的领域有着及其重要的作用,好像没听说哪个面向对象的语言不支持继承
 class Person
{
 private String name=null;
 private int age=0;
 public Person(String n,int a)
 {
  name=n;
  age=a;
 }
 int getAge()
 {
  return age;
 }
 String getName()
 {
  return name;
 }
 void getDescription()
 {
  System.out.println("name: "+name+"\t"+"age: "+age);
 }
}
class Student extends Person
{
 private String studno=null;
 public Student(String n,String no,int a)
 {
  super(n,a);
  studno=no;
 }
}
说明:Student类中有三个成员变量name,age,studno和一个方法getDescription();
注意:子类继承了父类的所有变量和函数,只是子类不能访问父类的private类型的变量和函数,其实privae类型的变量还是继承到子类中的
 
4.
无论还是继承,都允许我们将子对象置于自己的新类中。大家或许会奇怪两者间的差异,以及到底该如何选择。
如果想利用新类内部一个现有类的特性,而不想使用它的接口,通常应选择组合。也就是说,我们可嵌入一个对象,使自己能用它实现新类的特性。但新类的用户会看到我们已定义的接口,而不是来自嵌入对象的接口。考虑到这种效果,我们需在新类里嵌入现有类的private对象。
有些时候,我们想让类用户直接访问新类的组合。也就是说,需要将成员对象的属性变为public。成员对象会将自身隐藏起来,所以这是一种安全的做法。而且在用户知道我们准备合成一系列组件时,接口就更容易理解。car(汽车)对象便是一个很好的例子:

class Engine {
  public void start() {}
  public void rev() {}
  public void stop() {}
}

class Wheel {
  public void inflate(int psi) {}
}

class Window {
  public void rollup() {}
  public void rolldown() {}
}

class Door {
  public Window window = new Window();
  public void open() {}
  public void close() {}
}

public class Car {
  public Engine engine = new Engine();
  public Wheel[] wheel = new Wheel[4];
  public Door left = new Door(),
       right = new Door(); // 2-door
  Car() {
    for(int i = 0; i < 4; i++)
      wheel[i] = new Wheel();
  }
  public static void main(String[] args) {
    Car car = new Car();
    car.left.window.rollup();
    car.wheel[0].inflate(72);
  }
} ///:~
由于汽车的装配是故障分析时需要考虑的一项因素(并非只是基础设计简单的一部分),所以有助于客户程序员理解如何使用类,而且类创建者的编程复杂程度也会大幅度降低。
如选择继承,就需要取得一个现成的类,并制作它的一个特殊版本。通常,这意味着我们准备使用一个常规用途的类,并根据特定的需求对其进行定制。只需稍加想象,就知道自己不能用一个车辆对象来组合一辆汽车——汽车并不“包含”车辆;相反,它“属于”车辆的一种类别。“属于”关系是用继承来表达的,而“包含”关系是用组合来表达的。

5. protected
现在我们已理解了继承的概念,protected这个关键字最后终于有了意义。在理想情况下,private成员随时都是“私有”的,任何人不得访问。但在实际应用中,经常想把某些东西深深地藏起来,但同时允许访问衍生类的成员。protected关键字可帮助我们做到这一点。它的意思是“它本身是私有的,但可由从这个类继承的任何东西或者同一个包内的其他任何东西访问”。也就是说,Java中的protected会成为进入“友好”状态。
我们采取的最好的做法是保持成员的private状态——无论如何都应保留对基 础的实施细节进行修改的权利。在这一前提下,可通过protected方法允许类的继承者进行受到控制的访问:

import java.util.*;

class Villain {
  private int i;
  protected int read() { return i; }
  protected void set(int ii) { i = ii; }
  public Villain(int ii) { i = ii; }
  public int value(int m) { return m*i; }
}

public class Orc extends Villain {
  private int j;
  public Orc(int jj) { super(jj); j = jj; }
  public void change(int x) { set(x); }
} ///:~
可以看到,change()拥有对set()的访问权限,因为它的属性是protected(受到保护的)。
 
6. 再论合成与继承
在面向对象的程序设计中,创建和使用代码最可能采取的一种做法是:将数据和方法统一封装到一个类里,并且使用那个类的对象。有些时候,需通过“组合”技术用现成的类来构造新类。而继承是最少见的一种做法。因此,尽管继承在学习OOP的过程中得到了大量的强调,但并不意味着应该尽可能地到处使用它。相反,使用它时要特别慎重。只有在清楚知道继承在所有方法中最有效的前提下,才可考虑它。为判断自己到底应该选用组合还是继承,一个最简单的办法就是考虑是否需要从新类上溯造型回基础类。若必须上溯,就需要继承。但如果不需要上溯造型,就应提醒自己防止继承的滥用。但只要记住经常问自己

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Cpp_Java_Man/archive/2006/05/02/705279.aspx

分享到:
评论

相关推荐

    高质量java程序设计读书笔记

    本文将基于"高质量java程序设计读书笔记"的主题,深入探讨Java编程中的异常处理以及面向对象编程(OOP)中的继承和组合设计原则。 首先,异常处理是Java程序设计中的重要组成部分,它提供了一种结构化的方式来处理...

    java script 继承的实现

    在 JavaScript 中,继承可以通过多种方式实现,包括原型链继承、构造函数继承、组合继承、寄生式继承、寄生组合式继承等。这篇博客 "java script 继承的实现" 会深入探讨这些继承模式。 首先,我们来谈谈**原型链...

    设计模式(Java 与模式-笔记 二)

    在Java中,适配器模式常通过继承或组合实现,使得原有类能适应新的接口要求。 再来看策略模式(Strategy),它定义了一系列的算法,并将每个算法封装起来,使它们可以相互替换,让算法的变化独立于使用算法的客户。...

    Java面试宝典-经典

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    java面试题大全(2012版)

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    java的精华

    Java的精华中提到的23种设计模式,是Java编程领域中的经典内容,它们被广泛应用于软件设计中,用以解决各种常见问题,提高代码的重用性、可读性和系统的灵活性。接下来,我会逐一介绍这些设计模式,对每种模式的特点...

    最新Java面试宝典pdf版

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    java面试宝典2012

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 67 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    Java就业面试题264道(独家奉献)

    - 可以在一个`.java`文件中定义多个类,但是只能有一个公共类,并且该文件名必须与公共类的名字完全一致。 - 非公共类的数量则不受限制。 **3. Java有没有goto?** - Java中没有传统意义上的`goto`语句,但在某些...

    Java面试宝典2012新版

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    Java面试宝典2012版

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到...

    java 课件ppt

    【Java初学者指南:深入理解标识符、关键字与面向对象编程】 Java是一种广泛使用的编程语言,尤其适合初学者入门。本课件集合了Java的基本概念,涵盖了标识符、关键字以及面向对象程序设计的核心思想,旨在帮助学习...

    Java面试框架高频问题2019

    - 注解是Java语言的一个特性,用于在代码中添加元数据。Spring框架利用反射机制读取和解析注解,从而实现特定的功能。 #### MyBatis面试高频问题 **问题一:什么是Mybatis?** - **MyBatis**是一个优秀的持久层...

    Android Databinding 与 RecyclerView 完美结合

    这是Android Studio 3.0引入的一个官方库,它允许开发者直接在XML布局文件中声明数据绑定,从而减少了Java代码中的样板代码。使用Databinding,我们可以将UI组件与数据模型直接关联,简化事件处理,并且使数据变化...

    爬虫框架,WebMagic,依赖包下载

    对于更复杂的需求,你可以通过继承或组合这些组件来构建自己的爬虫解决方案。 总的来说,WebMagic是一个强大且灵活的Java爬虫框架,适合各种规模的项目使用。其模块化的设计使得开发者能够轻松地定制爬虫功能,同时...

    第14讲谈谈你知道的设计模式1

    结构型模式,是针对软件设计结构的总结,关注于类、对象继承、组合方式的实践经验。常见的结构型模式,包括桥接模式(Bridge)、适配器模式(Adapter)、装饰者模式(Decorator)、代理模式(Proxy)、组合模式...

    中兴华为面试试题(经典)

    - 继承与组合的区别,哪种情况下更适合使用组合? 4. **并发编程**: - Java中的线程同步机制,如synchronized关键字、wait/notify机制、Lock接口。 - 什么是死锁,如何避免和检测死锁? - 讲解volatile关键字...

Global site tag (gtag.js) - Google Analytics