`
Kslsi
  • 浏览: 22549 次
  • 性别: 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学习重点

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

    Java开发技术大全(500个源代码).

    localVSmember.java 局部变量与成员变量同名问题示例 onlyTest.java 对象传值示例 otherClass.java 从类的外部访问对象的成员 showInstVar.java 演示不同的对象拥有不同的成员变量 showMain.java 演示main方法...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    1.2 准备好开始Java之旅 3 1.2.1 下载JDK 4 1.2.2 安装JDK 5 1.2.3 配置环境变量 6 1.2.4 测试环境是否安装成功 8 1.2.5 如果失败了怎么办? 9 1.3 让自己的第一个程序运行起来 10 1.3.1 编写自己的Hello ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    1.2 准备好开始Java之旅 3 1.2.1 下载JDK 4 1.2.2 安装JDK 5 1.2.3 配置环境变量 6 1.2.4 测试环境是否安装成功 8 1.2.5 如果失败了怎么办? 9 1.3 让自己的第一个程序运行起来 10 1.3.1 编写自己的Hello ...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    关于java程序员发展需要学习的路线整理集合 技术 应用技术 计算机基础知识 cpu mem disk net 线程,进程 第三方库 poi Jsoup zxing Gson 数据结构 树 栈 链表 队列 图 操作系统 linux 代码控制...

    Java基础知识点总结.docx

    六、 继承(面向对象特征之一)★★★★ 25 七、 接口(面向对象特征之一)★★★★ 28 八、 多态(面向对象特征之一)★★★★ 30 九、 java.lang.Object 31 十、 异常★★★★ 34 十一、 包(package) 37 十二、 ...

    java 编程入门思考

    1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与方便使用集合 1.7.4 清除时的困境:由谁负责清除? 1.8 违例控制:解决错误 1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 ...

    Java初学者入门教学

    1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与方便使用集合 1.7.4 清除时的困境:由谁负责清除? 1.8 违例控制:解决错误 1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 ...

    java联想(中文)

    1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与方便使用集合 1.7.4 清除时的困境:由谁负责清除? 1.8 违例控制:解决错误 1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 ...

    java初学者必看

    最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,...

    java类源码-ComputerStore:一个简单的"电脑商店"Java源码,主要用来学习了解java的接口,抽象类以及类的继承关系

    java 类源码 一个简单的 "电脑商店" Java源码 PC 的配置有各种组合, 相互组合为完整的电脑 CPU: Intel, AMD 硬盘: 希捷, 西部数据 等 显卡: 英伟达, AMD 等 主板电源内存等 这个程序比较简单, 只涉及了CPU和硬盘 ...

    JAVA基础课程讲义

    进程与程序的区别 168 JAVA中如何实现多线程(重点!!) 168 通过继承Thread类实现多线程 168 通过Runnable接口实现多线程 169 线程状态和sleep/yield/join/stop/destroy方法 170 新生状态 170 就绪状态 170 运行...

    java三大特性说明

     与之形成对比的就是接口,接口中的所有方法要求定义成公开抽象方法,因为这些方法所表示的就是标准,标准的信息必须做到公开化,透明化,例如体育竞赛中的规则。  抽象类与接口之间的对比:接口与抽象类本质上是...

    JAVA_Thinking in Java

    1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与方便使用集合 1.7.4 清除时的困境:由谁负责清除? 1.8 违例控制:解决错误 1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 ...

    Thinking in Java简体中文(全)

    1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与方便使用集合 1.7.4 清除时的困境:由谁负责清除? 1.8 违例控制:解决错误 1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 ...

    疯狂JAVA讲义

    5.8 继承与组合 154 5.8.1 使用继承的注意点 155 5.8.2 利用组合实现复用 156 学生提问:使用组合关系来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统开销更大? 159 5.9 初始化块 159 ...

    Thinking in Java 中文第四版+习题答案

    1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与方便使用集合 1.7.4 清除时的困境:由谁负责清除? 1.8 违例控制:解决错误 1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 ...

    java自学之道

    2.7组合框组件 2.8滑块组件 事件处理 3.1 事件处理原理 3.2 事件架构 3.3 焦点事件 3.4 键盘事件 3.5 鼠标事件 4、布局设计 4.1 FlowLayout流布局 4.2 BorderLayout边界布局 4.3 CardLayout卡式布局 4.4 ...

    AIC的Java课程1-6章

     理解运用继承和组合两种重用方式定义堆栈和队列,知道两种重用方式的适用场合。  理解使用递归方法构建二叉排序树,前序、中序、后序遍历二叉树。  学习ArrayList与LinkedList类,理解封装数组和...

    C++编程思想(《Thinking in C++》,Bruce Eckel著)

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

Global site tag (gtag.js) - Google Analytics