本文仅仅为了博主面试时方便查阅与梳理相关知识,如果有错误与不到位的地方,欢迎大佬指点改正,谢谢!
阅读书籍:《java程序员面试笔试宝典》
1、作用
static关键字主要有两种作用:第一,为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。第二,实现某个方法或属性与类而不是与对象关联在一起,即在不创建对象的情况下就可以通过类来直接调用方法或使用类的属性。
2、使用情况
static主要有4种使用情况:成员变量、成员方法、代码块和内部类。
(1)static成员变量(静态变量)
变量可以通过static达到全局的效果。
java提供类提供了两种类型的变量:用static关键字修饰的静态变量和不同static关键字修饰的实例变量。
静态变量属于类,在内存中只有一个复制(所有实例都指向同一个内存地址),只要静态变量所在的类被加载,这个静态变量就会被分配空间。
对静态变量有两种引用方式:“类.静态变量和对象.静态变量”
。
实例变量属于对象,只有对象被创建后,实例变量才会被分配空间,才能被使用,它在内存中存在多个复制。只能用“对象.实例变量”
的方式来引用。
静态变量只有一个,被类拥有,所有对象都共享这个静态变量,而实例对象是与具体对象相关的。
注意:不能在方法体中定义static变量。
(2)static成员方法(静态方法)
static方法是类的方法,不需要创建对象就可以被调用。而非static方法是对象的方法,只有对象被创建出来后才可以被使用。
static方法中不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和成员方法,因为当static方法被调用时,这个类的对象可能还没被创建,即使已经被创建了,也无法确定调用哪个对象的方法。
static的重用用途之一:实现单例模式
单例模式的特点是该类只能有一个实例,为了实现这一功能,必须隐藏类的构造函数,即把构造函数声明为private,并提供一个创建对象的方法,由于构造对象被声明为private,外界无法直接创建这个类型的对象,只能通过该类的方法来获取类的对象,要达到这样的目的只能把对象的方法声明为static。
用public修饰的static变量和方法本质上都是全局的,若在static变量前用private修饰,则表示这个变量可以在类的静态代码块或者类的其他静态成员方法中使用,但是不能在其他类中通过类名来直接引用。
(3)static代码块(静态代码块)
静态代码块在类中是独立于成员变量和成员函数的代码块的。它不在任何一个方法体内,JVM在加载类时会执行static代码块,如果有多个static代码块,JVM将会按照属性来执行。static代码块经常被用来初始化静态变量。
注意:这些static代码块只会被执行一次。
(4)static内部类
static内部类是指被声明为static的内部类,它可以不依赖于外部类实例对象而被实例化,而通常的内部类需要在外部类实例化后才能被实例化。静态内部类不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问外部类值中的静态成员和静态方法(包括私有类型)。
注意:只有内部类才能被定义为static。
什么是实例变量?什么是局部变量?什么是类变量?什么是final变量?
实例变量:变量归对象所有(只有实例化对象后才可以)。每当实例化一个对象时,会创建一个副本并初始化,如果没有显示初始化,那么会初始化一个默认值。各个对象中的实例变量互不影响。
局部变量:在方法中定义的变量,在使用前必须初始化。
类变量:用static修饰的书写、变量归类所有,只要类加载,这个变量就可以被使用(类名.变量名)。所有实例化的对象共享类变量。
final变量:表示这个变量为常量,并不能被修改。
static和final结合使用表示什么意思?
在java语言中,static关键字常与final关键字结合使用,用来修饰成员变量和成员方法。对于变量,若使用static final修饰,则表示一旦赋值,就不可修改,并且通过类名可以访问。对于方法,若用static修饰,则表示该方法不可覆盖,并且可以通过类名直接访问。
switch语句用于多分值选择,使用switch(expr)时,expr只能是一个枚举常量(内部也是由整型或字符类型实现)或一个整数表达式,其中整数表达式可以是基本类型int或其对应的包装类Integer,当然也包括不同的长度整型,例如short。**由于byte、short和char类型的值都能被隐式地转换为int类型,因此这些类型以及它们对应的包装类型都可以作为switch的 表达式。但是,long、float、double、String类型不能够隐式的转换为int类型,因此它们不能被用作switch的表达式。**如果一定要使用的话,需要强制转换为int类型。
与switch对应的是case语句,case语句之后可以是直接的常量数值,也可以是一个常量计算式,还可以是final型的变量(final变量必须是编译时的常量)
注意:在java7之后,switch开始支持String类型。
从本质上讲,switch对字符串的支持,实际上是int类型值的匹配。
注意:使用switch时,一般必须在case语句结尾添加break语句。
一旦通过switch语句确定了入口点,就会顺序执行后面的代码,直到遇到关键字break。否则,会执行满足这个case之后的其他case语句而不管case是否匹配,直到switch结束或者遇到break为止。如果在switch语句中忽略了brake语句,那么匹配的case值后的所有情况(包括default)都会被执行。
在用java语言编写的程序中,有时为了提高程序的运行效率,编译器会自动对其进行优化,把经常访问的变量缓存起来,程序在读取这个变量时又可能会直接从缓存中来读取这个值,而不会去内存中读取。好处是提高了程序的运行效率,但是在遇到多线程编程时,变量的值可能因为被的线程而改变了,而该缓存的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。
volatile是一个类型修饰符,被设计用来修饰被不同线程访问和修改的变量。被volatile类型定义的变量,系统每次用到它时都是直接从对应的内存当中提取,而不会利用缓存。在使用了volatile修饰变量后,所有线程在任何时候所看到变量的值都是相同的。
`注意:volatile不能保证操作的原子性,因此,一般情况下volatile不能代替sychronized。此外,使用volatile会阻止编译器对代码的优化,因此会降低程序的执行效率。
instanceof是java语言中的一个二元运算符,它的作用是判断一个引用类型的变量所指向的对象是否是一个类(或接口、抽象类和父类)的实例,即它左边的对象是否是它右边的类的实例该运算符返回boolean类型数据。
常见用法
result = object instanceof class
//如果object是class的一个实例,那么instanceof运算符返回true;
//如果object不是class的一个实例,或者object为null,那么instanceof运算符返回false。
1、概念
关键字strictfp是strict float point的缩写,指的是精确浮点。
2、作用
用来确保浮点数运算的准确性,在不同的硬件平台上会有一致的运行结果。