前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android开发笔记(八十七)几个修饰关键字

Android开发笔记(八十七)几个修饰关键字

作者头像
aqi00
发布2019-01-18 14:29:15
5380
发布2019-01-18 14:29:15
举报
文章被收录于专栏:老欧说安卓

原生native

native是方法修饰符,表示该方法是由其他一种语言(如C/C++)实现的原生方法。其实native只在JNI接口中使用,java代码中只有原生方法的定义,具体的实现代码在其他语言(如C/C++)的代码文件中,有关JNI的介绍参见《Android开发笔记(六十九)JNI实战》。

静态static

静态变量

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

代码语言:javascript
复制
public class School {
	public static int number=0;
}

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

代码语言:javascript
复制
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++);
		}
	}
}

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

代码语言:javascript
复制
school.number=0
school.number=1
school.number=2
school.number=3
school.number=4

静态方法

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

静态类

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

静态代码块

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

代码语言:javascript
复制
    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标签表示该类的名称,这样记录日志时可以下列形式调用:

代码语言:javascript
复制
Log.d(TAG, "...");

2、类的常量。例如Color类中的BLACK、WHITE、RED、GREEN、BLUE等常量; 3、匿名内部类的局部变量。因为匿名内部类在编译时是与方法平级的,所以不能调用方法的变量,只能调用类的变量。如果匿名内部类一定要调用方法的变量,那得声明该变量是final类型,即把该变量当作一个常量来用。匿名内部类的说明参见《Android开发笔记(八十六)几个特殊的类》 final变量的初始化有三种途径: 1、在声明final变量时,就给它赋初始值; 2、在类的构造函数中,给final变量赋值; 3、在静态代码块中,给final变量赋值; 下面是在匿名内部类中使用final变量的代码例子:

代码语言:javascript
复制
		@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);
		}

点此查看Android开发笔记的完整目录

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年04月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原生native
  • 静态static
    • 静态变量
      • 静态方法
        • 静态类
          • 静态代码块
          • 终态final
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档