泉州住房和城乡建设局网站,crm系统视频,wordpress get term,网页设计软件dw下载多态继承、封装、多态、抽象是面向对象编程的四大基本特征。封装隐藏了类的内部实现机制#xff0c;从而可以在不影响使用者的前提条件下#xff0c;改变类的内部结构#xff0c;同时保护了数据。继承是为了重用父类代码#xff0c;同时为多态做准备。那么#xff0c;什么…多态继承、封装、多态、抽象是面向对象编程的四大基本特征。封装隐藏了类的内部实现机制从而可以在不影响使用者的前提条件下改变类的内部结构同时保护了数据。继承是为了重用父类代码同时为多态做准备。那么什么是多态呢所谓多态英文单词为polymorphism这个英文单词是由单词poly(意思是很多或多个)和morph(意思是形状或形式)组成的复合词。多态一词最早出现在生物学是指生物学的一个基本原则一个生物或物种可以有多种不同的形式或阶段。面向对象编程吸收了这一原则在OOP中多态是指一个对象有多种形式的能力。一个类的子类可以定义它们唯一的行为同时共享父类的某些相同特征。多态可以说是面向对象编程的精髓所在。因此理解多态的含义对理解面向对象编程有特别重要的意义。Java之所以引入多态的概念原因之一是它在类的继承问题上和C不同。C允许多继承这确实给它带来了非常强大的功能但是复杂的继承关系也给C开发者带来了更大的麻烦。为了规避风险Java只允许单继承子类与父类间有IS-A的关系。这样做虽然保证了继承关系的简单明了但是势必在功能上有很大的限制。所以Java引入了多态性的概念以弥补这点的不足。此外我们在本节后面要学到的抽象类和接口也是解决单继承规定限制的重要手段。在Java中多态有两种理解方式第一种是对象的不同的方法可以用相同的一个方法名也就是重载的概念。 另一种是同一对象根据不同的消息执行相应的行为也可以这样认为发送消息给某一个对象让对象自行选择哪种相应的行为。根据这种两种方式所以多态可以分为静态多态和动态多态。静态多态指的是程序在编译时系统就能决定调用哪个方法所以也称为编译时多态。在Java中静态多态实现的方式就是方法重载其调用规则是依据对象在定义时的类型相应地调用对应类中的重载方法。动态多态指在运行中系统才能动态确定方法所指的对象所以也称为运行时多态。动态多态的实现方式是重写父类中的同名成员方法其调用规则是依据对象在实例化时而非定义时的类型相应地调用对应类中的同名成员方法。也就是说动态多态主要通过动态绑定和重写的机制来实现。多态技术基础在Java中使用动态绑定和重写机制来实现多态我们首先需要掌握如下三个基础技术概念向上转型技术一个父类的引用变量可以指向不同的子类对象或者说一个子对象可以被当作一个父类类型。instanceof关键字instanceof关键字用于判断运行时对象的真正类型。可以规避掉“强制向下转型过程中”可能会出现的转型风险。动态绑定技术运行时根据父类引用变量所指对象的实际类型执行相应的子类方法从而实现多态性。1)向上转型和向下转型在基础数据类型中我们已经看到了表达式中数值数据类型byte、short、int、long、float和double的相互转换规则即当从低精度数据类型向高精度数据类型转换时实行自动转换这种类型转换技术称为向上转型当从高精度数据类型向低精度数据类型转换时需要使用强制类型转换符这种类型转换技术称为向下转型。对于引用数据类型这种转换技术依然适用。在父类和子类的继承层次关系中沿着子类向父类向上转型是自动转换而从父类向子类必须使用强制类型转换才能实现向下转型。例如Employee e new Salary(王二, 胜利大道24号, 47, 250000.00);这里Salary是Employee的子类那么我们为什么要用一个父类类型的引用去指向一个子类的对象呢为什么不直接用一个子类类型的引用呢这样做到底有什么意义呢这是因为子类是对父类的一个改进和扩充所以一般子类在功能上较父类更强大属性较父类更独特。定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能又可以抽取父类的共性从而可以使代码更容易编写更容易维护。既然父类类型的引用没有改变什么那么为什么不总是用它呢如果我们使用Employee类型的引用来指向一个Salary对象对象不会丢失数据但是用父类类型的引用则不能直接访问Salary类的成员变量和方法的。如果要用父类类型的引用访问子类的成员变量和方法我们就必须将Employee类型的引用强制转换为Salary类型的引用。如Salary salary (Salary)e;注引用数据类型向下强制转换是有风险的不一定能够转型成功如果要转型成功必须同时满足以下两个要求必须是父类引用指向一个子类的实现强制转换类型必须跟这个子类实现具体的类型一致不能是父类其他子类的类型使用instanceof关键字判断对象的真正类型Java语言的多态机制导致了引用变量的声明类型和实际引用对象的类型可能不一致。为更准确鉴别一个对象的真正类型Java语言引入了instanceof运算符。使用instanceof的语句如下引用 instanceof 类名如果引用是指定的类类型那么instanceof运算符返回true否则返回false。动态绑定技术我们首先要理解Java中的动态绑定机制。在面向对象程序开发中我们将一个方法调用与该方法所在的类关联起来称为绑定。绑定分静态绑定和动态绑定或者称为前期绑定和后期绑定。所谓静态绑定是指在程序执行前方法已经被绑定此时由编译器或其它连接程序实现。针对Java简单的可以理解为程序编译期的绑定这里特别说明一点Java中的方法只有final、static、private和构造器是前期绑定。所谓动态绑定是指在运行时根据具体对象的类型进行绑定。Java中所有的普通方法都采用动态绑定技术。通过动态绑定JVM必须沿着继承层次树向下找判断一个方法是否被重写。如果方法被重写了在运行时就执行子类中的方法而不是编译时调用的父类方法。多态的主要应用1)多态参数所谓多态参数就是当方法的某个形式参数是一个引用的时候与该引用兼容的任何对象都可以传递给方法从而允许方法接受不同数据类型的形式参数。例如如下的方法有一个Employee类型的形式参数public void payEmployee(Employee e)如果要调用payEmployee()方法我们需要用一个Employee对象作为实际参数。如果Salary和Hourly继承自Employee类那么Salary或Hourly对象也可以作为实际参数传给payEmployee()方法。因为通过多态Salary或Hourly对象也是一个Employee对象。现在通过将Employee类型的引用作为形式参数使payEmployee()成为了一个更通用的方法。现在它可以接受Employee、Hourly、Salary对象作为实际参数。如果出现了一个继承自Employee类的新类那么这个新类也可以传递给payEmplyee()。2)异构集合多态最常见的应用是创建一个不是同一类型但是有共同父类的数据集合。不同对象的集合称为异构集合。例如所有的类都继承object如果写一个数组为object类型数组那么就可以装任何的类型对象。多态总结从以上示例我们可以看出父类类型的引用可以调用父类中定义的所有属性和方法而对于子类中定义而父类中没有的方法它是无可奈何的同时父类中的一个方法只有在父类中定义而在子类中没有重写的情况下才可以被父类类型的引用调用对于父类中定义的方法如果子类中重写了该方法那么父类类型的引用将会调用子类中的这个方法这就是动态绑定。也就是说在多态机制中是由被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法。但是这个被调用的方法必须是在父类中定义过的也就是说被子类重写的方法 。因此对于多态我们可以总结它为使用父类类型的引用指向子类的对象。该引用只能调用父类中定义的方法不能调用子类中独有的方法。如果子类中重写了父类中的一个方法那么在调用这个方法的时候将会调用子类中的这个方法。在多态中子类可以调用父类中的所有方法。在Java中所有普通方法默认都是动态绑定要避免动态绑定默认行为的唯一方法是将方法声明为final。声明为final的方法不能被重写所以JVM不需要沿着继承层次树向下寻找并试图判断子类是否重写该方法。基于此原因final方法可以提升性能因为避免了动态绑定的开销。抽象我们在编写类时通常会在类中定义一些方法用来描述该类所具有的行为。在类的方法体中我们编写代码实现该类所要执行的行为。在继承关系中子类继承父类后子类也就具有父类所具备的行为。如果子类继承了父类的行为但是与父类的行为实现方式不同就需要通过方法重写来覆盖父类的行为。如果我们不需要类的实例时就可以将类设计成为一个抽象类。所谓抽象类是不能被实例化的类。在抽象类中类的所有其它功能都存在成员变量、方法、构造器都可以用同样的方式访问。我们只是不能创建抽象类的实例。抽象类在Java中使用关键字abstract可以声明一个抽象类该关键字可以出现在类声明时class关键字前的任何地方。我们注意到类除了声明为abstract外其它的没有改变。现在我们不能实例化一个抽象的对象。但是对于它的子类没有任何影响。抽象方法在父类中有的行为我们不需要去具体实现因为我们永远不会调用它但是它又是子类必须有的我们只需要在子类中去对方法进行重写进行具体的实现。这种情况下我们就可以用抽象方法了。如果我们想一个类包含一个特定的方法该方法的实际实现由子类决定那么我们就可以在父类中将该方法声明为抽象方法。抽象方法只有方法签名没有方法体。代码清单展示了声明为抽象的computePay()方法。注意该方法没有定义部分并且方法签名后跟一个分号没有大括号。/*代码清单 Employee.java这里computePay()方法被声明为抽象方法在类中没有实现*/public abstract class Employee{private String name;private String address;private int number;public abstract double computePay();//类定义的剩余部分}将一个方法声明为抽象方法有两个结果类也必须声明为抽象类。如果一个类包含了抽象方法那么该类也必须是抽象的。任何子类必须重写抽象方法除非子类本身也是抽象的。从设计的角度看将一个抽象方法放在父类中可以强制任何子类实现一个特别的行为。继承抽象方法的子类必须重写该方法。如果子类不重写抽象方法那么子类必须是抽象类子类的子类必须重写该方法。最终必须有一个后代类实现抽象方法否则我们就有一个不能实例化的抽象类层次。那么为什么要使用方法抽象呢这是因为强制其它类实现某个行为有好处。使用抽象类类和抽象方法的好处用抽象类及接口最重要的用处还是在于使代码实现很方便的扩展最简单的就是在new对象时将生成对象定义为接口在以后需要替换时就很方便。抽象类及接口并不只是为了抽象为了接口面抽象而接口。在你需要用到一系列可继承自抽象类的子类或是需要实现共同接口的多个实现类时才需要考虑。其实抽象类的一个好处是类不能被实例化最大的好处就是通过方法的覆盖来实现多态的属性。也就是运行期绑定。用抽象的型别统一类型来进行操作有利于以后的扩展移植复用