10. JavaSE-子类实例化过程 & 构造方法间调用

子类的实例化过程:

子类中所有的构造函数默认都会访问父类中空参数的构造函数。

class Parent

{

Parent(){

System.out.println("parent class run");

}

}

class Children extends Parent

{

Children(){

//super();//调用的就是父类空参数的构造函数

System.out.println("children class run");

//return;

/*说明:此处被注释掉的super和return都是默认就有的语句。*/

}

}

class  DemoChildren

{

public static void main(String[] args)

{

System.out.println("Hello World!");

}

}

为什么子类实例化的时候要访问父类构造函数?

因为子类继承父类,获取到了父类中内容(属性),所以在使用父类内容之前,要先看父类是如

何对自己的内容进行初始化的。所以子类在构造对象时,必须访问父类中的构造函数。为了完成

这个必须得动作,就在子类的构造函数中加入super()语句。如果父类中没有定义空参数的构造函

数,那么子类的构造函数必须用super明确调用父类中的哪个构造函数。同时子类构造函数中如果

使用this调用了本类构造函数时,那么super就没有了,因为super和this都只能定义在第一行,所以

只能有一个,但是可以保证的是,子类中肯定会有其他的构造函数访问父类的构造方法。

注意:super语句必须要定义在子类构造函数的第一行,因为父类的初始化动作要先完成。

Java中,所有的类都是Object的子类。Object是最顶层的类,也就是Java中的God。

一个对象的实例化过程:

1. JVM读取指定路径下的.class文件,并加载进内存,并会先加载父类(如果有直接父类的情况下)

2. 在堆内存中开辟空间,分配地址

3. 并在对象空间中,对对象中的属性进行默认初始化

4. 调用对应的构造函数进行初始化

5. 在构造函数中,第一行会先调用父类中的构造函数进行初始化

6. 父类初始化完毕后,在对子类的属性进行显示初始化

7. 在进行子类构造函数的特定初始化

8. 初始化完毕后,将地址赋值给引用变量

注意:通过super初始化父类内容时,子类的成员变量并未显式初始化,等super()父类初始化完

毕后,才进行子类的成员变量显示初始化。

构造函数之间互相调用:

类中构造函数之间可以相互调用。

class Parent

{

Parent(){

System.out.println("parent class run");

}

}

class Children extends Parent

{

Children(){

this(20);

System.out.println("children class run");

}

Children(int age){

System.out.println("This boy age is "+age);

}

}

class  DemoChildren

{

public static void main(String[] args)

{

new Children();

// System.out.println("Hello World!");

}

}

10. JavaSE-子类实例化过程 & 构造方法间调用

时间: 2024-08-25 10:19:39

10. JavaSE-子类实例化过程 & 构造方法间调用的相关文章

java4android (继承中的子类实例化过程)

生成子类的过程 见代码: class Person { String name; int age; Person(){ System.out.print("Person的无参数构造函数"); } Person(String name,int age){ this.name = name; this.age = age; System.out.print("Person的有2个参数的构造函数"); } void eat(){ System.out.print(&quo

面向对象(子父类中构造函数的特点-子类实例化过程)

/* 3,子父类中的构造函数. 在对子类对象进行初始化时,父类的构造函数也会运行, 那是因为子类的构造函数默认第一行有一条隐式的语句 super(); super():会访问父类中空参数的构造函数.而且子类中所有的构造函数默认第一行都是super(); 为什么子类一定要访问父类中的构造函数. 因为父类中的数据子类可以直接获取.所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的.//指在在父类构造函数初始化 所以子类在对象初始化时,要先访问一下父类中的构造函数. 如果要访问父类中指定

11.子类实例化过程

生成子类的过程 子类继承了父类的成员变量,但却无法继承父类的构造函数 当生成子类对象的时候,一定会调用父类的构造函数 如果子类当中没有调用构造函数,编译器会自动添加super(),用于调用父类当中的无参数构造函数 使用super调用父类构造函数的方法 在子类要调用父类函数的话,super()一定要是构造函数的第一条语句 classPerson{ String name; int age; int grade; Person(){ System.out.println("Person的无参数构造函

子类实例化过程

先看代码 class Person{ int age; String name; Person(){ System.out.println("Person的无参数构造函数"); } Person(int age,String name){ this.age = age; this.name = name; System.out.println("Person的有参数构造函数"); } void eat(){ System.out.println("吃饭&q

【好程序员训练营】----子类实例化函数复写对象转型

android培训------我的java笔记,期待与您交流! 一.子类实例化过程 public class Student extends Person{ /* * 继承父类成员和函数,不能继承构造函数 * 在子类构造函数中,须调用父类的构造函数 */ Student(){ super();//用于调用父类构造函数:若写则在第一条语句,若不写,编译器自动添加:可以调用父类有参构造函数super(..,..); System.out.println("student无参数构造函数");

二、Java面向对象(8)_继承思想——子类初始化过程

2018-05-01 子类初始化过程 构造器的调用遵循以下的顺序: (1):调用基类构造器.这个步骤会不断地反复递归下去,首先是构造这种层次结构的根,然后是下一层导出类,等等,直到最低层的导出类. (2):按声明顺序调用成员的初始化方法. .(3):调用导出类构造器的主体.(也就是文中的main方法中的内容) 这样做的最终目的:让方法中的所有成员变量都得到初始化. 创建子类对象之前会先创建父类对象 调用子类构造器之前,在子类构造器之前会先调用父类的构造器,默认调用的是无参构造器 如果父类不存在可

子类如果不实例化则不会调用它自身的静态构造函数

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication6 { class Program { static void Main(string[] args) { #region 如果注释掉, 则Stat2.Instance为null 报错 Stat1.DoSth(); Stat2 st2 = new Stat2(); #en

子类实例化,父类构造器中被调用被子类重写的方法,会执行父类还是子类的呢?

public class Test001 { public static void main(String[] args) { new Child(); } }class Father{ private String name = "f"; public Father(){ tell(); } public void tell(){ System.out.println("father "+this.name); }}class Child extends Fath

Java中不要在父类的构造方法中调用会被子类重写的方法

在Java中,不要在父类的构造函数中调用会被子类重写的方法,否则运行时会遇到意想不到的错误.看一个例子就会明白: import java.util.*; class Animal { public Animal() { eat(); } protected void eat() { System.out.println("Eat something"); } } public class Bird extends Animal { public Bird() { } @Override