static修饰符能够与属性、方法和内部类一起使用,表示是“静态”的。该类的所有变量共享同一块内存空间(因此同一个静态变量的值对不同对象也是相同的)。static变量在类装载的时候被初始化。
static的基本规则:
- 静态方法只能访问静态属性;
- 静态方法不能直接调用非静态方法;
- 如果访问权限允许,static可以使用类名或者实例调用;
- 静态方法中不存在当前对象,因而不能使用“this”或者“super”;
- 静态方法不能被非静态方法覆盖;
- 构造方法不允许声明为static的;
静态import:
静态引用使人可以像调用本地方法一样调用一个引入的静态方法。例如:
要生成一个随机数
double randomNum = Math.random();
若使用静态引用,则
import static java.lang.Math.random; \\注意random必须为静态方法
double randomNum = random(); \\使用时应注意避免混淆同名函数
final修饰符声明类、属性和方法时,标记的成分具有“终态”特征,有以下规则:
- final标记的类不能被继承;
- final标记的方法不能被子类重写;
- final标记的变量即成为常量,只能赋值一次;
- final标记的成员变量必须在声明的同时赋值。如果声明时没有赋值,那么只能在构造方法中显式赋值。
- final标记的局部变量可以只声明不赋值,然后再进行一次赋值(只有一次机会)。
- final一般用于标记那些通用性的功能、实现方式或取值不能随意被改变的成分,以免被误用。
Java 程序运行时的内存结构分成:方法区、栈内存、堆内存、本地方法栈几种。
方法区:
- 基本信息:
1)每个类的全限定名
2)每个类的直接超类的全限定名(可约束类型转换)
3)该类是类还是接口
4)该类型的访问修饰符
5)直接超接口的全限定名的有序列表 - 每个已装载类的详细信息
1)运行时常量池:
存放该类型所用的一切常量(直接常量和对其它类型、字段、方法的符
号引用),它们以数组形式通过索引被访问,是外部调用与类联系及类型对
象化的桥梁。它是类文件(字节码)常量池的运行时表示。
2)字段信息:类中声明的每一个字段的信息(名,类型,修饰符)。
3)方法信息:类中声明的每一个方法的信息(名,返回类型,参数类型,修饰符,方
法的字节码和异常表)。
4)静态变量
5)到类classloader的引用:即到该类的类装载器的引用。
6)到类class 的引用:虚拟机为每一个被装载的类型创建一个class 实例,用来代表这个被装载的类。
栈内存
- 局部变量区
- 操作数栈
- 帧数据区
堆内存
堆内存用来存放由new 创建的对象和数组。在堆中分配的内存,由Java 虚拟机的自动
垃圾回收器来管理。
本地方法栈内存
与调用的本地方法的语言相关,如调用的是一个c语言方法则为一个c 栈。本地方法可
以回调java方法。若有java方法调用本地方法,虚拟机就运行这个本地方法。
在虚拟机看来运行这个本地方法就是执行这个java 方法。Java 通过Java 本地接口JNI(Java Native Interface)来调用其它语言编写的程序,在Java 里面用native 修饰符来描述一个方法是本地方法。
String的内存分配
String是一个特殊的包装类。
String str = new String("abc");
String str = "abc";
第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。而第二种是先在栈中创建一个对String 类的对象引用变量str,然后查找栈中有没有存放”abc”,如果没有,则将”abc”存放进栈,并令str指向”abc”,如果已经”abc” 则直接令str指向“abc”。
比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==
由于String类的值不可变性(immutable),当String 变量需要经常变换其值时,应该考虑使用StringBuffer 或StringBuilder类,以提高程序效率。