Java static与final使用陷阱
Java自学的网站(Java全栈工程师 | 以实例驱动学习 | how2j.cn)
static是静态修饰关键字,可以修饰变量和程序块以及类方法:
当定义一个static的变量的时候jvm会将将其分配在内存堆上,所有程序对它的引用都会指向这一个地址而不会重新分配内存;
当修饰一个程序块的时候(也就是直接将代码写在static{...}中)时候,虚拟机就会优先加载静态块中代码,这主要用于系统初始化;
当修饰一个类方法时候你就可以直接通过类来调用而不需要新建对象。
1、static修饰属性:无论一个类生成了多少个对象,所有这个对象共用唯一一份静态的成员变量;一个对象对该静态成员变量进行了修改,其他对象的该静态成员变量的值也会随之发生变化。如果一个成员变量是static的,那么我们可以通过类名.成员变量名的方式来使用它(推荐使用这种方式)。
2、static修饰方法:static修饰的方法叫做静态方法。对于静态方法来说,可以使用类名.方法名的方式来访问。
public class StaticTest {public static void main(String[] args) {MyStatic.output();}
}
class MyStatic{public static void output(){System.out.println("output");}
}
3、静态方法只能继承,不能重写(Override)。
输出结果:父类
4、final关键字:final可以修饰属性、方法、类。
5、final修饰类:当一个类被final所修饰时,表示该类是一个终态类,即不能被继承。
6、final修饰方法:当一个方法被final所修饰的时,表示该方法是一个终态方法,即不能被重写(Override)。
7、 final修饰属性:当一个属性被final所修饰时,表示该属性不能被改写。
8、当final修饰一个原生数据类型时,表示该原生数据类型的值不能发生变化(比如说不能从10变为20);如果final修饰一个引用类型时,表示该引用类型不能再指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。
原生数据类型案例:
图中的错误是无法为最终变量age分配值
引用类型案例:
图中错误是无法为最终变量address分配值
该引用所指向的对象的内容是可以发生变化的
9、对于final类型成员变量,一般来说有两种赋值方式:
a) 在声明final类型的成员变量时就赋初值
b) 在声明final类型的成员变量时不赋初值,但在类的所有构造方法中都为其赋上初值。
public class FinalTest {final int a;public FinalTest() {a = 0;}public FinalTest(int a) {this.a = a;}
}
10、static静态代码块。静态代码块的作用也是完成一些初始化工作。首先执行静态块,然后执行构造方法。静态代码块在类被加载的时候执行,而构造方法是在生成对象的时候执行;要调用某个类来生成对象,首先需要将类加载到Java虚拟机上(JVM),然后由JVM加载这个类来生成对象。
11、类的静态代码块只会执行一次,是在类被加载的时候执行的,因为每个类只会加载一个,所以静态代码块也只会被执行一次;而构造方法则不然,每次生成一个对象的时候都会调用类的构造方法,所以new一次就会调用构造方法一次。
12、如果继承体系既有构造方法,又有静态代码块,那么首先执行最顶层的类的静态代码块,一直执行到最底层类的静态代码块,然后再去执行最顶层类的构造方法,一直执行到最底层的构造方法,注意:静态代码块只会执行一次。
public class StaticTest5 {public static void main(String[] args) {new R();new R();}
}
class P{//static静态代码块static {System.out.println("static block");}public P(){System.out.println("P constructor");}
}
class Q extends P{static {System.out.println("static block");}public Q(){System.out.println("Q constructor");}
}
class R extends Q{static {System.out.println("static block");}public R(){System.out.println("R constructor");}
}
输出结果:
static block
static block
static block
P constructor
Q constructor
R constructor
P constructor
Q constructor
R constructor
13、不能在静态方法中访问非静态的成员变量:可以在静态方法中访问静态的成员变量。可以在非静态方法中访问静态的成员变量。
14、总结:静态的只能访问静态的;非静态的访问一切。
15、不能在静态方法中使用this关键字。
Java static与final使用陷阱相关推荐
- Java: static,final,代码块 的详解
Java: static,final,代码块 的详解 每博一文案 山本文绪说过这样一句话:哪些决定放弃了的事,就请放弃得干干净净.哪些决定再也不见面的人,就真 的不要再见面了,不要再做背叛自己的事,如 ...
- Java static与final详细讲解
1.static修饰变量: 2.static修饰方法: 目录 可修饰部分 一.static 3.static和final一块用 final一块用 4.static静态代码块 5.静态导包 6.总结 二 ...
- Java:static和final关键字的区别与比较
文章目录 前言 一.final关键字 二.static关键字 总结 前言 本文记录笔者在复习Java基础期间学习的static和final关键字 一.final关键字 final关键字具有如下特点 f ...
- Java static、 final修饰符
1.static package ClassN;final class Static1 { //静态变量,静态方法,静态代码块 //static 不能拿来修饰类static String num;// ...
- [Java]static、final修饰的方法是否可以被子类继承、是否可以被子类重写及final修饰详解
static修饰的方法: 1.父类中的静态方法可以被继承.但不能被子类重写. 2.如果在子类中写一个和父类中一样的静态方法,那么该静态方法由该子类特有,两者不构成重写关系. final修饰: 1.修饰 ...
- JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配
JAVA基础-栈与堆,static.final修饰符.内部类和Java内存分配 发布时间: 2013/01/12 22:29 QQ空间 新浪微博 腾讯微博 人人网 豆瓣网 百度空间 百度搜藏 开心网 ...
- Java 中关于this、static、final 关键字的使用
this关键字 this 关键字主要有以下几种作用: 1:当类成员变量与局部成员变量重名时,可以用this 关键字把局部成员变量赋值给类成员变量 2:this可以用来在构造函数中调用其他构造函数 ...
- java final内存机制_Java中的内存处理机制和final、static、final static总结
装载自:http://blog.csdn.net/wqthaha/article/details/20923579 Java程序运行在JVM上,可以把JVM理解成Java程序和操作系统之间的桥梁,JV ...
- Java的static,final,代码块,内部类,抽象类,接口等
Java的static,final,代码块,内部类,抽象类,接口等 1 static关键字月final关键字 1.1 static static表示静态.可以修饰属性,方法,代码块内部类等,总结如下: ...
最新文章
- SMOTE 过采样的API使用
- unity3d-游戏实战突出重围,第四天 添加角色
- WCF 第十三章 可编程站点 所有都与URI相关
- C# DropDownList 绑定枚举类
- MIT_18.03_微分方程_Laplace_Transform_拉普拉斯变换_Notes
- PHP利用反射根据类名反向寻找类所在文件
- 嵌入式码农的10年Bug调试经验,值得一看
- 栈在前端中的应用,顺便再了解下深拷贝和浅拷贝!
- 深入理解张正友相机标定法:数学理论详细推导
- Python 自带的 any() 函数--判断给定的可迭代参数 iterable 是否全部为 False
- 如何在Postgresql中使用模糊字符串匹配
- 1.1.0-简介-P8-选举、多数派和租约
- celery java_Python的Java Celery项目相当于什么?
- 知乎“下沉”,快手“上游”
- python for ArcGIS 绘制广州市板块地图
- 国内各大安卓市场有ASO优化吗?安卓应用市场aso优化
- ASP.NET CORE WEB应用(有数据库操作的应用)发布到IIS
- 【STM32F407的DSP教程】第28章 FFT和IFFT的Matlab实现(幅频响应和相频响应)
- ios私钥证书和描述文件.mobileprovision的生成方法
- EtherCAT协议介绍
热门文章
- 云虚拟主机有哪些优势?
- Ubuntu创建文件夹相关问题
- 【分享】20个高级Java面试题汇总(含答案)
- SDF(Signed-distance-field: 有向距离场)(6): 空间复制(repeat)(生成大规模显示对象)
- springCloud Feign的实现原理
- Electron(1.6.11) + koa2 仿腾讯TGP游戏登录器(一):环境部署
- 合并两个有序数组(双指针解题)
- 梯度下降图示理解(以二元函数为例)
- 无线传感器:智能家居监控系统设计
- RadioGroup单选按钮用法