笔记10 | 学习整理静态static 和 终态final

地址

CSDN 地址:http://blog.csdn.net/xiangyong_1521/article/details/78106481

目录

  • 静态static

  • 终态final




一. 静态static

1.1 静态变量

静态变量指的是名称前加了static修饰符的变量,一般用于开放给外部直接使用的变量,这样可以通过“类名.变量名”来访问,就无需事先实例化类的对象。静态变量在运行时一般无需修改,如果在运行时修改了变量值,可能会得到非预期的结果。因为不管一个类被实例化多少次,该类的静态变量在内存中的地址是固定的,类似于全局变量,每一次实例化的对象,使用的静态变量仍然是程序初始化的那个变量。下面是一个多次修改并访问静态变量的代码例子,首先是包含静态变量的类:

 
 
  1. public class School {  

  2.    public static int number=0;  

  3. }

然后是引用静态变量的调用代码:

 
 
  1. public class StaticTest {  

  2.    public static void main(String[] arg) {  

  3.        for (int i=0; i<5; i++) {  

  4.            School school = new School();  

  5.            System.out.println("school.number="+school.number++);  

  6.        }  

  7.    }  

  8. }  

下面是打印出来的日志,可以看到多次实例化的对象,静态变量仿佛没有多次初始化,而是递增的:

 
 
  1. school.number=0  

  2. school.number=1  

  3. school.number=2  

  4. school.number=3  

  5. school.number=4  

1.2 静态方法

静态方法指的是名称前加了static修饰符的方法,一般用于开放给外部直接使用的方法,这样可以通过“类名.方法名”来访问,就无需事先实例化类的对象。使用静态方法有以下几点限制:1、静态方法中只能调用静态方法,不能调用非静态方法;2、静态方法中只能使用静态的类变量,不能使用非静态的类变量;3、静态方法中不能使用this和super,即使this后面跟的是静态类变量也不行;

1.3 静态类

静态类指的是名称前加了static修饰符的类,一般用于开放给外部使用的类中内部类,这样就可以通过“上级类的类名.内部类的类名”来访问。比如说AlertDialog类的内部类Builder,可通过AlertDialog.Builder来调用;再比如Build类的内部类VERSION,可通过Build.VERSION来调用。

1.4 静态代码块

静态代码块,是在类中独立于类成员的static语句块,它不在任何的方法体内,java在加载类时会执行这些静态的代码块。android中使用静态代码块,主要有以下场景:1、使用JNI接口的地方,需要事先调用System.loadLibrary来加在so动态库;2、对成员变量进行无条件初始化。对基本数据类型的变量,可在声明时直接赋值完成初始化;但对容器类的变量(如ArrayList、HashMap等等),无法在声明时直接赋值,只能通过静态代码块完成初始化;3、必须在类加载时就要初始化的其他方法;

下面是在JNI接口中使用静态代码块的代码例子:

 
 
  1. public static native String macFromJNI(String ip);  

  2. public static native String unimplementedMacFromJNI(String ip);  

  3. static {  

  4.    System.loadLibrary("mac_scan");  

  5. }


二. 终态final

final关键字表示该对象是最后状态,不能再被改变了。final可用来修饰变量、方法、类名,但常用的只有final变量,一般很少用final方法和final类。final变量用于不希望变量值变更的场合,防止变量值修改产生不可预料的结果,比如说上面静态变量多次修改、多次访问的情况。Android中用到final变量的场景主要有:1、类的标签。例如每个类都定义一个TAG标签表示该类的名称,这样记录日志时可以下列形式调用:

 
 
  1. Log.d(TAG, "...");  

2、类的常量。例如Color类中的BLACK、WHITE、RED、GREEN、BLUE等常量;3、匿名内部类的局部变量。因为匿名内部类在编译时是与方法平级的,所以不能调用方法的变量,只能调用类的变量。如果匿名内部类一定要调用方法的变量,那得声明该变量是final类型,即把该变量当作一个常量来用。匿名内部类的说明参见《Android开发笔记(八十六)几个特殊的类》

final变量的初始化有三种途径:1、在声明final变量时,就给它赋初始值;2、在类的构造函数中,给final变量赋值;3、在静态代码块中,给final变量赋值;

下面是在匿名内部类中使用final变量的代码例子:

 
 
  1. @Override  

  2. public void onClick(View v) {  

  3.    tv_expand.setText(isExpand?"查看全文":"收起关注");  

  4.    isExpand = !isExpand;  

  5.    tv_content.clearAnimation();  

  6.    final int deltaValue;  

  7.    final int startValue = tv_content.getHeight();  

  8.    int durationMillis = 300;  

  9.    if (isExpand) {  

  10.        deltaValue = tv_content.getLineHeight() * tv_content.getLineCount() - startValue;  

  11.    } else {  

  12.        deltaValue = tv_content.getLineHeight() * maxLine - startValue;  

  13.    }  

  14.    Animation animation = new Animation() {  

  15.        protected void applyTransformation(float interpolatedTime, Transformation t) {  

  16.            tv_content.setHeight((int) (startValue + deltaValue * interpolatedTime));  

  17.        }  

  18.    };  

  19.    animation.setDuration(durationMillis);  

  20.    tv_content.startAnimation(animation);  

  21. }


此节结束


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值