版权声明:尊重原创,码字不易,转载需博主同意。 https://blog.csdn.net/qq_34626097/article/details/83352293
java 类的成员之四 初始化代码块(代码块)的使用
1.java类的成员有四个
- 属性
属性的赋值顺序:
1.默认的初始化
2.显示的初始化或非静态初始化代码块(此处两结构按顺序执行)
3.构造器
4.通过对象的方法来对相应的属性进行修改 - 方法
- 构造器
- 代码块(这里重点讲代码块,其余可以参考我的其他博客)
代码块如果有修饰的话,只能用static
2.非static(非静态)代码块(初始化块)的使用
- 可以有输出语句
- 可以类的属性、类的声明进行初始化操作
- 可以调用静态的方法或者变量
- 若有多个非静态代码块,执行顺序为从上到下的顺序依次执行
- 每次创建对象的时候,都会执行依次
- 先于构造器执行
- dome
public class TestOrder {
public static void main(String[] args) {
Order o1 = new Order();
System.out.println(o1);//Order [orderId=10, orderName=AA]
System.out.println("==============");
Order o2= new Order();
System.out.println(o2);
}
}
class Order{
private String orderName = "BB";//和代码块按顺序执行
/*非静态代码块
* 格式:
* {
* 作用范围
* }
*/
{
orderId = 10;//初始化
orderName = "AA";//初始化
System.out.println("我是非静态代码块1");
}
private int orderId;
{
orderId = 665;//初始化
orderName = "AA";//初始化
System.out.println("我是非静态代码块2");
}
private int orderId = 55;//代码块按顺序执行
public Order() {
super();
System.out.println("我是order类无参构造器");
}
public Order(int orderId, String orderName) {
super();
this.orderId = orderId;
this.orderName = orderName;
}
@Override
public String toString() {
return "Order [orderId=" + orderId + ", orderName=" + orderName + "]";
}
}
- 输出结果为:
3.static(静态)代码块(初始化块)的使用
- 可以有输出语句
- 可以对类的属性、类的声明进行初始化操作
- 不可以对非静态属性进行初始化。即:不可以调用非静态的属性和方法
- 若有多个静态代码块,那么执行顺序为从上到下的顺序依次执行
- 静态代码块的执行要先于非静态代码块
- 静态代码块只执行一次
- demo
public class TestOrder {
public static void main(String[] args) {
Order o1 = new Order();
System.out.println(o1);//Order [orderId=10, orderName=AA]
System.out.println("==============");
Order o2= new Order();
System.out.println(o2);
}
}
class Order{
private String orderName = "BB";//和代码块按顺序执行
private static String orderDesc;
//非静态代码块
{
orderId = 10;//初始化
orderName = "AA";//初始化
System.out.println("我是非静态代码块1");
orderDesc = "我被非静态调了";
show2();
}
//静态代码块
static{
orderDesc = "我是一个Order";
// orderId = "11";
// show1();
show2();
System.out.println("静态代码块2");
}
//静态代码块
static{
System.out.println("静态代码块1");
}
public Order() {
super();
System.out.println("我是order类无参构造器");
}
private int orderId = 55;//代码块按顺序执行
public Order(int orderId, String orderName) {
super();
this.orderId = orderId;
this.orderName = orderName;
}
public void show1() {
}
public static void show2() {
}
}
- 执行结果
4.java初始化块面试题
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("尚硅谷");
System.out.println("执行Leaf的构造器");
}
}
public class TestLeaf{
public static void main(String[] args){
new Leaf();
System.out.println();
new Leaf();
}
}
输出结果为:具体分析可见上文