看了关于thinking in java的书籍对于多态写一下自己的理解
一.多态时成员变量的特点:
1.不管是静态成员变量,非静态成员变量以及final成员变量都不具备多态性
2.简单理解:即编译时看父类型所对应的类是否有该变量如果有编译通过,如果没有编译失败;运行时变量值取自父类型对应的变量的值;一般来成员变量都为私有,只能在本类中修改成员的值
package net.oschina.tkj.chapter8.extend; /** * 父类 * @author Freedom * */ public class ParentClass { public int field = 1; private static int fieldStatic= 1; public final int fieldFinal = 1; public ParentClass(){ System.out.println("parent constructor test domain begin..."); System.out.println("parent field:"+field+" parent fieldStatic:"+fieldStatic+ " parent final field:"+fieldFinal); System.out.println("parent constructor test domain end..."); } } package net.oschina.tkj.chapter8.extend; /** * 子类 * @author Freedom * */ public class SonClass extends ParentClass { public int field = 5; private static int fieldStatic = 5; public SonClass(int field){ System.out.println("son field:"+field);// 就近原则取了参数的值 System.out.println("son field init:"+this.field);// 创建对象时,显示初始化在默认初始化之后,在构造器对参数初始化之前 System.out.println("son constructor test domain begin..."); System.out.println("son field:"+field+" parent fieldStatic:"+fieldStatic+" son final field:"+fieldFinal); System.out.println("son constructor test domain end..."); } }
3.变量赋值的时机
3.1 静态成员变量(类变量):随着类的加载而加载,同时为变量赋值;
3.2成员变量以及final类型的成员:随着对象的创建而存在,首先进行默认初始化赋值,如:基本数据类型int默认值为0,引用类型变量默认值为null;接着在调用父类默认空参构造器之后,进行变量的显示初始化,最后是构造器的特殊初始化
二.多态时成员函数特点
1.静态成员函数:对于静态成员函数来说不具备多态性,不能被子类重写
简言之,在多态时调用静态函数,编译时期看父类型对应的类中是否有该函数,如果没有编译失败,运行时执行的也是父类型对应类中的静态函数
如:下列所示
package net.oschina.tkj.chapter8.extend; /** * 父类 * @author Freedom * */ public class ParentClass { public static void method(){ System.out.println("parent method() run."); } } package net.oschina.tkj.chapter8.extend; /** * 子类 * @author Freedom * */ public class SonClass extends ParentClass { // 子类不能重写父类的静态方法,所以该方法为子类自己的方法 public static void method(){ System.out.println("son method() run."); } }
运行结果:
2.非静态函数
如下例子:
package net.oschina.tkj.chapter8.extend; /** * 父类 * @author Freedom * */ public class ParentClass { /* * 父类中该方法为私有 */ private void f(){ System.out.println("parent f()"); } public static void main(String[] args) { ParentClass clazz = new SonClass(7); clazz.f(); } } package net.oschina.tkj.chapter8.extend; /** * 子类 * @author Freedom * */ public class SonClass extends ParentClass { /* * 子类中创建一个与父类名一样的方法,只是访问权限为public */ public void f(){ System.out.println("parent f()"); } }
运行结果:
因为父类中f()为私有方法,因此在父类执行main函数
上述情况,因为父类的方法为私有,相当于给父类方法加了final,子类无法继承该方法。因此,子类中相同名称的方法,就是一个新的方法(实际开发不建议父类方法名与子类方法名相同阅读性较差)。
因此,多态的前提条件:①类之间需要继承②重写父类的方法(父类的私有方法,静态方法以及final关键字修饰的方法不能被重写)
2.1 满足多态前提时调用一般函数,编译时看父类型对应的类中是否有该方法,如果没有编译错误;运行时,调用子类中的重写的方法
相关推荐
### Java多态详解 #### 什么是多态? 多态(Polymorphism)是面向对象编程的一个核心特性,指的是一个接口可以被多个类所实现或一个类可以被多个类所继承,进而表现出不同的行为。在Java中,多态主要体现在两个...
C#继承和多态的应用
5.7 本章小结 本章主要讲解了 Java 语言程序设计中接口和多态的概念、语法和应用。接口是一种抽象机制,提供了一种定义类之间的“协议”的方式,允许类之间实现多继承,同时免除 C++ 中的多继承那样的复杂性。多态...
#### 小结 通过学习多态的基本概念、抽象类和抽象方法的使用、以及多态的实际应用,我们可以更好地理解和利用面向对象编程中的多态特性。多态不仅提高了代码的灵活性和可维护性,还使得代码更加易于扩展和重用。在...
#### 四、小结 - **接口**:定义了一组方法签名,由其他类实现具体的方法体。 - **继承**:支持代码复用,子类可以继承父类的属性和方法,并可以扩展或覆盖父类的功能。 - **多态**:允许父类引用指向子类对象,...
#### 小结 - **继承与多态是Java面向对象编程的核心概念**。正确理解并运用这些概念可以帮助开发者写出更高质量、更易于维护的代码。 - **注意**:虽然继承和多态非常有用,但在实际项目中应当适度使用,过度依赖...
### 小结 上转型对象在Java中体现了多态性的强大功能,它是面向对象编程的一个重要方面。通过合理地利用多态性,可以编写出更加灵活、可扩展的代码。此外,遵循面向对象设计原则并适当使用设计模式,可以帮助开发者...
**5.7 本章小结** 接口和多态是Java面向对象编程的核心概念,它们提供了灵活的设计和实现策略,使得代码更加模块化,易于维护和扩展。通过理解和掌握这些概念,开发者可以编写出更加高效、可读性强的Java程序。
下面是对"Java中类的继承学习小结"的详细讲解。 首先,类的继承使用关键字`extends`来实现。子类(也称为派生类)声明时,会指定一个父类(或超类): ```java public class DerivedClass extends BaseClass { //...
在C++编程语言中,多态(Polymorphism)是一个非常关键的概念,它允许我们使用一个接口来表示多种类型的数据,极大地增强了代码的灵活性和可扩展性。下面将详细阐述多态的各个方面。 1. 概念: 多态是指一个接口...
5.7 本章小结 本章通过详细的讲解和示例,帮助学习者理解接口的定义、作用、语法,以及如何实现接口和利用多态进行程序设计。通过这些内容的学习,读者可以掌握Java中面向对象的重要特性,为后续的JDBC、Servlet、...
6.5 小结 多态性是C++面向对象编程的重要特性,通过虚函数、纯虚函数和抽象类,开发者可以创建灵活的代码结构,实现更高效的设计。理解并熟练掌握多态性,能够帮助编写出更加模块化、可扩展的软件。
1.7小结 第2章 数据抽象 2.1声明与定义 2.2一个袖珍C库 2.3放在一起:项目创建工具 2.4什么是非正常 2.5基本对象 2.6什么是对象 2.7抽象数据类型 2.8对象细节 2.9头文件形式 2.10嵌套结构 2.11小结 2.12练习 第3章 ...
【标题】:“北大自考高级语言上机小结”揭示了在北大自学考试中,针对高级编程语言(如C++、Java或Python等)的上机实践环节的重要性。这一小结可能涵盖了考试中的核心概念、编程技巧以及解决问题的策略。 【描述...
### 小结 通过继承机制,可以有效地重用代码并构建具有层次结构的类体系。而通过虚函数和纯虚函数的使用,能够实现真正的多态性,即同一接口可以在不同类中有不同的实现,提高了代码的灵活性和可扩展性。这些特性都...
这个“java课程小结.rar_北京理工大学JAVA课程”压缩包中包含的“课程小结”文件,很可能是教授精心编写的教学精华,旨在帮助学生巩固所学知识并为后续学习打下坚实基础。 在Java课程中,有几个核心概念和技术是必...
1.2.2 开端小结 1.2.3 今天的Oracle 1.3 Oracle8服务器 1.3.1 为什么Oracle拥有今天的地位 1.3.2 Oracle7/8服务器的组件 1.4 SQL*Plus—友好的用户接口 1.5 Oracle Forms—前端产品 1.6 Oracle Reports—报表生成器 ...
1.2.2 开端小结 1.2.3 今天的Oracle 1.3 Oracle8服务器 1.3.1 为什么Oracle拥有今天的地位 1.3.2 Oracle7/8服务器的组件 1.4 SQL*Plus—友好的用户接口 1.5 Oracle Forms—前端产品 1.6 Oracle Reports—报表生成器 ...
这与MFC的运行时多态形成了鲜明对比,运行时多态依赖虚函数表,在运行时确定对象的实际类型,而编译时多态则在编译阶段就决定了类型信息,从而避免了运行时的动态分派开销,提高了程序的执行效率。 #### 类层次结构...