栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

java父类和子类的调用顺序

Java 更新时间:发布时间: 百科书网 趣学号

了解java类加载机制的时候,我们有时候会遇到一些谁先谁后的问题,我们当然不能一眼看出来 最直观的方法就是写代码跑一下

父类

package com.nwk;


public class Father {
    private String name;
    private int age;
    private nwk  s=new nwk("父亲");
    private static  String a = father();
    static {
        System.out.println("父类静态块");
    }
    public static String father()
    {
        System.out.println("父类静态变量");
        return "父类静态变量";
    }

    {
        System.out.println("父类非静态块");
    }
    public Father(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Father(){
        System.out.println("父类构造方法");
    }
    public void speak(){
        System.out.println("父亲");
    }

}

子类

package com.nwk;


public class Son extends Father {
    private String stuNo;
    private nwk  s=new nwk("儿子");
    static {
        System.out.println("子类静态块");
    }
    private static  String b = child();
    public static String child()
    {
        System.out.println("子类静态变量");
        return "子类静态变量";
    }

    public Son(String name, int age, String stuNo) {

        this.stuNo = stuNo;
    }
    public Son(String stuNo) {
        this.stuNo = stuNo;
    }
    public Son(){
        System.out.println("子类构造方法");
    }
    {
        System.out.println("子类非静态块");
    }
    @Override
    public void  speak(){
        System.out.println("儿子");
    }

}

public class nwk {
    private  String name;
    public nwk() {
        System.out.println("变量说明");
    }

    public nwk(String name) {
        this.name = name;
        System.out.println("变量"+name);
    }
}

测试类

package com.nwk;


public class Test {
    public static void main(String[] args) {
        Son son1=new Son();
        son1.speak();
        System.out.println("=================");
        Son son2=new Son();
    }
}

结果

把上面代码跑一遍你会发现

  1. 所有的静态变量,无论是父类还是子类只会被加载一次。
    其中 静态代码块,在类被加载的时候运行,因此只加载一次,且优先于其他变量,常用于运行一些项目启动时需要运行的代码,比如加载项目需要的系统资源等等。静态变量 所有该类的对象共同具有的属性。

  2. 静态变量的加载顺序与代码的书写顺序有关
    我们可以发现父类与子类的静态块与静态变量加载的顺序不一样,因为我们的书写顺序不同。

  3. 动态成员变量优先于代码块
    动态成员变量定义在每次实例化对象时在构造函数之前执行

  4. 代码块顺序优先于构造方法
    构造代码块(代码块),在创建对象的时候执行,且先于构造函数执行。目的也是用于初始化对象,关于和构造函数的不同,

  5. **如果一个类具有父类,在类加载的时候都是先加载父类的方法(**相当于构造了一个父类对象)

    1. 子类继承父类后,获取到父类的属性和方法,这些属性和方法在使用前必须先初始化,所以须先调用父类的构造器进行初始化。
      在子类构造器的第一行会隐式的调用 super();,即调用父类的构造器
    2. 如果父类中没有定义空参的构造器,则必须在子类的构造器的第一行显示的调用super(参数); ,以调用父类中构造器
      如果子类中构造器的第一行写了this();,则就隐式的super();会消失,因为super()和this()都只能在构造器的第一行定义
转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/275454.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号