java里的static/final含义
java里的static/final含义
static
- static可以修饰:属性,方法,代码段,内部类(静态内部类或嵌套内部类)
- static修饰的属性的初始化在编译期(类加载的时候),初始化后能改变。因此static修饰的属性必须有初始值(数值型变量默认值为0,布尔型默认值为false,引用类型默认值为null)。类加载后,存储在方法区(metaspace)
- static修饰的属性所有对象都只有一个值(但是多个实例都可以同时修改,因此不具有线程安全性)。
- static修饰的属性强调(在多个实例中)只有一个。
- static修饰的属性、方法、代码段跟该类的具体对象无关,不创建对象也能调用static修饰的属性、方法等
- static和“this、super”势不两立,static跟具体对象无关,而this、super正好跟具体对象有关。
- static不可以修饰局部变量。
final
- final可以修饰:属性,方法,类,局部变量(方法中的变量)
- final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变。final修饰的属性没有默认值
- final修饰的属性跟具体对象有关,在运行期初始化的final属性,不同对象可以有不同的值。
- final修饰的属性表明是一个常数(创建后不能被修改)。
- final修饰的方法表示该方法在子类中不能被重写,它可以防止任何继承类修改方法的意义和实现,而且,使用final修饰方法的执行效率一般高于普通方法
- 当final修饰一个类时,表明其为最终类,它不能被继承,并且类中所有的属性和方法都默认是final类型,如String,Integer等包装类均为final类
- 对于基本类型数据,final会将值变为一个常数(大写字母表示,创建后不能被修改)
- 对于对象句柄(亦可称作引用或者指针),final会将句柄变为一个常数(进行声明时,必须将句柄初始化到一个具体的对象。而且不能再将句柄指向另一个对象。但是,对象的本身是可以修改的。这一限制也适用于数组,数组也属于对象,数组本身也是可以修改的。方法参数中的final句柄,意味着在该方法内部,我们不能改变参数句柄指向的实际东西,也就是说在方法内部不能给形参句柄再另外赋值
- final修饰的参数有一个只读的属性,即可以读取该参数,但是无法更改参数的值,同修饰变量一样,当参数为基本类型时,该参数的值不可改变;当参数为引用类型时,参数的引用地址不可改变
demo
由于final修饰的String变量不可更改,所以,当一个String变量被final修饰时,这个值在编译期就可以确定,所有将该变量直接替换为它对应的值,如下:
public class test {
public static void main(String[] args) {
final String a = "hello";
String b = "hello"; // String是对象,一旦赋值不可以改变,但是b可以执行其他对象
// b = "test";
final String c = "world";
String d = "hello" + "world";
String e = a + c;
String f = b + c; // 运行时,在堆内分配内存
String g = "helloworld"; // 在字符串常量池内
StringBuilder y = new StringBuilder("test");
y.append("demo");
y.append("good");
System.out.println(g == d);//true,“==”表示判断二者的内存地址是否相同
System.out.println(g == e);//true,“==”号在比较对象时是比较对象在内存中的地址是否一致
System.out.println(g == f);//false
System.out.println(y);
}
}
在编译期,由于a和c的值已经确定并且不会再更改(效果同d),所以e的值能够在编译期就确定下来,直接指向了常量区的g,前两个均为true;再看下f,由于b值的不确定性,所以在编译期不能确定其值,只能在运行时确认,所以二者内存地址不同,(g == f)为false。
static final
- 修饰的属性没有默认值,必须进行初始化
- static final:static修饰的属性强调它们只有一个,final修饰的属性表明是一个常数(创建后不能被修改)。
- static final修饰的属性表示一旦给值,就不可修改,并且可以通过类名访问。
- static final也可以修饰方法,表示该方法不能重写,可以在不new对象的情况下调用
final变量初始化
public class MainTest {
//-----------------成员变量(实例变量)------------------//
// 初始化方式一(编译时赋值),在定义变量时直接赋值,如果不赋值,不会有默认值,必须后续进行赋值
private final int i = 3;
// 初始化方式二(运行时赋值),声明变量后在构造方法中为其赋值,如果采用用这种方式,那么每个构造方法中都要有j赋值的语句
private final int j;
public MainTest() {
j = 3;
}
// 为了方便我们可以这样写,final变量多于1个时,就没有办法使用这种方式实现了
public MainTest(int int1) {
this(3);
}
// 初始化方式三(运行时赋值),声明变量后在构造代码块中为其赋值,如果采用此方式,就不能在构造方法中再次为其赋值,构造代码块中的代码会在构造方法之前执行,如果在构造方法中再次赋值,就会造成final变量的重复赋值
private final int k;
{
k = 4;
}
//-----------------类变量(静态变量)------------------//
// 初始化方式一,在定义时直接赋值(不赋值使用默认值)
public static int p = 3;
// 初始化方式二,在静态代码块中赋值
public static int q;
static {
q = 3;
}
// 成员变量可以在构造方法中赋值,但是类变量却不可以。因为成员变量属于对象(类的实例)独有,每个对象创建时都必然调用一次构造方法而切只会调用一次构造方法,因此可以保证该成员变量只被初始化一次;而类变量是该类的所有对象共有,如果每个对象创建时都会对该变量赋值,这样就会造成变量的重复赋值。
}
实例变量具有默认值,数值型变量的默认值是0,布尔型变量的默认值是false,应用类型变量的默认值是null
不同变量类型在JVM内的存储
- 基本局部变量存在栈中(虚拟机栈),但是方法里的数组和对象存在于堆中
- 静态变量储存在方法区
- 实例变量/成员变量储存在堆中
常量池(jdk>=1.7)
class常量池:位于方法区,存放字面量和符号引用
字面量类似与我们平常说的常量,主要包括:
- 文本字符串:就是我们在代码中能够看到的字符串,例如String a = "aa"。其中"aa"就是字面量。
- 被final修饰的变量
符号引用:
- 类和接口和全限定名:例如对于String这个类,它的全限定名就是java/lang/String。
- 字段的名称和描述符:所谓字段就是类或者接口中声明的变量,包括类级别变量(static)和实例级的变量。
- 方法的名称和描述符。所谓描述符就相当于方法的参数类型+返回值类型
运行时常量池:class文件中的常量池,它会在类加载后进入方法区中的运行时常量池。并且需要的注意的是,运行时常量池是全局共享的,多个类共用一个运行时常量池。并且class文件中常量池多个相同的整数在运行时只会存一份在字符串常量池
字符串常量池:存在堆中。class文件中的文本字符串在运行时就存在这里。并且class文件中常量池多个相同的字符串在运行时只会存一份在字符串常量池
整数常量池:方法区,在运行时常量池内,范围-128~127
然后看一段代码,问:这里产生了几个对象?:
string s1= new string("abc")
根据上面的意思,我们可以这样说,如果常量池中已经有了abc对象,那么就只会在堆中产生一个对象。如果没有,那么先在常量池中创建一个对象,然后复制到堆内存中再创建一个,所以创建了两个。
参考
https://zhuanlan.zhihu.com/p/42184392
https://zhuanlan.zhihu.com/p/40798413
java里的static/final含义的更多相关文章
- java里的static和final
本节介绍JAVA里static和final的作用和使用方法以及一些需要注意的问题. 一.static static表示"全局"或"静态",用来修饰成员变量和成员 ...
- Java 面向对象之static,final,匿名对象,内部类,包,修饰符
01final关键字概念 A: 概述 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承, 或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这 ...
- 在Java里>、>>、>>>的含义
在java中: >表示大于,如:if(a>b)...结果是boolean类型 >>表示右移,如:int i=15; i>>2的结果是3,移出的部分将被抛弃. 转为二 ...
- 对php和java里面的static函数和static的一些理解
static function: "static方法就是没有this的方法.在static方法里面不可以调用非静态方法,反过来是可以的.并且可以在没有创建任何对象的前提下,仅仅通过类名来调用 ...
- java笔记之static&final&abstract
知识需要不断回顾和重新认识 一:static static类型变量初始值只能被赋值一次,它的整个生命周期是源程序,程序结束前变量都不会被释放. 例如: for(int i = 0; i<10; ...
- java面试官:兄弟简单谈谈Static、final、Static final各种用法吧
前言 对Static.final.Static final这几个关键词熟悉又陌生?想说却又不知怎么准确说出口?好的,本篇博客文章将简短概要出他们之间的各自的使用,希望各位要是被你的面试官问到了,也能从 ...
- java中的Static、final、Static final各种用法详解
前言 对Static.final.Static final这几个关键词熟悉又陌生?想说却又不知怎么准确说出口?好的,本篇博客文章将简短概要出他们之间的各自的使用,希望各位要是被你的面试官问到了,也能从 ...
- Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类
final关键字 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对 ...
- 2017.10.23 Java 面向对象深入学习---final 关键字、static关键字、匿名对象等
今日内容介绍 1.final 关键字 2.static 关键字 3.匿名对象 4.内部类 5.包的声明与访问 6.访问修饰符 7.代码块 第一节课 01(面向对象)final关键字概念.avi 02: ...
随机推荐
- unix域套接字
对于本地通信,unix域套接字通信是internet通信速度的2倍
- 阿里云——扩展Linux系统盘
前言 地址|https://help.aliyun.com/document_detail/111738.html?spm=a2c4g.11186623.2.7.1d284c07SFRBaq#sect ...
- Git学习笔记--配置(二)
由之前文章,总结得出Git的特点: 最优的存储能力: 非凡性能: 开源的: 管理成本低: 很容易做备份: 支持离线操作: 很容易定制工作流程: Git is a free and open sourc ...
- 分析第一个Android程序
项目结构切换Project, 项目真实目录结构 { 1. .gradle和idea 两个目录放置的都是Android Studio 自动生成的一些文件,我们无需关心,也不要去手动编辑. 2.AP ...
- 10-Flutter移动电商实战-使用FlutterSwiper制作轮播效果
1.引入flutter_swiper插件 flutter最强大的siwiper, 多种布局方式,无限轮播,Android和IOS双端适配. 好牛X得介绍,一般敢用“最”的一般都是神级大神,看到这个介绍 ...
- 洛谷 P4281 [AHOI2008] 紧急集合 题解
挺好的一道题,本身不难,就把求两个点的LCA变为求三个点两两求LCA,不重合的点才是最优解.值得一提的是,最后对答案的处理运用差分的思想:假设两点 一点深度为d1,另一点 深度为d2,它们LCA深度为 ...
- Dump文件数据存储格式(一)
我们已经了解了什么是Dump文件,它保存了什么数据,有什么作用,但它是如何存储的,数据格式是怎样的呢.下面简单说一下. 一.总体结构 二.文件头 首先文件的最开始的32个字节是Dump文件的文件头,这 ...
- avalon $computed不起作用?
computed写的个数,应该是只能一个的,之前写了两个,一个是空,一个里面有数据,那个有数据的不起作用,但是在有数据的里面写一个一个console.log就会起作用,所以将多余的空的computed ...
- RUN vs CMD vs ENTRYPOINT
参考:https://www.ibm.com/developerworks/community/blogs/132cfa78-44b0-4376-85d0-d3096cd30d3f/entry/RUN ...
- 范仁义html+css课程---3、图片和超链接
范仁义html+css课程---3.图片和超链接 一.总结 一句话总结: img标签是图片标签,定义 HTML 页面中的图像 a标签是超链接标签,用于从一个页面链接到另一个页面. 1.img标签要点? ...