Java编程思想-3

复用类

上一节讲述了关于权限控制的内容。其实之所有要权限控制,就是为了安全的使用或者说重复利用,也就是无需重复制造轮子,站在巨人的肩膀上会让我们看的更远。那这一节主要讲述代码的重用机制。而类的复用有多种形式,组合、聚合、代理、继承等。

1、组合语法

我们的第一个问题就是什么是组合?组合就是将类的引用包含在新的类中。这有点像变量的使用。那么这又引入了一个新的问题,那就是变量或者是引用变量的初始化问题。对于基本数据类型都有相应的初始化值,而类的初始化值为null。因为new关键字是为其对象创建生存空间。只有这样引用变量才被真正的赋值,而该引用变量实际是指所创建的对象的地址。正如很多人所说,java语言中一切皆为指针。注意:基本数据类型和引用数据类型只有作为类的属性变量时才会被自动赋予初值,在方法中要主动赋初值,否则编译出错。

数据初始化的位置:1)类被定义的时候就被初始化。
2)构造方法中初始化;3)在使用之前初始化;4)使用实例初始化。
针对第四条,书中给出的例子就是一个代码块中初始化一些已经定义的变量。

2、继承语法

继承的关键字:extends。如果一个类没有明确指定继承哪个类,则表示继承Object类。还有类中的静态main方法,可以为每个类设置一个,这样的话便于对类的测试,而不影响实际程序的运行,只有实际开始执行的那个类的main方法才会执行,就是这个命令:(java 类名),对应的类的main方法才会执行。一个类没有main方法,同样可以编辑,只是该类无法直接执行而已。

2.1、初始化基类(父类)

子类(导出类)继承了父类的所有方法和属性(除了私有方法和属性),那么子类的对象包含所有的父类所有对外暴露的属性和方法,也就是说子类对象从某种意义上可以代表父类对象。按照这个思路下去,子类对象可以被看做父类对象——这就是上转型。
代码的实际运行逻辑中,在创建子类对象时,首先会调用父类的构造方法,其次再执行子类的构造方法。创建子类构造对象时,父类构造方法也执行了,也执行了—这说明父类对象也被创建了。这肯定就说明了子类对象也可以看做是父类对象,而其中的区别就是,子类的新的方法丢失了,父类中的一些方法可能也被子类覆写了。
当然,如果类中没有构造方法,编译器会自动添加一个构造方法。如果有自定义的构造方法。系统就不会添加构造方法。

3、代理

这个词看起来像是一种设计模式。书中说:这是继承和组合之间的一种中庸之道。那我就来简要说一下,什么时代理?就是用组合的方式覆写组合类的所有方法。举个栗子:

这里写代码片


// SpaceShip.java
public class SpaceShip{
    void up(){};
    void down(){};
}

// SpaceShipProxy.java
public class SpaceShipProxy{
    private SpaceShip ship =new SpaceShip();
    public void up(){
       ship.up();
        }
        public void down(){
      ship.down();
        }

}

4、组合和继承的结合使用

其实一般情况下,我们都在默默的使用这种方式来实现我们自己的程序逻辑。继承:更多的表示从普通到特殊的过程;组合:则更多的表示多个体的组合成为一个新的个体。
这里又讲到,对于组合的使用,注意不再使用的对象的清理,在try-catch-finally组合中,finally内的代码就是用来作为最后清理而存在的,因此它无论如何都会执行。
其中还有一个问题就是继承过程中可以实现对父类方法的覆写和重载。
 覆写:对父类的方法的方法体进行重写,在上转型的过程中可以屏蔽父类的这个方法。若要使用父类的该方法,可以使用super关键字。
 重载:方法名相同,参数类型和个数不同即可,但注意不定参数的方法的重载。

5、组合和继承的选择

组合的使用:has-a的关系,一堆零件组成一辆跑车;
继承的使用:is-a的关系,从普通到具体(从女人到女朋友)。
如果需要用到向上转型的问题,那肯定是使用继承。

6、Protected关键字

子类所具有的访问权限,但是同包内也可以访问。该关键字保存了对底层修改的权限,后来者可以对底层进行修改,但不作为对外开放访问的接口。

7、final关键字

有复用有改变就有禁止改变。Final关键字就做这件事。它可以用来修饰:变量,方法,类。

  • 修饰变量时:表示一旦被赋值就不可被修改的变量。1)对于基本变量可以其值不会改变;2)而对于引用变量只是保持当前对象的地址不变,其属性值都是可以改变的;3)修饰方法的参数时,表示传入的参数在方法体内不能被修改,若是传入的是对象的引用,该对象的引用不能被重新赋予新的对象。4)可以在类中定义,在构造方法中初始化,这样可以根据不同的构造方法将其初始化为不同的值。
  • 修饰方法时:不能被覆写。
  • 修饰类时:该类不能被继承。

8、初始化及类的加载

这里只说明一点,子类和父类都有静态常量时,在穿件子类对象时,首先会执行(初始化)所有(父类和子类的)的静态变量、静态代码块。再执行父类的构造方法,其次子类的构造方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧阳小伙

您的打赏是我创作的:最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值