子类实例化过程

先看代码

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("吃饭");
      }
}
class Student extends Person{
      int grade;

      Student(){
           //super();   默认添加
           System.out.println("Student的无参数构造函数");
      }

      Student(int age,String name,int grade){
           //this.age = age; 与父类中的代码重复
           //this.name = name;
           super(age,name); //调用父类的构造函数
           this.grade = grade;
      }
}
class Test{
      public static void main(String args[]){
           Student s2 = new Student();
           Student s1 = new Student(18,"zhangsan",3);
      }
}

在子类的构造函数当中,必须调用父类的构造函数。如果子类构造函数里没有明确调用父类的构造函数,编译器会自动添加super();  根据括号内传入的参数来调用具体的父类构造函数(与this类似)。

为什么??

由于子类继承了父类中的成员变量和成员函数,但无法继承构造函数。在子类的构造函数中给父类的成员变量赋值时必然会产生重复代码,使用super关键字来调用父类中的构造函数解决此问题。

当使用super来调用父类中的构造函数时,这行代码必须是第一条语句。

时间: 2024-10-13 12:20:46

子类实例化过程的相关文章

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的无参数构造函

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

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

子类的实例化过程

1.生成子类的过程 定义两个类: 1.Person类 2.student类继承Person 子类不能继承父类的构造函数 定义一个主函数 在子类的构造函数当中,必须调用父类的构造函数 如果子类的构造函数里没有显示的调用父类的构造函数,编译器会自动加上super(); 为什么子类必须要调用父类的构造函数? 由于子类继承了父类当中的成员变量,但是子类不能继承父类的构造函数,所以在子类构造函数给成员变量赋值的时候必然会产生重复代码,所以可以通过调用父类的构造函数来给成员变量赋值 Super()必须要是构

java基础部分----3.继承、子类实例化、函数的复写

1.继承 java只支持单继承,一个子类只能继承一个父类.一个父类可以有多个子类 关键字:extends 减少重复代码 2.继承的语法特点 class Student extends Preson{ } 如果子类继承父类,同时子类在这个基础上添加自己的成员变量和成员函数 3.子类实例化 1.生成子类的过程 在子类的构造函数中,必须调用父类的构造函数(根据()传入的参数个数以及类型决定) lass Student extends Person{ int grade; Student(){ supe

一个对象的实例化过程【重点】

一.过程  Person p = new Person();  1,JVM会去读取指定路径下的Person.class文件,并加载进内存,    并会先加载Person的父类(如果有直接父类的情况下)  2,在堆内存中开辟空间,分配地址.  3,并在对象空间中,对对象中的属性进行默认初始化  4,调用对应的构造函数,进行初始化  5,在构造函数中,第一行会先调用父类中的构造函数进行初始化.  6,父类初始化完毕后,再对子类的属性,进行显示初始化.  7,指定构造函数的特定初始化  8,初始化完毕

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

子类的实例化过程: 子类中所有的构造函数默认都会访问父类中空参数的构造函数. class Parent { Parent(){ System.out.println("parent class run"); } } class Children extends Parent { Children(){ //super();//调用的就是父类空参数的构造函数 System.out.println("children class run"); //return; /*说

类加载过程(clinit()),对象实例化过程(init())

类加载过程: 1.类加载就是执行Java程序编译之后在字节码文件中生成的clinit()方法(称之为类构造器),clinit()方法由静态变量和静态代码块组成. 2.子类的加载首先需要先加载父类,如果父类为接口.则不会调用父类的clinit方法.一个类中可以没有clinit方法. 3.clinit方法中的执行顺序为:父类静态变量初始化,父类静态代码块,子类静态变量初始化,子类静态代码块. 4.clinit()方法只执行一次. 对象实例化过程: 1.对象实例化过程就是执行Java程序编译之后在字节