static可以修饰在内部类、方法、变量和代码块上。
1.static修饰在内部类上
首先什么是内部类?
内部类就是在一个类的内部又定义了一个类,内部类可以访问其所在内的所有的属性(包括私有属性!!!)
静态内部类相对于外部类是独立存在的,在静态内部类中无法访问外部类的变量和方法,若要访问则必须new一下外部类 ,使用new出来的对象访问外部类的变量和方法和非静态变量和非静态常量。但是却可以访问静态变量和静态方法。
2.static修饰在变量上
static修饰的变量(静态变量或叫类变量)被所有的实例共享(对象或者类本身),不会依赖于对象,静态变量在内存中只进行一次拷贝,在JVM中只分配一次内存。
3.static修饰在方法上
static修饰的方法称之为静态方法,静态方法只属于这个类本身,不属于某个对象,静态方法不能被重写,可以类名来直接调用。在静态方法中不能使用this和super关键字(this指向的是当前对象,而super相当于指向当前对象的父类,两者可以相当于对象的一种属性)
static修饰在代码块上
static修饰的代码块叫静态代码块,静态代码块在整个类加载的过程中只会被执行一次,静态代码块可以有多个,有多个会先后顺序依次执行,静态代码块通常用作程序优化。
以下是一个使用static的综合案例
public class TestStaticDemo extends TestDemo{
public static int a =1;
public String b = "b";
public TestStaticDemo(){
System.out.println("TestStaticDemo...被构造了");
}
public static void aa(){
System.out.println("静态方法aa被执行");
}
static class Demo1{
public Demo1(){
// TestStaticDemo testStaticDemo = new TestStaticDemo();
// String b =testStaticDemo.b;
a=2;
System.out.println("Demo....被构造了"+a);
}
}
static {
System.out.println("static...1");
}
public static void main(String[] args) {
new Demo1();
}
}
public class TestDemo {
public TestDemo(){
System.out.println("TestDemo被构造了。。。");
}
static {
System.out.println("static....2");
}
}
输出结果为:
这里主要涉及到一个执行先后的事情,执行开始,先找到main方法,执行main方法前肯定要先加载TestStaticDemo类,而TestStaticDemo继承TestDemo,所以会先去加载TestDemo类,在TestDemo类中有代码块,所以先执行TestDemo中的static块,在TestDemo加载完成后就会加载TestStaticDemo类,同理有static会先执行,最后执行new Demo1()方法。
idea提示我们b要为一个static内容。根据静态内部类的规则修改代码。
static class Demo1{
public Demo1(){
TestStaticDemo testStaticDemo = new TestStaticDemo();
String b =testStaticDemo.b;
System.out.println("Demo....被构造了"+b);
}
}
new出外面类对象 可以得到b的值(关于构造顺序,java会通过一层层的继承关系,先执行父类的构造方法)