一、继承体系中的初始化顺序
当我们使用new创建一个对象的时候,这个对象会在类的继承体系中按以下顺序执行初始化:
- 初始化父类的静态变量和静态代码块,按它们在代码中定义的顺序执行(先定义先执行);
- 初始化子类的静态变量和静态代码块,按它们在代码中定义的顺序执行(先定义先执行);
- 初始化父类的实例变量和实例代码块,按它们在代码中定义的顺序执行(先定义先执行);
- 执行父类的构造方法;
- 初始化子类的实例变量和实例代码块,按它们在代码中定义的顺序执行(先定义先执行);
- 执行子类的构造方法。
当该类存在多层次的继承体系时,则按以上顺序递归地执行初始化。
/** * 父类 */ class SuperClass { //父类的静态代码块 static { System.out.println("Initalizing static block in SuperClass\n"); } //父类的实例代码块 { System.out.println("Initalizing instance block in SuperClass\n"); } //父类的静态变量 public static Var StaticSuperVar = new Var("static variable in SuperClass"); //父类的实例代变量 public Var superVar = new Var("variable in SuperClass"); //父类的构造方法 public SuperClass() { System.out.println("Initalizing SuperClass\n"); } } /** * 子类 */ class SubClass extends SuperClass { //子类的静态变量 public static Var StaticSubVar = new Var("static variable in SubClass"); //子类的实例变量 public Var subVar = new Var("variable in SubClass"); //子类的静态代码块 static { System.out.println("Initalizing static block in SubClass\n"); } //子类的实例代码块 { System.out.println("Initalizing instance block in SubClass\n"); } //子类的构造方法 public SubClass() { System.out.println("Initalizing SubClass\n"); } } /** * 辅助类 */ class Var { public Var(String name) { System.out.println("Initalizing " + name + "\n"); } } /** * 测试类 */ public class InitOrderTest { public static void main(String[] args) { SubClass subClass = new SubClass(); } }
运行结果:
Initalizing static block in SuperClass Initalizing static variable in SuperClass Initalizing static variable in SubClass Initalizing static block in SubClass Initalizing instance block in SuperClass Initalizing variable in SuperClass Initalizing SuperClass Initalizing variable in SubClass Initalizing instance block in SubClass Initalizing SubClass
二、多态中的属性
在Java中,只有方法调用是多态的,而属性访问是在编译器解析的。表面上看是子类重写了父类的某个属性,实际上是子类获得了两个同名的属性,使用父类引用访问的属性是父类的属性,而子类引用则默认访问子类的属性,要访问父类属性则必须显式用super。
class SuperClass { public int field = 0; public int getField() { return field; } } class SubClass extends SuperClass { public int field = 1; public int getField() { return field; } public int getSuperField() { return super.field; } } public class FieldTest { public static void main(String[] args) { SuperClass sup = new SubClass(); System.out.println("sup.field = " + sup.field + ", sup.getField() = " + sup.getField()); System.out.println(); SubClass sub = new SubClass(); System.out.println("sub.field = " + sub.field + ", sub.getField() = " + sub.getField()); System.out.println("sub.getSuperField() = " + sub.getSuperField()); } }
结果
sup.field = 0, sup.getField() = 1 sub.field = 1, sub.getField() = 1 sub.getSuperField() = 0
三、私有方法与静态方法
当子类拥有与父类的某个私有方法相同签名的方法时,表面上是子类重写了父类的私有方法,实际上因为私有方法是隐式设成final的,而且对子类是屏蔽的,所以这种情况下是子类定义了新的方法,而不存在重载。
class SuperClass { private void privateFunc(){ System.out.println("SuperClass"); } public static void main(String[] args) { SuperClass sup = new SubClass(); sup.privateFunc(); } } class SubClass extends SuperClass { private void privateFunc(){ System.out.println("SubClass"); } }
结果
SuperClass
静态方法也不具有多态性,因为静态方法是与类而不是对象相关联的。
class SuperClass { public static void func(){ System.out.println("SuperClass"); } } class SubClass extends SuperClass { public static void func(){ System.out.println("SubClass"); } } public class FieldTest { public static void main(String[] args) { SuperClass sup = new SubClass(); sup.func(); } }
结果:
SuperClass
四、方法签名冲突
当同时实现多个接口或者同时实现接口与继承某个父类时,如果在这些被实现的接口和被继承的父类中存在签名相同但返回类型不相同的方法时,会出现冲突并造成编译错误。
interface Interface{ public void func(); public void anotherFunc(); } interface AnotherInterface{ public int func(); } class SuperClass{ public int anotherFunc(){ return 0; } } class SubClass extends SuperClass implements Interface, AnotherInterface{ @Override public void func() { //方法编译错误: //‘func()' in 'SubClass' clashes with 'func()' in AnotherInterface; // attempting to use incompatible return type } @Override public void anotherFunc() { //方法编译错误: //‘anotherFunc()' in 'SubClass' clashes with 'anotherFunc()' in SuperClass; // attempting to use incompatible return type } }
五、变量冲突
与方法签名冲突类似,同名的属性(变量)也会出现冲突。
interface Interface { String FIELD = "Interface"; } class SuperClass { public String FIELD = "SuperClass"; } class SubClass extends SuperClass implements Interface { } public class FieldConflictTest { public static void main(String[] args) { SubClass cls = new SubClass(); //编译错误: //Reference to 'FIELD' is ambiguous, //both 'SuperClass.FIELD' and 'Interface.FIELD' match System.out.println(cls.FIELD); } }
相关推荐
多态性分为编译时多态和运行时多态,其中运行时多态是Java中最常见的形式,也称为动态绑定。在深入探讨Java中多态的内存分析之前,我们需要先理解一些基本概念。 首先,了解Java内存模型至关重要。Java程序运行时...
对 Java 中多态理解 Java 中的多态是指在不同的情况下可以有不同的行为,多态是面向对象编程的一种基本特征。多态的实现是通过方法重载和方法重写来实现的。 在 Java 中,多态可以分为两种:编译时多态和运行时...
java多态、继承练习题,包含题目与答案,............................................................................................................
java多态实现的课件,给那些需要的人 讲述了java多态的概念、分类、实现 综合案例讲解、总结多态的作用
"北大青鸟javaOOP多态Ch03作业全集.rar"这个压缩包文件很显然是针对学习者提供的一系列关于Java多态性的练习和案例,帮助学生深入理解并掌握这一核心技能。 多态性是面向对象三大特性之一,另外两个是封装和继承。...
### 深入Java核心:Java中多态的实现机制 多态性是面向对象编程中的一个重要概念,它使得程序代码具有高度的灵活性和可扩展性。本文将围绕Java中的多态实现机制展开讨论,包括多态的基本概念、实现原理以及具体的...
在Java编程语言中,多态性(Polymorphism)是面向对象编程的三大特性之一,另外两个是封装和继承。多态性允许我们使用一个接口来代表多种类型的对象,这使得代码更加灵活、可扩展且易于维护。在这个主题中,我们将...
Java多态的讲解
4. instanceof关键字:用于判断对象是否是某个类或其子类的实例,是多态中常用的一个条件判断。 总的来说,Java的多态性是实现面向对象设计的重要工具,它使代码更加灵活、可扩展,同时也提高了代码的复用性。理解...
在深入探讨Java中多态的实现机制之前,我们需要明确多态的概念及其在编程语言中...通过实践和对文档内容的深入挖掘,我们可以更好地掌握Java多态的实现机制,并在实际开发中有效地利用多态性来编写灵活、可扩展的代码。
### Java多态经典讲解 #### 一、理解Java多态 多态,作为面向对象编程的三大特性之一,是继抽象和继承之后的关键概念。它允许我们以统一的接口处理不同类型的对象,增强了代码的灵活性和可扩展性。在Java中,多态...
JAVA多态思维导图,便捷整理思路,多态的好处、多态的语法格式、多态中的两种类型转换:向上转型、向下转型
Java多态是面向对象编程中的一个核心概念,它允许我们以一种统一的方式处理不同类型的对象。在Java中,多态性主要体现在方法的重写(Override)和重载(Overload)。通过多态,我们可以编写出更加灵活、可扩展的代码...
Java中的多态是面向对象编程的关键特性之一,它允许一个接口或者抽象方法被多个不同的类实现,从而使得代码更加灵活且可扩展。多态的概念基于一个接口可以有多种不同的实现方式,增强了程序的多样性和适应性。 在...
本篇将深入探讨Java多态中的类型转换,包括向上转型(Upcasting)和向下转型(Downcasting),以及相关的注意事项。 1. **向上转型(Upcasting)** 向上转型是指将子类的对象引用赋值给父类的引用。在Java中,这是...
Java 多态是 Java 编程语言中的一种基本概念,它允许开发者定义一个接口,并且可以通过不同的类来实现该接口。多态性是 Java 面向对象编程的核心机制之一,它使得程序更加灵活、可维护和可扩展。 多态的体现 多态...
在Java编程语言中,多态(Polymorphism)是一种核心特性,它允许我们设计更加灵活、可扩展的代码。多态使得一个接口可以有多种不同的实现或者表现形式,也就是说,同一段代码可以处理不同类型的数据。这主要通过继承...
Java基础多态PPT教学课件.pptx
### C++和Java多态的区别 #### 一、概述 多态是面向对象编程语言中的一个核心特性,它允许程序员能够使用基类的指针或引用指向派生类的对象,并在运行时根据对象的实际类型来选择合适的方法进行调用。这一特性增强...