Java之静态绑定和动态绑定

概念

  • 程序绑定:绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来,Java中绑定分为绑定分为 静态绑定动态绑定
  • 动态绑定:在面向过程中又称为后期绑定,在程序运行期进行了绑定,根据实际情况有选择的进行绑定
  • 静态绑定:在面向过程中又称为前期绑定,在程序编译期进行了绑定,即在还没运行时,就已经加载到内存

    对比

  • 动态绑定
    • 又称为后期绑定
    • 发生在运行时期
    • 虚方法(可以被子类重写的方法)会根据运行时的对象进行动态绑定
    • 动态绑定使用对象信息来完成
    • 典型应用是方法的重写(Override)
  • 静态绑定
    • 又称为前期绑定
    • 发生在编译时期
    • 使用private或static或final修饰的变量或者方法(包括构造方法)
    • 静态绑定使用类信息来完成
    • 典型应用是方法重载(Overload)


Java重载匹配优先级

前情提要

Java面向对象的三个基本特征:继承、封装和多态;多态主要体现在重载和重写;

示例代码

无意间看到这样一个问题,为了方便直观,就用代码来描述问题,有这样一个类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class OverloadPriority {
public static void print(Object arg) {
System.out.println("parameter type = Object");
}
public static void print(int arg) {
System.out.println("parameter type = int");
}
public static void print(long arg) {
System.out.println("parameter type = long");
}
public static void print(double arg) {
System.out.println("parameter type = double");
}
public static void print(float arg) {
System.out.println("parameter type = float");
}
public static void print(char arg) {
System.out.println("parameter type = char");
}
public static void print(Character arg) {
System.out.println("parameter type = Character");
}
public static void print(char... arg) {
System.out.println("parameter type = char...");
}
public static void print(Serializable arg) {
System.out.println("parameter type = Serializable");
}
public static void print(Comparable<?> arg) {
System.out.println("parameter type = Comparable");
}
public static void main(String[] args) {
// int
print('g');
}
}



Android之Log混淆

作为Android开发工程师,项目开发的过程中,日志的打印是必不可少的,通过这些日志我们可以很好分析程序运行的状况与正确性,可以使用的日志输出有哪种形式呢?发布release版本应该怎么屏蔽掉这些日志呢?

日志形式

  • Java形式
    1
    System.out.println(" log for test ");

这个一般不提倡使用

  • Android Log
    1
    Log.d(TAG, " log for test ");

这个是Android标准的日志输出类:android.util.Log

TAG定义

关于TAG的命名简单说一下,基本上有以下几种形式:

  • 人名
    1
    Log.d("gogh" " log for test ");

与代码无关,无法定位日志的位置

  • 类名
    1
    2
    private static final String TAG = LogUtils.class.getSimpleName();
    Log.d(TAG, " log for test ");

经过混淆的类,类名会改变为a、b这种形式,相应的TAG值也会改变,同样无法定位相关代码域。



解决Android Studio中Terminal无法输入的问题

问题描述:

1
Windows系统下Android Studio中的Terminal无法获取焦点,不能输入文字。

问题原因:

这个是因为系统升级造成的不兼容问题,在Windows环境开发的朋友们估计早早的就升级Win10了吧,UI非
常的炫酷。然而AS中的Terminal使用的还是Windows中的cmd控制台,也就是位于
C:\Windows\System32\目录下的cmd.exe。Win10下的cmd相对于早期版本的cmd做了一些改进,导
致了这里描述的问题。



Android之简单实现ButterKnife中的injectView的方案

首先说这里面用的知识点,注解、反射。

Android中findViewById(int resId)接受一个int的id参数,即通过资源id就可以找到对应的View。通过注解(annotation),我们可以资源id声明在对应的field上面,通过Java的反射,遍历每个field,找到对应的id,就可以初始化这个field(即view)。

1、注解声明

1
2
3
4
5
6
7
8
9
// 表示用在字段上
@Target(ElementType.FIELD)
// 表示在生命周期是运行时
@Retention(RetentionPolicy.RUNTIME)
//注解类,实现findViewById功能
public @interface FindView {
int findViewByResId() default 0;
}


本站访问量   |   您是第 位.