金沙贵宾会官网|金沙贵宾会登录-官网

【A】金沙贵宾会官网超高的返奖率为娱乐者提供资金保障,所以金沙贵宾会登录官网更加的方便了你的娱乐,申请88元彩金,因为在当中不仅仅只有游戏。

非静态块,动手动脑以及课后实验性问题

日期:2019-11-04编辑作者:网络安全

Java基础 静态块、非静态块、构造函数的执行顺序,java构造函数

Java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的static,都是最先初始化好的。结构如下: 
static { 
静态语句代码块 


非静态语句代码块 

异同点 
相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。 
不同点:静态代码块在非静态代码块之前执行(静态代码块-->非静态代码块-->构造函数)。 
静态代码块只在第一次new(或者只要访问了就)执行一次,之后不在执行,而非静态代码块在每new一次都会执行一次,跟构造函数一样。非静态代码块可以在普通方法中定义(个人感觉作用不大);而静态代码块不行。 

Java代码  

public class TestStatic {
    static {
        System.out.println("基类 Static 静态语句块");
    }

    public TestStatic() {
        System.out.println("基类  默认无参构造器");
    }

    {
        System.out.println("基类 非静态语句块");
    }

    public static void Iint() {
        System.out.println("基类 Static Iint");
    }
}


public class User extends TestStatic {

    private static final long serialVersionUID = 1L;
    public final double i = Math.random();// 每次得到的结果不一样
    private final static int finalID;
    private static int finalID2;
    private int finalID3;

    static  {
         System.out.println("派生类 Static 静态语句块"); 
        finalID=1000;
    }

    {
        System.out.println("派生类  非静态语句块");  
        finalID2+=1;
        finalID3+=1;
    }

    /** full constructor */
    public User() {
        System.out.println("派生类  默认无参构造器");  

    }
    public static void IintTest() {
        System.out.println("派生类 Static Iint");
    }
}

测试语句1 

public static void main(String[] args) {  
        TestStatic.Iint();//User.Iint();
    }  

输出结果如下:

基类 Static 静态语句块
派生类 Static 静态语句块
基类 Static Iint

测试说明了静态代码块不管怎么样都会被执行,调用基类的静态方法,派生类的静态语句块也都执行了,调用这个User.Iint(); 也是一样的结果 。

测试语句2 

public static void main(String[] args) {  
        TestStatic.Iint();//User.Iint();
         User.IintTest();
    }  

输出结果如下:

基类 Static 静态语句块
派生类 Static 静态语句块
基类 Static Iint
派生类 Static Iint

测试说明了 静态语句块执行一次,只是调用了派生类的静态方法被执行了

测试语句3

public static void main(String[] args) {         

TestStatic.Iint();//User.Iint();
User.IintTest();
System.out.println(User.finalID);
TestStatic user = new User();

    }  

执行结果如下:

基类 Static 静态语句块
派生类 Static 静态语句块
基类 Static Iint
派生类 Static Iint
1000
基类 非静态语句块
基类 默认无参构造器
派生类 非静态语句块
派生类 默认无参构造器

测试说明了 非静态代码块在每new一次都会执行一次,跟构造函数一样的次数

测试语句4

public static void main(String[] args) {  

TestStatic.Iint();//User.Iint();
User.IintTest();
System.out.println(User.finalID);
TestStatic user = new User();

System.out.println();
System.out.println("第二次初始化派生类");
User user2 = new User();

System.out.println();
System.out.println("第三次次初始化基类");
TestStatic user3 = new TestStatic ();

}

执行结果如下:

基类 Static 静态语句块
派生类 Static 静态语句块
基类 Static Iint
派生类 Static Iint
1000
基类 非静态语句块
基类 默认无参构造器
派生类 非静态语句块
派生类 默认无参构造器

第二次初始化派生类
基类 非静态语句块
基类 默认无参构造器
派生类 非静态语句块
派生类 默认无参构造器

第三次次初始化基类
基类 非静态语句块
基类 默认无参构造器

测试说明了静态代码块在非静态代码块之前执行(静态代码块-->非静态代码块-->构造函数)。 
静态代码块只在第一次new(或者只要访问了就)执行一次,之后不在执行,而非静态代码块在每new一次都会执行一次,跟构造函数一样.

小结: 
1、静态代码块是在类加载时自动执行的,非静态代码块在创建对象自动执行的代码,不创建对象不执行该类的非静态代码块。 顺序: 静态代码块--》非静态代码块--》类构造函数。 
2、在静态方法里面只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。因为对于非静态的方法和变量,需要先创建类的实例对象后方可使用,而静态方法在使用前不用创建任何对象。 
3、如果某些代码必须要在项目启动时候就执行的时候,我们可以采用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,

    在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,此时代码是被动执行的。 
区别:静态代码块是自动执行的; 
静态方法是被调用的时候才执行的; 
作用:静态代码块可以用来初始化一些项目最常用的变量和对象;静态方法可以用作不创建对象也可以能需要执行的代码。

静态块、非静态块、构造函数的执行顺序,java构造函数 Java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还...

一:

1、源代码

//MAO2015.10.6

//foo

class Foo

{

    int value;

    public Foo(int initValue)

    {

        value = initValue;

    }

}

public class Test2

{

    public static void main(String[] args)

    {

        Foo obj1 = new Foo(2);

    }

}

2、截图

图片 1

3、总结

如果一个类提供自定义的构造方法,导致系统不再提供默认构造方法。

 

二:

 

1、源代码

//mao2015.10.16

//初始化

class InitializeBlockClass

{

    {

        field = 200;

    }

    public int field = 100;

    public InitializeBlockClass(int value)

    {

        this.field = value;

    }

    public InitializeBlockClass()

    {

       

    }

}

public class Test3 {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        InitializeBlockClass obj = new  InitializeBlockClass();

        System.out.println(obj.field);

        obj = new InitializeBlockClass(300);

        System.out.println(obj.field);

    }

}

2、结果截图

图片 2

3、总结Java字段初始化规律

首先执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。其次,执行类的构造函数

类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。

三:

1、  源码

//mao2015.10.17

//静态初始化块的执行顺序

 

class Root

{

    Static

{

        System.out.println("Root的静态初始化块");

    }

    {

        System.out.println("Root的普通初始化块");

    }

    public Root()

    {

        System.out.println("Root的无参数的构造器");

    }

}

class Mid extends Root

{

    Static

{

        System.out.println("Mid的静态初始化块");

    }

    {

        System.out.println("Mid的普通初始化块");

    }

    public Mid()

    {

        System.out.println("Mid的无参数的构造器");

    }

    public Mid(String msg)

    {

        //通过this调用同一类中重载的构造器

        this();

        System.out.println("Mid的带参数构造器,其参数值:" + msg);

    }

}

class Leaf extends Mid

{

    Static

{

        System.out.println("Leaf的静态初始化块");

    }

    {

        System.out.println("Leaf的普通初始化块");

    }  

    public Leaf()

    {

        //通过super调用父类中有一个字符串参数的构造器

        super("Java初始化顺序演示");

        System.out.println("执行Leaf的构造器");

    }

 

}

 

public class TestStaticInitializeBlock

{

    public static void main(String[] args)

    {

        new Leaf();

    }

}

 

2、结果

图片 3

3、总结出“静态初始化块的执行顺序”

静态初始化块只执行一次。创建子类型的对象时,也会导致父类型的静态初始化块的执行。

 

四:

静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?

请编写代码验证你的想法。

1、源码

//mao2015.10.17

//调用

class Use

{

    static int a = 1;

    int b = 2;

}

public class TestStatics {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        System.out.println(Use.a);

        //System.out.println(Use.b);报错

        Use use = new Use();

        System.out.println(use.b);

    }

}

2、结果

图片 4

3、  结论

System.out.println(Use.a);

    //System.out.println(Use.b);报错

 

 

五:

使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。

1、源码

//mao2015.10.17

//跟踪某个类所创建对象的个数

class Count

{

    static int i = 0;

    public Count()

    {

        i++;

    }

    void getI()

    {

        System.out.println("已创建 "+i+"个");

    }

}

public class TestCount {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        Count count = new Count();

        count.getI();

    }

 

}

2、结果

图片 5

3、  总结

每创建一次,就会使用一次构造函数,所以用构造函数来计数。

本文由金沙贵宾会官网发布于网络安全,转载请注明出处:非静态块,动手动脑以及课后实验性问题

关键词:

如何配置

总结 本篇教程解释了fail2ban监狱如何工作以及如何使用内置的监狱来保护Apache服务器。依赖于你的环境以及要保护的...

详细>>

Ambiance风格主题

该固件可以应用到Ubuntu 11.04 Unity环境或Unity 2D桌面。 安装Kubuntu Unity sudo add-apt-repository ppa:unity-2d-team/unity-2d-daily sudo ...

详细>>

Multipath实现LUN设备名称的持久化,光纤网卡PCI

(1)以太网卡:学名EthernetAdapter,传输协议为IP协议,一般通过光纤线缆或双绞线与以太网交换机连接。接口类型分为光...

详细>>

KVM安装配置CentOS7开机网卡自动变为eth0,KVM虚拟机

VNCSERVERARGS[2]="-geometry 800x600 -nolisten tcp -localhost" [root@localhost ~]# brctl show 2、通过vnc客商端连接到就要安装的设想机 Ub...

详细>>