• final关键字

final 关键字,意思是最终的、不可修改的,最见不得变化 ,用来修饰类、方法和变量,具有以下特点:

  1. final 修饰的类不能被继承,final 类中的所有成员方法都会被隐式的指定为 final 方法;

  2. final 修饰的方法不能被重写;

  3. final 修饰的变量是常量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能让其指向另一个对象。

说明:使用 final 方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的 Java 实现版本中,会将 final 方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的 Java 版本已经不需要使用 final 方法进行这些优化了)。类中所有的 private 方法都隐式地指定为 final。


  • static关键字

static 关键字主要有以下四种使用场景:

  1. 修饰成员变量和成员方法: 被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。被 static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。调用格式:类名.静态变量名 类名.静态方法名()
  2. 静态代码块: 静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。 该类不管创建多少对象,静态代码块只执行一次.
  3. 静态内部类(static 修饰类的话只能修饰内部类): 静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:1. 它的创建是不需要依赖外围类的创建。2. 它不能使用任何外围类的非 static 成员变量和方法。
  4. 静态导包(用来导入类中的静态资源,1.5 之后的新特性): 格式为:import static 这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法。
  • static关键字的四种使用场景

  1. 修饰成员变量和成员方法
  2. 静态代码块
  3. 修饰类(只能修饰内部类)
  4. 静态导包(用来导入类中的静态资源,1.5 之后的新特性)
  • 修饰成员变量和成员方法(c常用)

被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。被 static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。

方法区与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然 Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。

HotSpot 虚拟机中方法区也常被称为 “永久代”,本质上两者并不等价。仅仅是因为 HotSpot 虚拟机设计团队用永久代来实现方法区而已,这样 HotSpot 虚拟机的垃圾收集器就可以像管理 Java 堆一样管理这部分内存了。但是这并不是一个好主意,因为这样更容易遇到内存溢出问题。

调用格式:

  • 类名.静态变量名
  • 类名.静态方法名()

如果变量或者方法被 private 则代表该属性或者该方法只能在类的内部被访问而不能在类的外部被访问。

测试方法:

public class StaticBean {String name;//静态变量static int age;public StaticBean(String name) {this.name = name;}//静态方法static void sayHello() {System.out.println("Hello i am java");}@Overridepublic String toString() {return "StaticBean{"+"name=" + name + ",age=" + age +"}";}
}
public class StaticDemo {public static void main(String[] args) {StaticBean staticBean = new StaticBean("1");StaticBean staticBean2 = new StaticBean("2");StaticBean staticBean3 = new StaticBean("3");StaticBean staticBean4 = new StaticBean("4");StaticBean.age = 33;System.out.println(staticBean + " " + staticBean2 + " " + staticBean3 + " " + staticBean4);//StaticBean{name=1,age=33} StaticBean{name=2,age=33} StaticBean{name=3,age=33} StaticBean{name=4,age=33}StaticBean.sayHello();//Hello i am java}}
  • 静态代码块

静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块 —> 非静态代码块 —> 构造方法)。 该类不管创建多少对象,静态代码块只执行一次.

静态代码块的格式是

static {语句体;
}

一个类中的静态代码块可以有多个,位置可以随便放,它不在任何的方法体内,JVM 加载类时会执行这些静态的代码块,如果静态代码块有多个,JVM 将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问.

  • 静态内部类

静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:

  1. 它的创建是不需要依赖外围类的创建。
  2. 它不能使用任何外围类的非 static 成员变量和方法。

Example(静态内部类实现单例模式)

public class Singleton {//声明为 private 避免调用默认构造方法创建对象private Singleton() {}// 声明为 private 表明静态内部该类只能在该 Singleton 类中被访问private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getUniqueInstance() {return SingletonHolder.INSTANCE;}
}

当 Singleton 类加载时,静态内部类 SingletonHolder 没有被加载进内存。只有当调用 getUniqueInstance()方法从而触发 SingletonHolder.INSTANCE 时 SingletonHolder 才会被加载,此时初始化 INSTANCE 实例,并且 JVM 能确保 INSTANCE 只被实例化一次。

这种方式不仅具有延迟初始化的好处,而且由 JVM 提供了对线程安全的支持。

  • 静态导包

格式为:import static

这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法

 //将Math中的所有静态资源导入,这时候可以直接使用里面的静态方法,而不用通过类名进行调用//如果只想导入单一某个静态方法,只需要将*换成对应的方法名即可import static java.lang.Math.*;//换成import static java.lang.Math.max;具有一样的效果public class Demo {public static void main(String[] args) {int max = max(1,2);System.out.println(max);}
}
  • 静态方法与非静态方法

静态方法属于类本身,非静态方法属于从该类生成的每个对象。 如果您的方法执行的操作不依赖于其类的各个变量和方法,请将其设置为静态(这将使程序的占用空间更小)。 否则,它应该是非静态的。

Example

class Foo {int i;public Foo(int i) {this.i = i;}public static String method1() {return "An example string that doesn't depend on i (an instance variable)";}public int method2() {return this.i + 1;  //Depends on i}}

你可以像这样调用静态方法:Foo.method1()。 如果您尝试使用这种方法调用 method2 将失败。 但这样可行

总结:

  • 在外部调用静态方法时,可以使用”类名.方法名”的方式,也可以使用”对象名.方法名”的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
  • 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制
  • static{ }静态代码块与{}非静态代码块(构造代码块)

相同点: 都是在 JVM 加载类时且在构造方法执行之前执行,在类中都可以定义多个,定义多个时按定义的顺序执行,一般在代码块中对一些 static 变量进行赋值。

不同点: 静态代码块在非静态代码块之前执行(静态代码块 -> 非静态代码块 -> 构造方法)。静态代码块只在第一次 new 执行一次,之后不再执行,而非静态代码块在每 new 一次就执行一次。 非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。

Java中的final、static、this、super 关键字相关推荐

  1. 浅谈Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  2. 浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  3. 深入理解Java中的final关键字

    深入理解Java中的final关键字 http://www.importnew.com/7553.html Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什 ...

  4. 在Java中使用final关键字可以提高性能吗?

    本文翻译自:Does use of final keyword in Java improve the performance? In Java we see lots of places where ...

  5. (转)深入理解Java中的final关键字

    转自:http://www.importnew.com/7553.html Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方 ...

  6. 【转】浅析Java中的final关键字

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...

  7. java final 变量 好处_深入理解Java中的final关键字

    Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...

  8. 10074---深入理解Java中的final关键字

    原文 Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有 ...

  9. java中final是啥意思_(转)深入理解Java中的final关键字

    Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...

  10. Java中的public static final来修饰数组与接口变量

    Java中的public static final来修饰数组与接口变量 public static final来修饰数组 final对数组的作用 怎样实现对数组的public static final ...

最新文章

  1. R语言构建xgboost模型、预测推理:输出预测概率、预测标签
  2. 【数据结构与算法】之深入解析“不同路径III”的求解思路与算法示例
  3. java的封装性_Java10-java语法基础(九)——java的封装性
  4. 计算机电缆 耐火,耐火计算机电缆ZR-NH-DJVVP
  5. DVWA Cross Site Request Forgery (CSRF) -------WP
  6. python你是否也走进了这个误区了_Python是不是被严重高估了?
  7. 模型人的因素_肺癌风险预测模型中纳入肺功能如何?
  8. 视频编码国家标准AVS与H.264的比较(节选)
  9. VC++实现自定义切换按钮
  10. 【算法精解】计数排序
  11. 奇迹mu开服教程:服务端的架设及开服注意事项
  12. 隧道管廊UWB定位系统解决方案
  13. 自动化邮件报告平台-邮件发送highchart图表
  14. 阿里P7需要精通哪些技术?看完Github上星标98K的对标阿里P7学习路线我彻底惊了
  15. Nvidia GeForce GTX 1650不支持OpenGL4.6
  16. 微信小程序使用腾讯地图进行路线规划,坐标转地址,逆地理编码,计算目的地跟自身定位的距离
  17. 从前慢-Shiro和JWT
  18. 【智能无线小车系列七】在树莓派上使用USB网卡
  19. 71.精读《手写 SQL 编译器 - 错误提示》
  20. 【字符识别】模板匹配(区域生长法)字母+数字识别【含Matlab源码 1214期】

热门文章

  1. Microsoft Windows Sharepoint Services V3.0 安装图示
  2. Java web项目的解耦合
  3. Spring IOC源码笔记(三)
  4. js中使用HTML模板字符串
  5. 从开发到发布一款基于Vue2x的图片预览插件
  6. 【jQuery获取下拉框select、单选框radio、input普通框的值和checkbox选中的个数】
  7. python-pip : Depends: python-setuptools (= 0.6c1) 问题
  8. CISCO路由器如何删除配置及%%non-valatile configuration memory is not present无法保存配置...
  9. SSH面试常被问到的问题
  10. 扩展DOM有什么问题