温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java中怎么实现初始化

发布时间:2021-07-01 17:16:07 来源:亿速云 阅读:91 作者:Leah 栏目:编程语言

Java中怎么实现初始化,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1、静态块优先

程序首先会执行静态块的内容,这也就有了不写main方法就跑hello world的小故事,相信说到这里,大家就有了思路。我们都知道静态类型是和类绑定的而不是和具体实例对象绑定。也就是说,引用一个静态变量的方式往往是MyClass.xxx.这个特点决定了其在编译的阶段就已经分配好了固定的空间。

2、父类优先

由于继承的特性,当导出类(子类)的对象被创建的时候,程序将向上追溯到最初的父类,执行其初始化的操作。然后一次向下调用子类的构造函数。按照这个思路,那么每一个实例***个要初始化的必定是Object类了。

3、成员变量优先

一定要注意,成员变量按照其声明的顺序会被初始化,并且立刻被初始化为二进制的0,这个动作发生在所有事件之前,也就是编译器会立刻将分配给对象的空间初始化。一会的小例子将证明这一点。

***就是调用类的构造方法了。

下面有一个不错的例子,为了演示成员变量最早被初始化为0了,我们将在父类的构造函数中调用子类的方法(利用了多态)。

package fruit;      import vege.Inner;         /**    * @author Octobershiner    */  public class Fruit {       //static block       static {           System.out.println("In Fruit static");       }              private Inner i = new Inner(); //a private member       public Fruit(){           System.out.println("Before Fruit Constructor");           show();  //由于多态的特性,此处子类Apple覆写的方法会被调用           System.out.println("After Fruit Constructor");       }       public void show(){           System.out.println("show:Fruit.");       }              public static void main(String[] args) {           // TODO code application logic here           new Apple(3);       }             }

现在父类中须要初始化的有

  • 静态块

  • 一个Inner类私有成员

  • 构造函数

现在我们看子类的代码

package fruit;      public class Apple extends Fruit{      //静态块       static{           System.out.println("In Apple static");       }       private int weight = 1; //初始化为1 注意区别这里和 初始化为0              public Apple(int para_weight){           System.out.println("Before Apple Constructer: weight = "+weight);           weight = para_weight;           System.out.println("Apple Constructor: weight="+weight);       }              @Override      public void show(){           System.out.println("show apple: weight =" + weight);       }          }

子类须要初始化的有

  • 静态块

  • 私有成员weight

  • 构造函数

那么当我们运行的时候会有怎样的结果呢?猜想。。。。。

下面就是执行的结果:

Java中怎么实现初始化

Look! 首先执行父类的静态块,之后是子类的静态块,这两个应该没有什么问题。接下来就是对父类成员变量的初始化了。首先是父类的私有成员Inner对象,打印了一条“ Inner Constructor”。

接下来就是父类的构造函数,可见由于java的多态性,Fruit的构造方法调用了其子类Apple的show方法,并且我们可以清晰的看到,此刻Apple类中weight变量的值是0!说明,类的成员变量无论是否赋值,在各种初始化之前早已被设置为二进制0了。

于是乎我想起了很多关于java的书都在说。。“如果类的私有变量没有赋值,就会被设置为0”。。这句话显然把时间弄混了。。。应该是编译器早已初始化了私有变量,均为0,之后才会执行到赋值语句。

父类的构造函数结束之后,再次回到子类,初始化私有变量(也就是我们常说的赋值语句,因为初始为0的工作早做完了)。所以我们才会看到“Before Apple Constructor weight = 1”,执行完构造函数后,我们就看到了weight终于变成了我们创建对象是传进的3了,呼,初始化结束。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI