文档章节

组合与继承

PrivateO2
 PrivateO2
发布于 2017/08/01 10:19
字数 1287
阅读 0
收藏 0

组合与继承

 

1、 组合

  组合:只需在新的类中产生现有类的对象。由于新的类由现有类的对象组成,所以称为组合。(只是复用了现有程序代码的功能,而非它的形式)如下:

		class A{
			private int a = 10;
			private int b;
			private float c;
		}
		public class B{
			private String str;
			private A a = new A();
			pubblic String tostring(){
				System.out.println("a");
			}
		}

 

2、 继承

 继承:按照现有类的类型来创建新类。无需改变现有类的形式,采用往现有类的形式并在其中添加新代码。当创建一个类时,除非已明确指出要从其它类中继承,否则就是隐式地从Java的标准根类Object类进行继承。

  注意:

   1. 一个Java文件中可以含有多个类,但只能有一个public类。可以为每个类都创建一个public static void main(String []args){}方法。这样可以使得单元测试变得简便易行。
   2. . 含有多个类,但只有(也只能有)一个public类的一个Java文件中。若所有类编译通过,此时执行 java className(非public类)命令,此时该类的main方法也会执行,即使这个类只有包访问权限,这个main方法也是可以执行的。
   3. Java中用super关键字表示超类的意思(当前类就是从超类继承来的)。表达式super.method()表示将调用基类中的method()方法。

 

2.1、 初始化基类

  对于不带参数的构造器及默认构造器:Java会自动在导出类的构造器中插入对基类构造器的调用。
  带参数的构造器:如果没有默认的构造器或带参数的构造器,要使用基类导出类必须用super关键字显式的调用,并配以参数列表。

 

2.2、 向上转型

		class Instrument{
			public void play(){
			}
			static void tune(Instrument instrument){
				//.....
			}
		}
		public class Wind extends Instrument{
			public sattic void main(String []args){
				Wind wind = new Wind();
				Instrument.tune(wind);
			}
		}

  在上述代码过程中把Wind类型传入Instrument类型中,即由导出类转为基类(在继承图中是向上转型的,所以一般称为向上转型)。向上转型是从一个较专用类型向较通用类型转换,导出类可能比基类有更多的方法,但它必须至少含有基类的方法,所以在向上转型的过程中,类接口中唯一可能发生的方法就是丢失方法,所以总是很安全的。

 

2.3、 继承与初始化

  类的代码在初次使用时才加载,通常发生于创建类的第一个对象之时,但是当访问static域或static方法时,也会发生加载。因为构造器也是static方法,只是没有显式的写出来,所以也可以说:“类是在任何static成员被访问时加载的

初始化顺序:

  首先:在对子类进行加载时,编译器发现子类有一个基类(由extends发现),则开始加载基类,若基类还有其自身的基类,则去加载其基类的基类。

  然后,根基类中的static初始化,再下一个导出类中的static初始化,依次类推直到最后的一个导出类static也完成初始化。

  至此所有类加载完毕,然后根基类的构造器被调用(无参构造器默认调用,有参数的则需用super指定调用)。在根基类构造器完成后,实例变量按次序被初始化,最后构造器的其余部分被执行。加粗这一部分需好好揣摩,实际上调用根构造器完成后可以理解为调用构造器只是通过构造器进入了被加载的当前类,并未执行构造器内部的其它语句,还得在按顺序将类中的实例变量初始化后,在进入构造器顺序执行其它语句。所以整体效果上来说,实例变量初始完成后,构造器才会执行其内的语句。

  最后按上一步执行顺序对下一个导出类初始化,直到最后一个导出类初始完成。对象才算创建成功。

 

3、 继承与组合的区别

  组合和继承都允许在新的类中放置子对象,组合是显式地这样做,而继承是隐式的做。
  组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形。(has-a)"有一个"的关系是用组合来表示的。

  在继承的时候,使用某个现有类,并开发它的一个特殊版本。这意味着你在使用一个通用类,并为了某种特殊需要而将其特殊化。(is-a)“是一个”的关系使用继承来表示的。
  在讨论使用继承还是组合时,一个最清晰的判断就是是否需要进行从导出类到基类的向上转型,若必须向上转型则继承是必要的。

© 著作权归作者所有

共有 人打赏支持
PrivateO2
粉丝 0
博文 47
码字总数 65505
作品 0
成都
程序员

暂无文章

oracle 安装 PL/SQL Developer连接64位Oracle免安装配置

PL/SQL Developer连接64位Oracle 在64位系统上安装64位的Oracle数据库,但是没有对应的64位PL/SQL Developer,此时就不能使用PL/SQL Developer来进行直接连接的,所以要想实现连接还得需要其...

PeakFang-BOK
14分钟前
2
0
裁员寒冬袭来,30岁还在CRUD的Java程序员,拿什么安身立命?

就在近日,智联招聘公布的数据更是侧面印证了很多公司“瘦身”的事实:“2018年第二季度,小微企业用人需求较第一季度平均下降26.6%”。 裁员大潮正滚滚向前,席卷各行各业! 你做好失业的准...

Java填坑之路
16分钟前
3
0
第一章:什么是SpringCloud

第一章:什么是SpringCloud 何为微服务 在了解 SpringCloud之前,我们先来大致了解下 微服务这个概念吧。 传统单体架构 单体架构在小微企业比较常见,典型代表就是一个应用、一个数据库、一个...

DemonsI
22分钟前
5
0
环境搭建之八-- node.js

1.node.js官网下载64位二进制压缩包 node-v8.12.0-linux-x64.tar.xz 2.解压文件 2.1 xz格式文件为 tar格式 xz -d node-v8.12.0-linux-x64.tar.xz 此时文件已经转变为 node-v8.12.0-linux-x64...

imbiao
26分钟前
1
0
JVM调优浅谈

1.数据类型 java虚拟机中,数据类型可以分为两类:基本类型和引用类型。 基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值。 “引用值”代表了某个对象的...

xtof
30分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部