再次认识Java中构造器的初始化与继承

class Insect
{
    private int i = 9;
    protected static int j;
    Insect()
    {
        Print.print("i = " + i + ",j = " + j);
        j = 39;
    }

    private static int x1 = printInit("static Insect.x1 初始化");

    static int printInit(String s)
    {
        Print.print(s);
        return 47;
    }
}

public class Beetle extends Insect
{
    private int k = printInit("Beetle.k 初始化");

    public Beetle()
    {
        Print.print("k = " + k);
        Print.print("j = " + j);
    }

    private static int x2 = printInit("static Beetle.x2 初始化");

    public static void main(String[] args)
    {
        Print.print("Beetle constructor");
        Beetle a= new Beetle();
    }
}/* 输出
static Insect.x1 初始化static Beetle.x2 初始化Beetle constructori = 9,j = 0Beetle.k 初始化k = 47j = 39i = 9,j = 39
    *///:~

在Beetle上运行Java时,所发生的第一件事情就是试图访问Beetle.main(),在对其加载的过程中编译器发现它有一个基类,则基类首先被加载,接下来,基类中的static初始化即会被执行,所以output中的第一个语句static Insect.x1 初始化产生;下面Beetle类开始执行与基类相同的步骤,所以static Beetle.x2 初始化得到输出。至此为止,必要的类都已加载完毕,对象就可以被创建了。创建对象a时,调用构造器,而构造器和static代码段中的代码在执行的过程中是顺序执行的,所以会输出i = 9,j = 0

加载完成后就开始执行main函数了第一个被执行的语句是Print.print("Beetle constructor");所以output中产生了Beetle constructor。

在基类的构造器被调用之前,对象中所有的基本类型都会被设为默认值,对象引用被设为null-这是通过将对象内存设为二进制零值而一举生成的。然后,基类的构造器会被调用。在本例中,它是被自动调用的,基类构造器和导出类的构造器一样,以相同的顺序来经历相同的过程。在基类构造器完成之后,实例变量按其次序被初始化。所以有k = 47,j = 39输出。

时间: 2024-08-08 01:28:07

再次认识Java中构造器的初始化与继承的相关文章

java中的静态初始化块

Java 中可以通过初始化块进行数据赋值.如: 在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块.如果使用 static 修饰初始化块,就称为静态初始化块. 需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量. 我们来看一段代码: 运行结果: 通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法.由于静态初始化块只在类加载时执行一次,所以当再次创建对

java中 构造器与void

在java中,构造器与void都没有返回值, java编程思想中这么解释构造器的: 构建器属于一种较特殊的方法类型,因为它没有返回值.这与 void 返回值存在着明显的区别.对于void 返回值,尽管方法本身不会自动返回什么,但仍然可以让它返回另一些东西.构建器则不同,它不仅什么也不会自动返回,而且根本不能有任何选择.若存在一个返回值,而且假设我们可以自行选择返回内容,那么编译器多少要知道如何对那个返回值作什么样的处理. 自己运行的例子: public class SimpleConstruct

Java中数组的初始化方式

Java中数组的初始化方式    初始化方式有两种: 1.静态初始化:初始化时由程序猿显式指定每一个数组元素的初始值,由系统指定数组长度 2.动态初始化:初始化时由程序猿仅仅指定数组长度,由系统为数组元素分配初始值

java中对象的初始化过程

class Parent{ int num = 8;// ->3 Parent(){ //super(); // ->2 //显示初始化 // ->3 //构造代码段 // ->4 show(); // ->5 } {// ->4 System.out.println("Parent constructor code run->"); } public void show(){//被覆盖 System.out.println("num

java中的显示初始化和特定初始化

public class Test{ public static void main(String[] args){ Child child = new Child(); } } class Parent{ public Parent(){ super(); show();//this.show(); 因为是Child类对象调用了super()来构造其父类的部分;所以父类中的this(随着其构造方法入栈的)是指向Child类对象的!所以调用的就是Child类对象的show方法! return ;

谈谈java中静态变量与静态方法继承的问题

谈谈java中静态变量与静态方法继承的问题 学习的中如果遇到不明白或者不清楚的的时候,就是自己做些测试,自己去试试,这次我就做一个关于静态变量的继承和静态方法继承问题的测试. 首先我先建一个父类: 这样我在建一个子类: 这些都准备好以后,我对子类创建对象,然后用  类名.静态变量/静态方法  和  对象名.静态方法/静态变量  对他们输出的结果进行测试. 这样输出种类有: 这样我输出的结果是: 这样来总结一下: 1. 通过类名来调用子类中的静态变量和静态方法,当父类与子类相同时是,子类会隐藏父类

谈谈java中成员变量与成员方法继承的问题

谈谈java中成员变量与成员方法继承的问题 关于成员变量和成员方法的的继承问题,我也可以做一个小测试,来看看结果. 首先我们先创建一个父类: 其次再创建一个子类,子类中要比父类中少一个成员方法: 这样我们对子类创建对象,如果不创建对象,我们是无法访问子类的成员变量和成员方法的,因为“无法从静态上下文中引用非静态方法”.我们要输出有: 从以上的数据中,我们就可以得出的输出结果是 这样我们就可以得出结论. 总结: 1.   在结果中可以看出,子类的成员变量和成员方法,与其父类的相同的时候,子类就会覆

java中对象的初始化问题

最近又把java编程思想看了看.又有些收获.此书确实不错 java中的初始化相信很多人都知道.但是具体的初始化步骤,初始化几次确不一定.上代码 public class A{ public static A a = new A(); public static int i; public static int j= 2; public A(){ i++; j++; } public static void main(String[] args){ A a1= new A(); System.ou

java中构造器(Constructor)

构造器是一个创建对象时被自动调用的特殊方法,为的是初始化.构造器的名称应与类的名称一致. 当创建一个个对象时,系统会该对象的属性默认初始化,基本类型属性的值为0(数值类型),false(布尔类型),把所有的引用类型设置为null. 构造器可以改变这种默认的初始化. 构造器的作用:是创建Java对象的重要途径,是不是说构造器完全负责创建java对象? 答:是创建java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回了该类的对象,但这个对象并不是完全由构造器负责创建的. 首先要注意的