`
Kslsi
  • 浏览: 23460 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

重学java之继承与组合

    博客分类:
  • java
阅读更多

       重学java,是针对我自己而言的,在学java的初期并没有很认真的阅读相关书籍,导致只是单纯地写代码,对于java的很多基础知识以及一些该掌握的没有很好的掌握,所以抽暑假的时间好好巩固一下。

 

       对于继承,大家都很熟悉,简单介绍一下,是面对对象三大特征之一,也是实现软件复用的重要手段之一。java的继承具有单继承的特点,每个子类只能有一个直接父类。

 

       java的继承通过extends实现,实现继承的类称为子类,被继承的类称为父类(超类、基类)。子类和父类的关系,是一般和特殊的关系,例如家具和书桌的关系,书桌继承了家具,书桌是家具的子类,则书桌是特殊的家具。

 

       java中的继承格式:

              修饰符 class subClass extends baseClass{

                     //类定义部分

              }

 

       子类继承了父类,同时也是扩展了父类,在子类中包含与父类同名方法的现象交方法重写(方法覆盖Override),方法重写遵循的规则:

              两同两小一大

                     两同”即方法名相同、形参列表相同;

                     两小”指子类方法返回值类型应比父类方法返回值类型更小或者相等,子类方法声明抛出的异                  常应比父类方法声明抛出的异常类更小或相等(这个在之前的编程中没有遇到过也没有发现过);

                    一大”指的是子类方法的访问权限应比父类方法更大或相等。当父类方法被覆盖之后用super或                  者父类类名可以调用父类中的方法。

 

 

       另外我们要明白的是,在我们创建一个子类对象时,程序总是从该类所继承树最顶层类的构造器开始执行,然后依次向下执行,最后执行本类的构造器。最顶层类(java.lang.Object)总是会在创建子类对象时被隐式调用。

 

       说了这么多继承,我们要明白继承在实现类重用时,会带来一个非常大的坏处:严重破坏了父类的封装性。当然,我们可以通过设计父类来保证其良好的封装性,这时,我们应遵循以下规则:

              1.尽量隐藏父类的内部数据。尽量把父类的虽有属性设置成private访问类型。

              2.不让子类可以随意访问、修改父类方法。父类中那些仅为辅助其他的工具方法,应用private修             饰;若父类中的方法需要被外部类调用,则必须用public修饰,但不希望子类重写改方法,则可以               用final修饰;如果希望父类的某个方法被子类重写,到不希望被其他类访问,则可以用protected修             饰。

              3.不在父类构造器中调用被子类重写的方法。

 

       另外,如果需要复用一个类,还可以把该类当成另一个类的组合成分,从而允许新类直接复用该类的public方法。组合是把旧类对象作为新类的属性嵌入,从而实现新类的功能,这样,用户看到的是新类的方法,而不能看到嵌入对象的方法。在新类中使用private修饰嵌入的旧类对象。

 

       下面用代码实现看看继承和组合二者的用法以及区别:

 

/**
 * 用继承实现代码复用
 */
class Animal {
	private void beat() {
		System.out.println("心脏跳动...");
	}

	public void breath() {
		beat();
		System.out.println("吸一口气,吐一口气,呼吸中...");
	}
}

// 继承Animal,直接复用父类的breath方法
class Bird extends Animal {
	public void fly() {
		System.out.println("我在天空自在的飞翔...");
	}
}

// 继承Animal,直接复用父类的breath方法
class Wolf extends Animal {
	public void run() {
		System.out.println("我在陆地上的快速奔跑...");
	}
}

public class TestInherit {
	public static void main(String[] args) {
		Bird b = new Bird();
		b.breath();
		b.fly();
		Wolf w = new Wolf();
		w.breath();
		w.run();
	}
}

 

 

/**
 * 用组合实现代码复用
 */
class Animal {
	private void beat() {
		System.out.println("心脏跳动...");
	}

	public void breath() {
		beat();
		System.out.println("吸一口气,吐一口气,呼吸中...");
	}
}

class Bird {
	// 将原来的父类嵌入原来的子类,作为子类的一个组合成分
	private Animal a;

	public Bird(Animal a) {
		this.a = a;
	}

	// 重新定义一个自己的breath方法
	public void breath() {
		// 直接复用Animal提供的breath方法来实现Bird的breath方法。
		a.breath();
	}

	public void fly() {
		System.out.println("我在天空自在的飞翔...");
	}
}

class Wolf {
	// 将原来的父类嵌入原来的子类,作为子类的一个组合成分
	private Animal a;

	public Wolf(Animal a) {
		this.a = a;
	}

	// 重新定义一个自己的breath方法
	public void breath() {
		// 直接复用Animal提供的breath方法来实现Bird的breath方法。
		a.breath();
	}

	public void run() {
		System.out.println("我在陆地上的快速奔跑...");
	}
}

public class TestComposite {
	public static void main(String[] args) {
		// 此时需要显式创建被嵌入的对象
		Animal a1 = new Animal();
		Bird b = new Bird(a1);
		b.breath();
		b.fly();
		// 此时需要显式创建被嵌入的对象
		Animal a2 = new Animal();
		Wolf w = new Wolf(a2);
		w.breath();
		w.run();
	}
}

 

       在我们实际运用中明显用继承多与组合,但是,对于我们来说,在使用之前,考虑使用哪个方法是必须要做的。我们要知道,继承是对已有的类做一番改造,从此获得一个特殊的版本,也就是将一个较为抽象的类改造成能用于某些特定需求的类。例如Wolf和Animal的关系。

 

       而组合则是表示整体与部分的关系,例如Person类需要复用Arm类的方法,则应使用组合来实现复用。

 

       总之,继承是要表达一种“是(is-a)”关系,组合是要表达“有(has-a)”的关系。

 

 

 

分享到:
评论

相关推荐

    重学java的设计模式

    2. 装饰器模式:动态地给对象添加一些额外的职责,提供了比继承更多的灵活性。 3. 代理模式:为其他对象提供一种代理以控制对这个对象的访问,比如权限控制、远程代理等。 4. 桥接模式:将抽象部分与实现部分分离,...

    关于Java中的继承和组合的一个错误使用的例子

    在Java编程中,继承和组合是两种常用的代码复用机制,它们各有特点并适用于不同的场景。这篇文章通过一个错误使用继承和组合的例子,探讨了这两者的区别以及如何避免不当使用带来的问题。 首先,让我们理解什么是...

    Java设计一个银行帐户类(继承与多态)

    在Java编程中,设计一个银行账户类是学习面向对象编程的一个常见练习,它涉及到类的定义、对象的创建以及继承和多态的概念。在这个实验中,我们创建了一个名为`BankCount`的类来代表银行账户,并包含了一系列与账户...

    UML学习之依赖_关联_聚合_组合_继承

    ### UML学习之依赖、关联、聚合、组合与继承 #### 一、泛化(Generalization) **概念:** 泛化表示的是类与类之间的继承关系、接口与接口之间的继承关系,或者是类对接口的实现关系。在UML中,泛化关系通常用一个带...

    java script 继承的实现

    在 JavaScript 中,继承主要通过原型链(prototype chain)、构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承等方法实现。以下是对这些继承方式的详细解释: 1. **原型链继承**:这是 JavaScript ...

    Java设计模式学习.pdf

    - 合成复用原则(Composite Reuse Principle):尽量使用对象组合,而不是继承。 - 迪米特原则(Law of Demeter):一个对象应该对其他对象有最少的了解。 3. 创建型模式和Java对象创建方式: - 简单工厂模式:...

    java学习路线总结.doc

    - **继承与多态**:学习继承的细节,包括构造方法的调用,以及多态的实现。 **第四阶段:常用基础类** - **枚举类型**:学习枚举的定义和使用,结合switch-case语句的应用。 - **字符串处理**:掌握String、...

    java编写的组合模式例子,建造一个工厂

    ### Java编写的组合模式例子:建造一个工厂 #### 一、引言 组合模式(Composite Pattern)是一种结构型设计模式,允许将对象组合成树形结构,并以一致的方式处理单个对象与组合对象。该模式使得客户端代码可以一致...

    java_java学习课本_

    2. **类与对象**:Java是面向对象的语言,因此深入理解类和对象至关重要。学习者会学习如何定义类,创建对象,并理解类之间的关系,如关联、依赖、聚合和组合。 3. **异常处理**:Java中的异常处理是编程实践中必不...

    java学习计划,J2EE学习计划,JAVA,J2EE,java学习步骤,j2ee学习步骤

    Java学习计划是一个逐步深入的过程,尤其对于J2EE(Java 2 Enterprise Edition)这样的企业级开发平台。以下是一个详尽的J2EE学习路径,涵盖了从基础到高级的知识点: 1. **Java基础**: - 首先,你需要掌握Java的...

    JAVA 子类继承父类的范例 可直接运行

    在Java中,继承是面向对象编程的核心特征之一,它允许我们创建一个新类(子类)基于一个已经存在的类(父类或超类)的结构。这样可以复用现有类的代码,并可添加或覆盖特性来形成新的类。本文将通过具体的代码范例,...

    关于两点三点的坐标描述Java Eclipse 继承的练习

    这时候,你可以通过继承、组合和多态等面向对象的编程技巧来构建更复杂的结构和算法。 总结来说,这个练习主要涉及了以下几个知识点: 1. 坐标系统的概念和表示。 2. Java类的定义和实例化。 3. 类的继承和多态性。...

    java学习重点

    继承性 继承是一个对象获得另一个对象的属性的过程,继承机制是一个对象成为一个更具通用类的一个特定实例成为可能,避免了代码的重复编写; 多态性 (重载overload,方法名相同、参数的个数不同、参数的类型不同、...

    【Android进阶】(1)用继承和组合方式自定义控件

    本教程主要探讨如何通过继承和组合的方式来自定义控件,适用于已经有一定Android基础的开发者进行进阶学习。 首先,我们来理解自定义控件的两种基本方法:继承和组合。 1. **继承**: - **基础概念**:在Java或...

    计算机图形学,java,java3D图形设计

    首先,`WeiqiDisplay`类继承自`java.applet.Applet`,这表明它是一个Java小应用程序,可以直接嵌入到网页中展示。`createBranchGroupSceneGraph`方法是创建场景图的核心,场景图是Java 3D中的基础元素,它定义了图形...

    Java入门学习PPT课件

    - **类与对象**:Java是面向对象的语言,一切皆为对象。类是创建对象的模板,它定义了对象的状态(数据成员)和行为(方法)。 - **封装**:封装是隐藏对象的属性和实现细节,仅对外提供公共访问方式,是面向对象...

    java学习资料之Java笔记

    以上只是Java学习笔记的冰山一角,随着深入学习,你将接触到类与对象的创建、继承与多态、异常处理、集合框架、IO流、多线程、网络编程等更多主题。在实践中不断探索和积累经验,才能真正掌握这门强大的编程语言。

    Thinking In Java学习之50问

    组合与继承 - **组合(Composition)**:是一种通过包含一个或多个其他类的对象来实现复用的技术,被包含的对象成为容器类的一部分。 - **继承(Inheritance)**:是一种使一个类可以继承另一个类的特性和行为的方式,...

Global site tag (gtag.js) - Google Analytics