java 代码块 构造函数_Java中的构造函数、构造代码块、静态代码块

构造函数:

定义:一种用来在创建对象时初始化对象的一种特殊方法。

作用:用于在创建对象时,给对象初始化。

构造函数的特点:

1. 构造函数的函数名必须和类名完全相同,无返回值,也不能使用 void修饰;在java中普通函数可以和构造函数同名,但是必须带有返回值。

2. 构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的。

3. 构造函数可以重载,一个类中可以有多个构造函数,在创建对象时,系统可以根据传递参数的不同来自动调用对应参数的构造函数。

4. 当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作;但有时也不写构造函数,此时Java编译器会提供一个默认的构造函数,此默认构造函数是不带参数的;而一般的方法不存在这一特点。

5. 构造函数也可以被 private修饰。但要注意,由于Java允许在类中创建本类对象,所以如果A类的构造函数被私有化,则可以在A类中new一个A类的对象;但如果B类将无法通过new关键字来创建A类对象,此时A类需要提供一个public(或非私有化)的获取方法,创建并返回A类对象以供B类使用(单例设计模式就是用了这一特性)。

class B

{

//在B类中定义一个私有的构造函数

private B(){}

//在B类中提供一个获取B类对象方法

public static B getInstanceB()

{

B b = new B();

return b;

}

}

class A

{

//在A类中定义一个私有的构造函数

private A(){}

public static void main(String[] args)

{

A a = new A();//创建A类对象,系统自动调用A的构造函数

//B b = new B();//错误:此时无法通过 new 创建B类对象

B b = B.getInstanceB();

}

}

构造代码块:

作用:同样也是给对象初始化。对象一建立就被执行,而且优先于构造函数执行。

和构造函数的区别:构造代码块是给所有对象进行统一初始化的,而构造函数是给对应的对应对象初始化。

格式:

{

//构造代码块代码

}

静态代码块:

作用:用于给类初始化。

特点:随着类的加载而执行,只执行一次,并优先于主函数。

格式:

static

{

//静态代码块代码

}

总结:

静态代码块、构造代码块和构造函数的区别

静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次。

构造代码块:用于给对象初始化的。只要建立对象该部分就会被执行,且优先于构造函数。

构造函数:给对应对象初始化的,建立对象时,选择相应的构造函数初始化对象。

创建对象时,三者被加载执行顺序:静态代码块--->构造代码块--->构造函数

通过以下代码来说明问题

class Person

{

private String name = null;

private int age = 0;

private static String country="cn";

Person(String name,int age)

{//构造函数

this.name=name;

this.age=age;

System.out.println("我是构造函数");

}

static

{

System.out.println("我是Person类静态代码块");

}

{//构造代码块

System.out.println("我是构造代码块:"+name+"..."+age);

}

public void setName(String name)

{

this.name=name;

}

public void speak()

{

System.out.println(this.name+"..."+this.age);

}

public static void showCountry()

{//静态方法

System.out.println("country="+country);

}

}

class StaticDemo

{

static

{

System.out.println("我是StaticDemo类main() 前 的静态代码块");

}

public static void main(String[] args)

{

System.out.println("我是main()函数");

Person p=new Person("zhangsan",100);

p.setName("lisi");

p.speak();

Person.showCountry();

}

static

{

System.out.println("我是StaticDemo类main() 后 的静态代码块");

}

}

/*

执行结果如下:

我是StaticDemo类main() 前 的静态代码块

我是StaticDemo类main() 后 的静态代码块

我是main()函数

我是Person类静态代码块

我是构造代码块:null...0

我是构造函数

lisi...100

country=cn

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值