java 动态初始块_java初始化与动态绑定

初始化顺序:

1、静态成员初始化;

先是父类中的静态成员初始化(包括静态域值和静态语句块,按照声明顺序初始化),再是子类成员初始化。这里会一直追溯到最顶层的基类哈。

静态成员的初始化发生在类被加载时,这时不一定调用了构造器。当程序试图访问某一个类时,就会加载此类。

2、非静态成员的初始化;

3、调用构造函数。

注意2和3的顺序为,父类的非静态成员的初始化---->父类构造器----->子类的非静态成员的初始化----->子类构造器。

示例如下:

public class Father {

private static int fa_static1 = printInit("static value in father!");

private int fa_instance1 = printInit("instance value in father!");

static

{

printInit("static block in father!");

}

private static int fa_static2 = printInit("another static value in father!");

{

printInit("common block in father!");

}

private int fa_instance2 = printInit("another instance value in father!");

public Father(){

System.out.println("default father constructor!");

}

public Father(int i){

System.out.println("father constructor with parameter i = " + i);

}

protected static int printInit(String s){

System.out.println(s);

return 1;

}

}

public class Son extends Father{

private static int son_static1 = printInit("static value in son!");

private int son_instance1 = printInit("instance value in son!");

static

{

printInit("static block in son!");

}

private static int son_static2 = printInit("another static value in son!");

{

printInit("common block in son!");

}

private int son_instance2 = printInit("another instance value in son!");

public Son(){

System.out.println("default son constructor!");

}

public Son(int i){

super(i);

System.out.println("son constructor with parameter i = " + i);

}

public static void main(String[] args) {

System.out.println("------test1-----------");

Father.printInit("java");

System.out.println("------test2-----------");

Son s1 = new Son();

System.out.println("------test3-----------");

Son s2 = new Son(2);

}

}

static value in father!

static block in father!

another static value in father!

static value in son!

static block in son!

another static value in son!

------test1-----------

java

------test2-----------

instance value in father!

common block in father!

another instance value in father!

default father constructor!

instance value in son!

common block in son!

another instance value in son!

default son constructor!

------test3-----------

instance value in father!

common block in father!

another instance value in father!

father constructor with parameter i = 2

instance value in son!

common block in son!

another instance value in son!

son constructor with parameter i = 2

解析:

test1:运行Son.java文件,找到函数入口main,这就是试图访问Son的静态函数,需要加载Son类,加载的时候初始化静态量。在加载过程中得到父类Father,所以要先初始化父类的静态量。等两个类的静态量初始化完成后,开始运行main方法,才输出test1.

通过输出结果知:静态成员变量和静态语句块的初始化顺序与声明顺序相同。

test2:无参构造器会自动调用父类的构造器。实例初始化的过程中先初始化成员变量,再调用构造器。

静态绑定与动态绑定:

概念:

绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定。

若程序在执行前进行绑定,由编译器和链接程序实现,叫做前期绑定。C语言中只有一种方法调用,就是前期绑定。

在运行时根据对象的类型进行绑定,叫做后期绑定,也叫动态绑定或运行时绑定。

Java中除了static方法和final方法(private方法被自动认为是final方法)之外,其他所有的方法都是后期绑定。

后期绑定是java中实现的多态的基础。

动态绑定的过程:虚拟机提取对象的实际类型的方法表;虚拟机搜索方法签名;调用方法。

【注意】绑定只是针对方法而言,对于域值没有作用,声明的是什么类,就用什么域值。同时,只有父类和子类同时都有的方法,才能动态绑定。

public class Father {

protected String name="父亲属性";

public String getName(){

return name;

}

}

public class Son extends Father{

protected String name="儿子属性";

protected String sonName = "只属于儿子的属性";

public String getSonName() {

return sonName;

}

public String getName(){

return name;

}

public static void main(String[] args) {

Father fa = new Son();

System.out.println("成员调用:" + fa.name);

//动态绑定只是针对方法而言,属性还是父亲的属性

System.out.println("方法调用:" + fa.getName());

//System.out.println("成员调用:" + fa.sonName); //不能调用

//不能调用,father中没有此方法。

//System.out.println("方法调用:" + fa.getSonName());

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
适配器初始化绑定布局文件的步骤如下: 1. 创建一个继承自适配器类(如 ArrayAdapter、BaseAdapter 等)的自定义适配器类。 2. 在构造方法中传入所需的参数,通常包括上下文对象和数据集合。 3. 在自定义适配器类中重写 getView 方法,在该方法中实现对每个列表项的视图进行绑定操作。 4. 在 getView 方法中,通过 LayoutInflater 的 inflate 方法将布局文件转换成对应的视图对象。 5. 使用视图对象中的 findViewById 方法获取布局文件中的各个控件,并进行相应的数据绑定操作。 6. 返回已经绑定好数据的视图对象。 以下是一个简单的示例代码: ```java public class MyAdapter extends ArrayAdapter<String> { private Context mContext; private List<String> mDataList; public MyAdapter(Context context, List<String> dataList) { super(context, R.layout.item_layout, dataList); mContext = context; mDataList = dataList; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = LayoutInflater.from(mContext); convertView = inflater.inflate(R.layout.item_layout, parent, false); } TextView textView = convertView.findViewById(R.id.text_view); String data = mDataList.get(position); textView.setText(data); return convertView; } } ``` 在上述示例中,自定义适配器类 MyAdapter 继承自 ArrayAdapter,并在构造方法中传入了上下文对象和数据集合。在 getView 方法中,通过 LayoutInflater 将布局文件 item_layout 转换成视图对象 convertView,然后通过 findViewById 获取其中的 TextView 控件,并将数据绑定到该控件上。最后返回已经绑定好数据的视图对象 convertView。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值