java中类的多态性
面向对象编程有三个特征,即封装、继承和多态。
封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据。
继承是为了重用父类代码,同时为实现多态性作准备。那么什么是多态呢?
方法的重写、重载与动态连接构成多态性。
要理解多态性,首先要知道什么是“向上转型”。
我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。我可以通过
Cat c = new Cat();
实例化一个Cat的对象,这个不难理解。但当我这样定义时:
Animal a = new Cat();
这代表什么意思呢?
很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,
定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。
所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;
同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;
对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。
看下面这段程序:
class Father{
public void func1(){
func2();
}
//这是父类中的func2()方法,因为下面的子类中重写了该方法
//所以在父类类型的引用中调用时,这个方法将不再有效
//取而代之的是将调用子类中重写的func2()方法
public void func2(){
System.out.println("AAA");
}
}
class Child extends Father{
//func1(int i)是对func1()方法的一个重载
//由于在父类中没有定义这个方法,所以它不能被父类类型的引用调用
//所以在下面的main方法中child.func1(68)是不对的
public void func1(int i){
System.out.println("BBB");
}
//func2()重写了父类Father中的func2()方法
//如果父类类型的引用中调用了func2()方法,那么必然是子类中重写的这个方法
public void func2(){
System.out.println("CCC");
}
}
public class PolymorphismTest {
public static void main(String[] args) {
Father child = new Child();
child.func1();//打印结果将会是什么?
}
}
上面的程序是个很典型的多态的例子。子类Child继承了父类Father,并重载了父类的func1()方法,重写了父类的func2()方法。重载后的func1(int i)和func1()不再是同一个方法,由于父类中没有func1(int i),那么,父类类型的引用child就不能调用func1(int i)方法。而子类重写了func2()方法,那么父类类型的引用child在调用该方法时将会调用子类中重写的func2()。
那么该程序将会打印出什么样的结果呢?
很显然,应该是“CCC”。
对于多态,可以总结它为:
一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。
转载: http://blog.sina.com.cn/s/blog_65c6abb60100mdhe.html
分享到:
相关推荐
多态性是Java中实现动态绑定的基础,它允许我们使用父类型的引用指向子类型对象,从而实现更加灵活的设计。面试官可能会询问抽象类和接口的区别,方法的重写和重载,以及如何利用多态优化代码。 日期和时间的处理是...
编译时的多态性(方法重载)和运行时的多态性(方法重写)是其实现方式,后者是面向对象的核心特性,需要通过子类方法重写和对象造型来实现。 2. **访问修饰符的区别**: - **public**:公共访问,可以在任何地方...
同时,接口也是Java中实现多态性的重要方式。 3. **异常处理**:Java的异常处理机制是通过try-catch-finally语句块来实现的。理解如何正确抛出和捕获异常,以及何时使用特定类型的异常,对于编写健壮的代码至关重要...
- **多态性**:多态性使得不同的对象能够对相同的消息作出反应。这提供了灵活性,使得代码能够处理多种类型的对象,而不必知道具体类型。 2. **数据类型的区别** - **基本数据类型**:如byte、int、char、long等...
4. **多态性**:多态性允许不同类的对象对同一消息作出响应,这是通过方法重载和方法覆盖实现的。多态性增强了代码的灵活性和可扩展性,使得编写通用和可重用的代码成为可能。 #### Java中的String与StringBuffer ...
阐述了Java中的方法重载(Overloading)和方法覆盖(Overriding)概念,以及运行时类型识别(多态性)在面向对象编程中的作用。 10. **SSL與數位認證.txt**: SSL(Secure Sockets Layer)和数字认证是网络安全的...
2. **类与对象**:Java是面向对象的语言,学习如何创建类、对象,理解封装、继承和多态性是核心内容。习题可能涉及类的构造器、成员变量、方法,以及类之间的关系。 3. **数组与集合**:了解如何声明、初始化和操作...
类的核心特性包括封装性、继承性和多态性。类的封装性提供了公有、缺省、保护、私有的多级访问权限,目的是隐藏类中的私有变量和类中方法的实现细节。继承性提供了从已存在的类创建新类的机制,继承使一个新类自动...
类可以实现一个或多个接口,强制其提供接口中定义的所有方法的实现,用于实现跨类的多态性。 6. **异常处理** C#支持异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误,确保程序的健壮性。 7. *...