JAVA复用类

本文详细探讨了JAVA中的类复用技术,包括组合(has a)、继承(is a)和代理。讨论了多态的概念,如前期绑定与后期绑定,以及如何选择继承和组合。此外,还介绍了接口、抽象类和final关键字在JAVA编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JAVA复用类

组合语法(has a)

使用一些类的引用扩展本类的功能
初始化方法

  • 在定义对象的地方,确保对象在使用之前就被初始化
  • 在类的构造器中
  • 在正要使用这些对象之前,称为惰性初始化
  • 使用实例初始化
 class Light {
    public void open(){
        System.out.println("light is opening");
    }
    public void close(){
        System.out.println("light is closed");
    }
}
public class showLight {
    boolean lightState=false;
    Light light;
    public showLight(Light light){
        this.light=light;
    }
    public void lightControll(){
        if(lightState){
            light.open();
        }else{
            light.close();
        }
    }
}

继承语法:(is a)

重载和重写(覆写)
重载:方法名相同,参数列表不同,返回值类型可以不同,一个类中方法存在多个重载方法
覆写(重写):方法名,参数列表和返回值类型都相同父类与子类相同的方法,子类重写父类方法

使用继承方式复用
关于继承
当使用基类(被继承的类)创建出来一个导出类,该对象包含了一个基类的子对象,这个子对象和直接使用基类直接创建出来是一样的。唯一的区别是,前者包含在导出类内部,后者来自外部。
Java会自动在导出类的构造器中插入基类的构造器的调用,当你初始化一个导出类,其内部会自动初始化基类

public class A {
    static String i="hello";
    public A(){
        System.out.println("loading ...");
    }
}
class B extends A{
    public B(){
        System.out.println("loading B ...");
    }
    @Test
    public static void main(String[] args) {
        System.out.println(new B());
    }
}

**加粗样式**

代理语法

代理是组合(再类中添加对象的引用)和继承(在类中包含了该成员对象的所有方法)之间的结合,比较知名的包装器模式就是基于此实现的

 class Light {
    public void open(){
        System.out.println("light is opening");
    }
    public void close(){
        System.out.println("light is closed");
    }
}
public class showLight {
    Light light=new Light();

    public void open( ){
        light.open();
    }
    public void close(){
        light.close();
    }

    public static void main(String[] args) {
       showLight sl= new showLight();
       sl.open();
       sl.close();
    }
}

多态

继承允许对象视他自己本身的类型或其基类型来加以处理,进同一基类导出的多种类型视为同一类型进行处理,相当于一个类型的多种状态(行为),称为多态
多态通过自身方法调用,表现出与其他导出类不同的行为

前期绑定与后期绑定

绑定:将一个方法调用同一个方法主题关联起来
前期绑定在程序执行前绑定,面向过程语言默认的绑定方式
后期绑定也称为动态绑定或运行时绑定,运行时判断对象的类型,从而调用恰当的方法,编译器不知道对象的类型,但通过语言特有的机制,找到正确的方法体,就Java而言,private 和 final不能使用后期绑定,因为这两种类型不能被其他人覆盖,也就默认了拒绝动态绑定

多态与构造器

编写构造器准则
用尽可能简单的方法使对象进入正常状态,如果可以的话,避免调用其他方法
在一般方法体内部,动态绑定的调用是在运行时才决定的,因为对象无法知道他是属于方法所在的哪个类,还是属于那个类的导出类,如果要调用构造器内部的一个动态绑定的方法,那这是调用的就是该方法被覆盖后的定义。因为被覆盖方法在对象完全被构建出来之前被调用,会产生难以发现的错误
构造器是构建对象过程中的一个步骤,那么,在基类当前的构造器正在被调用的过程中,导出类还没有被初始化。但是,动态绑定的方法调用却会向外深入到继承层次结构内部,它可以调用导出类里的方法
初始化步骤
1. 在其它任何事物发生之前,将分配给对象的存储空间初始化为二进制的零
2. 一次递归调用基类构造器
3. 按照声明的顺序调用成员的初始化方法
4. 调用导出类的构造器主体

这种一个基类有多个导出类,运行时动态绑定的思想和经验就是设计模式中状态模式的基础,一般来说,用继承表达行为间的差异,并用字段表达状态上的变化

运行时类型识别

向上转型

基类向导出类转换,是一种安全的类型转换

向下转型

导出类向基类转换,不是一种安全的转换,若基类调用导出类额外新加的方法,就会产生类转型异常

关于继承和组合的选择

一般来说,推荐优先使用组合,一方面,在一个复杂的软件中,继承会增加程序的复杂性
而组合相对来说比较灵活,可以根据不同情况初始化,可以在运行时改变成员对象的行为等,组合被运用在很多设计模式之中,典型的设计模式就是策略模式

接口

接口:建立起一种基本形式,以此表示说有导出类共同的部分

抽象类(abstract)

包含抽象一个或多个抽象方法的类

接口(interface)

允许人们创建一个可以允许向上转型成多个基类的类型,实现某张类似多重继承的特性,建立起类与类之间的协议。接口中域隐式为static和final.方法必须为public,使用其他编译不会通过
使用接口的原因

  • 可以向上转型成多个基类类型(带来灵活性)
  • 防止客户端程序员创建该类的对象,并确保则仅仅是建立一个接口

关于接口的一些设计模式

策略模式:创建一个能够根据说传递的参数对象的不同而具有不同行为的方法
适配器模式接受你拥有的 接口,产生你需要的接口

多重继承

C++中的多重继承:组合多个类的接口的行为
*JAVA中的多继承:Java不提供多继承机制,实行单继承。因为多继承所继承的每一个类都有具体实现(就java继承机制而言,每子类(导出类)都包含只一个父类(基类)。子类若不重写就默认包含父类方法),会使程序背负很多不需要的东西。而是提供使用接口(interface)实现多继承。因为接口没有任何具体实现,所以没有任何与接口相关的存储,也就无法阻止多个接口的组合

适配接口

接口作为作为一种类的基本形式,且接口中没有具体实现,所以接口的一个很重要的作用就是适配接口——通过在现有任何类上实现一个接口,意味着让方法接受接口类型,是一种让任何类都可以对该方法进行适配的方式。相关的设计模式比如策略模式,适配器模式

final关键字

对于基本类型,final使基本类型数值恒不变,对于对象final使对象的应用恒定不变
一个既是static又是final的域只占一段不能改变的存储空间

final表示一个常量
static表示只有一份

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值