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

地址

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

目录

  • 静态static
  • 终态final
  • 链接

一. 静态static

1.1 静态变量

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

public class School {  
    public static int number=0;  
}

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

public class StaticTest {  
    public static void main(String[] arg) {  
        for (int i=0; i<5; i++) {  
            School school = new School();  
            System.out.println("school.number="+school.number++);  
        }  
    }  
}

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

school.number=0  
school.number=1  
school.number=2  
school.number=3  
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接口中使用静态代码块的代码例子:

public static native String macFromJNI(String ip);  
public static native String unimplementedMacFromJNI(String ip);  
static {  
    System.loadLibrary("mac_scan");  
}

二. 终态final

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

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

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

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

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

@Override  
public void onClick(View v) {  
    tv_expand.setText(isExpand?"查看全文":"收起关注");  
    isExpand = !isExpand;  
    tv_content.clearAnimation();  
    final int deltaValue;  
    final int startValue = tv_content.getHeight();  
    int durationMillis = 300;  
    if (isExpand) {  
        deltaValue = tv_content.getLineHeight() * tv_content.getLineCount() - startValue;  
    } else {  
        deltaValue = tv_content.getLineHeight() * maxLine - startValue;  
    }  
    Animation animation = new Animation() {  
        protected void applyTransformation(float interpolatedTime, Transformation t) {  
            tv_content.setHeight((int) (startValue + deltaValue * interpolatedTime));  
        }  
    };  
    animation.setDuration(durationMillis);  
    tv_content.startAnimation(animation);  
}

原文发布于微信公众号 - 项勇(xiangy_life)

原文发表时间:2017-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

在下函数式编程,有何贵干?

本文简单介绍了一下函数式编程的各种基本特性,希望能够对于准备使用函数式编程的人起到一定入门作用。 ? 函数式编程,一个一直以来都酷,很酷,非常酷的名词。虽然诞生...

1807
来自专栏一个会写诗的程序员的博客

第3章 Kotlin 可空类型与类型系统第3章 Kotlin 可空类型与类型系统

我们在编程语言中使用类型的目的是为了让编译器能够确定类型所关联的对象需要分配多少空间。

702
来自专栏xiaoheike

为什么 EXISTS(NOT EXIST) 与 JOIN(LEFT JOIN) 的性能会比 IN(NOT IN) 好

网络上有大量的资料提及将 IN 改成 JOIN 或者 exist,然后修改完成之后确实变快了,可是为什么会变快呢?IN、EXIST、JOIN 在 MySQL 中...

804
来自专栏小白客

常用SQL语句和语法汇总

近几年数据库发挥了越来越重要的作用,这其中和大数据、数据科学的兴起有不可分割的联系。学习数据库,可以说是每个从事IT行业的必修课。你学或不学,它就在那里;你想或...

3428
来自专栏李鹏的专栏

Java 虚拟机的内存结构

我们都知道虚拟机的内存划分了多个区域,并不是一张大饼。那么为什么要划分为多块区域呢,直接搞一块区域,所有用到内存的地方都往这块区域里扔不就行了,岂不痛快。

1331
来自专栏专注 Java 基础分享

虚拟机字节码执行引擎

所谓的「虚拟机字节码执行引擎」其实就是 JVM 根据 Class 文件中给出的字节码指令,基于栈解释器的一种执行机制。通俗点来说,也就是 JVM 解析字节码指令...

4168
来自专栏LanceToBigData

MySQL(九)之数据表的查询详解(SELECT语法)一

这一篇是MySQL中的重点也是相对于MySQL中比较难得地方,个人觉得要好好的去归类,并多去练一下题目。MySQL的查询也是在笔试中必有的题目。希望我的这篇博客...

21610
来自专栏和蔼的张星的图像处理专栏

372. 在O(1)时间复杂度删除链表节点复制节点的值

给定一个单链表中的一个等待被删除的节点(非表头或表尾)。请在在O(1)时间复杂度删除该链表节点。

442
来自专栏Java帮帮-微信公众号-技术文章全总结

【数据库】MySQL进阶八、多表查询

【数据库】MySQL进阶八、多表查询 MySQL多表查询 一 使用SELECT子句进行多表查询 SELECT 字段名 FROM 表1,表2 … WHERE ...

3974
来自专栏python3

python3--re模块:正则表达式

根据手机号码一共11位并且只以13,14,15,18开头的数字这些特点,写了一段代码如下:

401

扫码关注云+社区