`
tianya85
  • 浏览: 34613 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

父类与子类中调用顺序的剖析

 
阅读更多

任何一个类,在执行一个方法前必须要先安代码的顺序初始化所有的静态块,然后调用main函数,

在生成一个类对象的时候,父类对象必须先生成,没有父类哪有什么子类。

对于属性的调用来说,哪个类调用的就是哪个的属性。

对于方法来说

非静态方法,并且父类中有,子类中也有,对象是有子类生成的,那么这个时候,调用子类中的方法。

如果是静态方法,跟当前的类有关,哪个类就调用那个类的方法,不看是否覆盖.

class ParentClass {
	public static String s = "parent static field s";
	public String d = "parent field d";
	static {
		System.out.println(s);
	}
	public ParentClass() {
		System.out.println("ParentClass");
	}
	public void d() {
		System.out.println("parent method d");
	}
	public static void s() {
		System.out.println("parent static method s");
	}
}
class SonClass extends ParentClass {
	public static String s = "son static field s";
	public String d = "son field d";
	static {
		System.out.println(s);
	}
	public SonClass() {
		System.out.println("sonClass");
	}
	public void d() {
		System.out.println("son method d");
	}
	public static void s() {
		System.out.println("son static method s");
	}
}
public class DemoDynMethod {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 在调用main函数前要先初始化所有的静态块,所以=="我比main优先(程序的最后面)"先打印出来 然后是下面这句话
		System.out.println("我是main函数打印出来的My Test Demo!!!");
		// 在生成一个子类对象之前要先生成父类对象
		// 如果父类对象又有静态块(静态块包括静态属性)
		// 那么在调用任何方法前都要先初始化静态块。
		// 所以先打印父类静态块的内容 ================》parent static field s
		// 这个时候不是说要调用父类的构造函数,而是要看,子类里面是不是也有静态块,
		// 子类中有静态块,那么由于静态块的初始化要高于任何方法,所以要继续初始化子类的静态块
		// 此时打印的是=============》son static field s子类的静态块
		// 再往下就是调用父类的构造函数,调用子类的构造函数
		// 因此下面一句话有四句输出分别为:
		// parent static field s
		// son static field s
		// ParentClass
		// sonClass
		SonClass son = new SonClass();
		System.out.println("=============================");
		//对于属性来说,只跟当前的类有关,所以下面两个输出的全是子类的内容
		System.out.println("Son.s====》"+son.s);
		System.out.println("Son.d====》"+son.d);

		System.out.println("=============================");
		// 把子对象向上转型
		ParentClass parentSon = son;
		// 调用方法d,这是一个非静态的方法,而且子类覆盖了父类的方法,所以打印的是子类的方法==》son method d
		parentSon.d();
		System.out.println("********************************");
		// 调用静态方法s,这是个静态的方法,虽然父类覆盖了子类的方法,但是静态的只是跟随当前的类。
		// 所以打印的为父类的方法
		parentSon.s();
		System.out.println("¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥");

		//对于属性来说,只跟当前的类有关,所以下面两个输出的全是父类的内容
		System.out.println("parentSon.s====》"+parentSon.s);
		System.out.println("parentSon.d====》"+parentSon.d);
	}
	static {
		System.out.println("我比main优先");
	}
}

 再用一个例子加深大家的理解,大家可以复制到eclipse中运行试试看,继承是面向对象中非常重要的一个特征,希望可以帮到你们。

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		A1 a=new B1();
		B1 b=new B1();
		a.h();
		b.t();
	}
}
class A1{
	int k=6;
	static int j=7;
	public void t(){
		System.out.println("A1中的k="+k);
	}
	public static void h(){
		System.out.println("A1中的j="+j);
	}
	public A1(){
		System.out.println("这是A1中public!");
		t();
		System.out.println("这是A1中的构造方法中");
		h();	
		System.out.println("这是A1中构造方法后!");
	}
}
class B1 extends A1{
	int k=8;
	static int j=9;
	static{
		System.out.println("-----静态方法static开始-----");
		new A1().t();
		System.out.println("-----静态方法static结束-----");
	}
	public B1(){
		System.out.println("这是B1中public!");
		t();
		h();
		System.out.println("这是B1中构造方法!");
	}
	public void t(){
		System.out.println("B1中的k="+k);
	}
	public static void h(){
		System.out.println("B1中的j="+j);
	}	

}

 

1
2
分享到:
评论

相关推荐

    java中子类继承父类,程序运行顺序的深入分析

    在例子中,"=========构造方法======== "(父类构造方法)和"=========子类构造方法======== "(子类构造方法)的顺序体现了这一点。 4. **对象操作**:一旦对象创建完成,就可以调用对象的方法。在示例中,"ts....

    Java序列化中子类、父类构造函数问题实例分析

    本文主要介绍了Java序列化中子类、父类构造函数问题,结合实例形式分析了java父类与子类构造函数中序列化接口调用相关操作技巧与使用注意事项。 一、序列化接口的实现 在Java中,如果父类实现了序列化接口,那么其...

    EnumTest--构造顺序:父类、类成员变量、子类.zip

    标题"EnumTest--构造顺序:父类、类成员变量、子类"指的是枚举实例的构造过程,它遵循以下顺序: 1. **父类构造器**:首先,如果枚举类继承了其他类,那么会先调用父类的构造器。这是面向对象编程中的一个基本规则...

    详解 Java继承关系下的构造方法调用

    在Java中,构造方法的调用顺序是由继承关系决定的。具体来说,如果子类继承自父类,则子类的构造方法必须先调用父类的构造方法。只有当父类的构造方法被调用后,子类的构造方法才能被调用。这是因为,父类的构造方法...

    java中与继承有关的程序内存分析

    构造函数链的顺序是从最顶级的父类到子类,依次调用。 5. **方法区**:也称为 PermGen 或 Metaspace(在Java 8及以后版本),存储类的元数据,包括类的静态变量和方法信息。对于继承来说,父类的静态变量在子类中是...

    类继承的初始化顺序类,继承的初始化顺序

    本文详细介绍了类继承中的初始化顺序问题,包括初始化的基本概念、初始化过程中的关键步骤以及如何正确处理基类和子类之间的构造函数调用。理解这些概念对于编写高效、可维护的面向对象程序至关重要。希望通过对这些...

    类执行顺序小结.doc

    `),输出:“Parent带参数构造方法子类调用父类带参构造方法”,接着是`Child`类构造代码块和构造方法的输出。 通过这个过程,我们可以清晰地看到Java中类执行顺序的规则及其对程序结构的影响。

    构造函数借鉴.pdf

    6. 示例分析:在提供的示例中,当`base`类有两个构造函数(一个无参,一个带int参数),`derived`类也有两个对应的构造函数时,子类的构造函数会默认调用父类的无参构造函数。如果注释掉父类的无参构造函数,子类的...

    Java常见笔试、面试题目深度剖析,方法重写详解、静态代码块与构造方法执行顺序问题

    对于构造方法执行顺序,要能够分析和解释复杂的继承结构中对象初始化的过程。这些都是衡量开发者对Java面向对象特性理解程度的重要指标。 总之,掌握这些Java基础知识不仅可以帮助你在面试中脱颖而出,也能使你在...

    构造函数与静态块的执行顺序

    在探讨继承中子类与父类构造函数及静态块的执行顺序时,我们首先需要理解构造函数和静态块的基本概念及其在Java中的作用。构造函数主要用于初始化对象的状态,而静态块则是在类加载到内存中时执行的一段代码,通常...

    类初始化顺序示例讲解

    2. **继承关系中的初始化顺序**:在继承关系中,父类的成员变量与初始化块会在子类的对应部分之前执行。 3. **初始化块与成员变量初始化的顺序**:如果静态成员变量定义与静态初始化块同时存在,则先执行静态成员...

    extendsStudy.zip

    当你在一个子类中定义与父类同名的方法或变量时,`super`可以帮助你调用父类的版本。例如,子类可以使用`super()`来调用父类的构造方法,或者使用`super.someMethod()`来调用父类的方法。 2. **方法覆盖(Override...

    Java语言程序设计基础第十版第十一章课后复习题答案

    - **题目**: 下面的说法是真是假:当从子类调用构造方法时,它的父类的无参构造方法总是会被调用? - **答案**: 假,如果通过参数调用呢 - **解析**: 如果子类的构造函数中没有显式调用父类的构造函数,则默认会调用...

    super的应用

    在子类中,如果一个成员变量或方法与父类中的同名,我们可以通过`super`关键字明确地调用父类的成员。例如,如果子类中有一个变量`x`,而父类也有一个变量`x`,在子类中我们可以这样访问父类的`x`: ```java public...

    c#编写构造函数代码

    根据给定的信息,我们可以深入探讨C#中的构造函数与析构函数的概念,特别是关于它们的调用顺序以及如何实现继承中的构造。 ### C#中的构造函数 #### 构造函数的作用 构造函数是一种特殊的方法,用于初始化新创建的...

    “礼让”原则学习Java对象初始化顺序.pdf

    “礼让”原则是指在父类和子类的继承关系中,子类的实例化操作时,需要先调用父类的构造函数,然后再调用子类的构造函数。 三、Java 对象初始化顺序的实例分析 以下是一个示例代码,用于演示 Java 对象初始化顺序...

    Java中类的加载顺序执行结果

    在上面的示例代码中,我们可以看到父类和子类的加载顺序执行结果。首先,父类的静态方法 `parentStaticMethod2()` 被调用,然后父类的静态代码块被执行。接着,子类的静态代码块被执行。然后,父类的非静态变量被...

    python类继承与子类实例初始化用法分析

    - Python 不会自动调用基类的`__init__`方法,除非你在子类的`__init__`中显式地调用它。如果子类没有定义`__init__`方法,Python会默认调用首个基类的`__init__`方法。这意味着如果你有多个基类,只有一个`__init_...

    RPC调用msgpack序列化问题分析.docx

    3. 父类字段不能改变,因为父类改变等于在子类中间插入了一个字段。 如果违反上述规则,必须 RPC 客户端与服务器同时升级。 结论 通过本文,我们了解了 msgpack 序列化的优缺点,并了解了导致 RPC 调用序列化失败...

    java中类的初始化顺序

    ### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...

Global site tag (gtag.js) - Google Analytics