java static和final关键字
2018-07-22 05:49:01来源:博客园 阅读 ()
static 用法
1.static 变量
static变量又称为静态变量,静态变量保存在方法区静态域中,一个类的静态变量被其所有实例共享。
2.static方法
静态方法不与包含它的任何对象关联,即使没有创建对象,也可使用,例:
1 public class StaticTest { 2 3 public static void sayHello(){ 4 System.err.println("Hello"); 5 } 6 7 } 8 9 class Greeting{ 10 11 public static void main(String[] args) { 12 StaticTest.sayHello(); 13 } 14 }
3.static代码块
static代码块在类初次被引用或者实例化时执行且只执行一次,一个类里可以又多个static代码块,会按照顺序执行,例:
1 public class StaticTest { 2 3 static { 4 System.err.println("Wave hands"); 5 } 6 7 public static void sayHello(){ 8 System.err.println("say Hello"); 9 } 10 11 } 12 13 class Greeting{ 14 15 public static void main(String[] args) { 16 StaticTest.sayHello(); 17 } 18 }
4.static类
普通类是不能被static修饰的,static只能修饰内部类;这种内部类通常称为 嵌套类
“如果不需要内部类对象与其外围类对象之间有联系,那么可以将内部类声明为static”(《java编程思想p201》);
普通的内部类对象都会隐式的保存一个引用指向创建他的外部类,然而关于嵌套类:
1)要创建嵌套类的对象,并不需要其外围类的对象。
2)不能从嵌套类的对象中访问非静态的外围类对象。
例如jdk中ThreadLocal类就有较多的应用;
/**关于内部类部分后续讨论*/
扩展内容
类从加载到虚拟机内存中开始,到卸载内存位置,它的真个声明周期包括:加载、验证、准备、解析、初始化、使用、卸载;
有且仅有以下四种情况下,类必须进行初始化:
1)遇到new(使用new关键字实例化对象)
getstatic、putstatic(读取或设置一个类的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外))
invokestatic(调用一个类的静态方法的时候)
2)使用java.lang.reflect包的方法对类进行反射调用的时候
3)初始化一个类时,发现其父类没有进行过初始化的时候
4)当虚拟机启动时,用户需要指定一个要执行的主类,虚拟机会初始化这个主类;
对于静态字段,只有直接引用定义这个字段的类才会触发该类的初始化,而通过子类引用父类的字段,只会触发父类的初始化,而不会触发子类的初始化,例:
1 package com.neal.tutorial.basic.keyword; 2 3 public class StaticTest { 4 5 static int a = 5; 6 7 static { 8 System.err.println("a in parent: " + a); 9 } 10 11 } 12 13 class SubStatic extends StaticTest { 14 15 static int b = 10; 16 17 static{ 18 System.err.println(b); 19 } 20 21 } 22 23 class Greeting { 24 25 public static void main(String[] args) { 26 System.err.println(SubStatic.a); 27 } 28 }
输出结果为
1 a in parent: 5 2 5
可以看出子类中静态代码块并没有执行;
final关键字用法
1.变量
1)基本类型:
当我们需要一个编译时不改变常量,或者一个运行时被初始化后就不改变的值时,通常定义一个final修饰的基本类型变量
当与static一起使用时,意为一个只有一份的常量(即多个实例共享)
2)对象:
当变量类型为对象时,final变量的引用在初始化后不可更改,但是引用指向的对象值是可变的,例如数组、Map、List等
3)参数列表
当在参数列表中声明参数为final时,意味着在方法中只能读取参数引用的对象,而无法修改参数引用指向的对象,这一特性主要用于向匿名内部类传递参数
2.final方法
final方法一般用于两种情景下
1)想要锁定方法,防止任何继承类修改它的含义,确保在继承中使方法行为保持不变,并且不会被覆盖
2)出于性能考虑,在java早期实现中(现在不鼓励这么做)如果一个方法被指明为final,就是允许编译器将针对该方法的所有调用都转为内嵌调用
内嵌机制是指final方法会在编译时进行inline优化,即在编译时直接调用方法代码替换,而不是在运行时。而非final方法可能存在被子类重写,由于多态的原因,并不能在编译时就确定调用的是哪个方法
3.final类
final类不能够被继承,一般在确定该类不需要子类时,将类定义为final类型
在jdk源码中,String类就被定义为final类型
参考:
https://www.zhihu.com/question/64763016/answer/223938175
《java编程思想》第四版
ps.小王知识点 :当你举起屠刀的那一刻,就将知道自己必将死于刀下
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash