Java多态

先来看一个例子程序:DuoTaiTest.java

class Animal {
void breathe() {
System.out.println("animal breathe");
}
final static void live(Animal an) {
an.breathe();
}
}

class Fish extends Animal {
void breathe() {
System.out.println("fish bubble");
}
}

class Cat extends Animal {
void breathe() {
System.out.println("cat breathe");
}
}

public class DuoTaiTest {
public static void main(String[] args) {
Fish fish = new Fish();
Cat cat = new Cat();
Animal.live(fish);
Animal.live(cat);
}
}

Cat和Fish都继承于Animal,但都有自己的呼吸方式,因此覆盖了Animal类的breathe方法。但是并不用在Animal类中单独为Cat编写一个live方法。因为Animal类中的live方法就像是一个万能接口,当传递过来的Fish类的对象,它就会调用Fish类的breathe方法,当传递过来的是Cat类的对象,它就会调用Cat类的breathe方法。这就是面向对象的多态。

多态性是和继承密切相关的,他的含义就在于同一操作对不同对象可以呈现不同的行为。这些不同的对象必须是一组各具个性却同属于一个继承关系的不同个体。如Animal类中的Fish和Cat,他们有着不同的呼吸方式,但都通过覆盖Animal类的breathe方法来描述这一行为。此时,当执行Animal类的live方法时,将根据传递的具体对象的引用来决定调用相应的呼吸方法。显然这种可以根据传递不同对象的引用来调用不同对象的方法的机制,为实现面向对象编程赋予了更大的灵活性。

到这里,读者有没有想一下,在Animal类的live方法中接受一个Animal类的引用作为参数时,编译器是怎么知道这个Animal类的引用时指向Cat类而不是Fish类的呢?这种指向是发生在程序运行的那个阶段的呢?

为了深入理解内部的运行原理,首先看看什么是绑定机制。通常把对方法的调用连到方法本身的过程称为绑定。当绑定发生在程序运行之前时,称为前绑定。而在程序运行的时候根据对象的类型来决定绑定到哪个方法的机制称为后绑定,也称为动态绑定或者运行时绑定。对于上面的例子程序来说,在运行程序之前我们是无法决定live方法中的形参该指向哪一个对象的,因为这时候对象还没有产生,堆内存中并没有分配任何空间。因此,这是的编译器是不知道该指向哪一个对象类型的,只有在程序运行的时候,内存中有了实际存在的对象实体,才能在方法调用时判断出对象类型,进而调用正确的方法。可见,后绑定机制才是多态性真正的本质所在。

在多态性问题上一直有两个容易混淆的概念,这两个概念就是重载(overload)和覆盖(override)。重载是指在一个类里面允许存在多个同名方法的机制,这些方法必须保证拥有不同的参数列表,这种不同表现在参数个数,参数类型。而覆盖则是在子类中重新定义父类中的非私有方法,这种机制发生在继承关系中。

重载的实现其实是在程序编译阶段就被确定下来的事情,在编译时,编译器会根据方法不同德参数表决定具体讲调用哪个被重载的方法。首先,编译器将这些同名的方法的名称重新命名。由于这个过程是在编译阶段实现的,是静态的,因此这种绑定就是前绑定。它的好处就是整个绑定的过程是在编译阶段完成,因此程序执行效率很高。

重载机制好像有多态性的表现,但是重载绝对不是多态,他只是一种语言特性,不属于面向对象编程,因此与多态无关,与面向对象也无关。

真正和多态性有关的是覆盖机制。只有当子类重新定义了父类的同名方法后,父类的对象引用才可以格局赋给他的不同子类对象的引用,带太调用属于子类的该方法,从而使得方法的嗲用和方法本身只能在程序运行期间被动态绑定。因此,如果它不是后绑定,它就不是多态。
极化码(Polar Code)是由土耳其科学家Erdal Arıkan在2009年提出的一种新型纠错编码技术。它通过利用信道的极化现象,将虚拟信道分为误码率接近0和接近1/2的两类。在编码设计中,数据被放置在误码率极低的信道上,从而实现高效的数据传输。极化码的主要优势在于其理论编码容量能够达到香农限,并且构造方法较为简单。 MATLAB是一种功能强大的数学计算和编程工具,广泛应用于科学研究和工程领域。在极化码的研究中,MATLAB可用于构建编码和解码算法,模拟数据在不同信道条件下的传输效果,验证理论性能,并优化相关参数。 SC(Successive Cancellation,逐位取消)译码是极化码的基本解码方法。它从最可靠的比特开始,依次解码每个虚拟信道,且每个比特的解码结果会影响后续比特的解码,因为它们之间存在依赖关系。虽然SC译码的实现较为简单,但其计算复杂度较高,随着码长的增加,解码时间会线性增长。 SCL(Successive Cancellation List,逐位取消列表)译码是SC译码的改进版本。它通过引入列表机制,同时处理多个路径,从而增强了错误校正能力,并在一定程度上降低了错误率。与SC译码相比,SCL译码虽然需要消耗更多的计算资源,但能够提供更好的性能。 一个完整的MATLAB仿真资源通常包含以下内容: 编码模块:用于实现极化码的生成,包括码字构造和极化矩阵操作等。 信道模型:用于模拟各种通信信道,例如AWGN(加性高斯白噪声)信道或衰落信道。 SC/SCL译码模块:包含SC译码和SCL译码的算法实现。 误码率(BER)计算:通过比较发送和接收的码字,计算误码率,以评估编码性能。 性能曲线绘制:绘制误码率与信噪比(SNR)之间的关系曲线,展示不同译码策略的性能差异。 使用说明:指导用户如何运行仿真,理解代码结构,以及如何调整参数以进行自定义实验。 代码注
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值