java中的复用类是什么意思?

代码重用可以大大简化我们的工作。在面向对象语言中,代码重用一般是通过重用类来实现的,Java也不例外。在Java中,有两种重用类的方法:合成(has-a)和继承(is-a)。组合是直接在新类中创建旧类的对象,这里我们只重用代码的功能,而不是它的形式。继承就是在原有类的基础上建立一个新的类。新类具有旧类的形式,但也添加了一些新功能。本章主要介绍综合与继承的知识。

第一,合成中使用的语法

合成的语法很简单,直接把要重用的类的对象的引用放到新的类里就行了。当然,仅此还不够。我们需要创建一个这个类的对象,这样引用就可以指向它。因为Java不会自动为我们创建一个默认对象,它只会自动为我们将字段中的引用初始化为null。可以在三个地方给引用赋值,一个是在定义引用时,另一个是在构造函数中,第三个是在使用对象之前。为了防止忘记在使用前给引用赋值,我们一般应该在前两种情况下创建对象。如果我们要创建的对象会花很多钱,而且不一定每次都要创建,那么可以考虑第三种方式来创建这个对象。

第二,继承使用的语法

继承是Java的重要组成部分,因为Java使用的是单根系统(C++不是这样,因为要兼容C),所以我们定义的每一个类都是从Java中的根类对象类继承而来的。当定义从自己的类继承的类时,使用extends关键字,后跟基类的名称,这意味着新定义的类从该基类继承。Java不允许多重继承(C++允许),也就是不允许一个类有多个基类。这个缺点可以通过接口来弥补,因为Java允许一个类实现任意数量的接口。

一个子类会自动获取基类中的所有字段和方法(那些被访问控制器控制的,对子类不可见的成员也会获取,只是不可见没用),这就是基类中代码的重用。除了从基类自动获取的代码外,还可以在子类中定义新成员,基类中的方法也可以被覆盖(所谓覆盖就是方法的声明部分相同但实现不同),这样同样签名的方法可以有不同的形状。

因为子类自动拥有基类的成员,所以在子类中调用基类的方法是很自然的。如果这个方法在子类中被覆盖了,编译器知道你调用的是哪个方法吗?Java提供了一个super关键字来引用类的基类,我们可以通过这个关键字明确表示要使用基类中的成员。如果不写super,编译器会理解为嵌套调用。

这里说个题外话。在Java程序中,public类中的main()方法经常被用作整个程序的入口。这样的静态main()方法不一定要出现在public类中。静态main()方法可以是所有类的入口(但只能是main(),不能是任何有其他名字的静态方法)。例如,一个程序由多个类组成,当我们想要对其中一个类进行单元测试时,我们可以将main()添加到这个类文件中,生成。编译后这个类的类文件,并通过java在控制台上运行。

子类继承基类后,它在基类中有成员,所以它可以通过创建的子类对象访问基类中可见的成员。Java是如何做到这一点的?当我们创建子类对象时,这里创建的对象不是类对象,而是这个类的基类的对象,创建后包含在子类对象中。也就是说,创建的子类对象拥有其基类的所有成员(从中我们可以知道为什么可以上传),但是子类对象只能访问其在基类中可以看到的成员。那么在创建这样一个对象的时候,子类和基类对象的创建顺序是怎样的呢?为了正确初始化基类,通常调用基类的构造函数进行初始化。在Java中,调用子类的构造函数时,会先自动调用基类的构造函数,这个过程是一层一层传递的。比如C继承B and B继承A,在创建C的对象时,C的构造函数会先调用B的构造函数,然后B的构造函数会先调用A的构造函数。(如果基类中没有默认的构造函数,编译时会报错。)但是这里自动调用的是基类的默认构造函数(不带参数)。想用参数调用基类的构造函数,应该怎么做?如上所述,基类的引用可以用super代替。就像在构造函数中通过this调用这个类的其他构造函数一样,我们可以通过super调用带参数的基类的构造函数,比如“super(i,j)”。和调用这个类的其他构造函数一样,对基类构造函数的显示调用需要放在子类构造函数的前面,前面不能有任何东西。如果基类的构造函数抛出异常,需要被捕获,那就比较麻烦了。