1.访问修饰符:
public,private,protected,默认
2.static:成员变量,方法,静态代码块
static关键字可以修饰成员变量,它所修饰的成员变量不属于对象的数据结构,而是属于类的变量,通常通过类名来引用static成员。
当创建对象后,成员变量是存储在堆中的,而static成员变量和类的信息一起存储在方法区,而不是在堆中,
一个类的static成员变量只有“一份”(存储在方法区),无论该类创建了多少对象。
public class Test01 {
public static void main(String[] args) {
Cat c1 = new Cat(2);
Cat c2 = new Cat(3);
}
}
class Cat {
private int age;
private static int numOfCats;
public Cat(int age) {
this.age = age;
System.out.println(++numOfCats);
}
}
其内存分配如下图所示:
如上的代码中,声明两个Cat类对象后,numOfCats的值为2。当声明第一个Cat类对象后,numOfCats值增1变为1,声明第二个Cat类对象后,因为numOfCats存在方法区中并且只有一份,所以其值在刚刚的1的基础之上变为2。
static方法的作用在于提供一些“工具方法”和“工厂方法”。工具方法如:Math.sqrt() Math.sin() Arrays.sort()
static块为属于类的代码块,在类加载期间执行的代码块,只执行一次,可以用来在软件中加载静态资源(图像、音频等等)。
public class Test01 {
public static void main(String[] args) {
Foo foo = new Foo();
}
}
class Foo {
static {
// 类加载期间,只执行一次
System.out.println(" Load Foo.class ");
}
public Foo() {
System.out.println("Foo()");
}
}
上面代码的输出结果为:
Load Foo.class
Foo();
因为,在Foo类加载时,先运行了静态块,而后执行了构造方法,即,static块是在创建对象之前执行的。
3.final:变量,方法,类
final关键字修饰变量,意为不可改变。
当final修饰成员变量时,可以有两种初始化方式:a. 声明同时初始化 b.构造函数中初始化
final关键字修饰局部变量,在使用之前初始化即可。
final关键字修饰的方法不可以被重写。
final关键字修饰的类不可以被继承。
4.static final常量
static final 修饰的成员变量称为常量,必须声明同时初始化,并且不可被改变。常量建议所有字母大写。
实际应用中应用率较广,因为static final常量是在编译期被替换的,可以节约不必要的开支,如下代码演示了static final的用法:
public class Test01 {
public static void main(String[] args) {
System.out.println(Foo.NUM);
// 代码编译时,会替换为:System.out.println(100);
}
}
class Foo {
public static final int NUM = 100;
}
说明:static final常量Foo.NUM会在编译时被替换为其常量值(100),在运行Goo类时,Foo类不需要被载入。这样减少了不必要的开支。