在《java编程思想》里有这么一段话:
"static就是没有this的方法,在static方法内部不能调用非静态方法,反过来可以。而且可以在不创建类对象的情况下,仅通过类本身来调用static方法。这实际上就是static方法的主要用途。"
这句话说明了static方法的基本用途,即:
在没有创建对象的情况下完成方法的调用
显然staitc关键字修饰的方法或变量不需要依赖对象去访问,只要类被加载,就可以通过类名进行访问。
static可以修饰成员变量和成员方法,通过编写static代码块也可优化程序性能。
1.static方法
static方法被称为静态方法,由于静态方法不依赖对象即可完成访问,以此对于static方法来说是不存在this的,因为他不依赖于对象,并且由于这个特性,静态方法中无法访问非静态成员方法和非静态成员变量。要注意,反之可以,这也是笔试经常考的东西。
2.static变量
static变量又叫静态变量,静态于非静态变量的区别是:静态变量能被所有对象共享,在内存中只有一个副本,当且仅当类初次加载时会被初始化。而非静态资源在创建对象后能拥有多个副本,各个对象互不影响。
3.static代码块
static关键作用就是优化程序性能,因为他只会在类加载时执行一次。static代码块可以置于类任何地方,类中可以有一个或多个static代码块,在类被加载时,会自上而下顺序依次执行每个static代码块
二.常见笔试题
1.这段代码输出结果是什么?
1 public class Test extends Base{ 2 3 static{ 4 System.out.println("test static"); 5 } 6 7 public Test(){ 8 System.out.println("test constructor"); 9 } 10 11 public static void main(String[] args) { 12 new Test(); 13 } 14 } 15 16 class Base{ 17 18 static{ 19 System.out.println("base static"); 20 } 21 22 public Base(){ 23 System.out.println("base constructor"); 24 } 25 }
base static test static base constructor test constructor
View Code
结果解释:首先我们找到主函数在Test类中,而Test类继承Base类,我们可以把Base类内容拼接到Test类内容上面,所以当Test类加载时,会先执行Base类的static代码块,然后执行Tets代码块,类加载时代码块执行分析完毕,我们发现主函数内创建了Test方法,我们用拼接的思想,Test类创建或顺序执行Test内的构造方法,即父类Base构造方法和Test构造方法。解释完毕。
2.这段代码输出结果是什么?
public class Test { Person person = new Person("Test"); static{ System.out.println("test static"); } public Test() { System.out.println("test constructor"); } public static void main(String[] args) { new MyClass(); } } class Person{ static{ System.out.println("person static"); } public Person(String str) { System.out.println("person "+str); } } class MyClass extends Test { Person person = new Person("MyClass"); static{ System.out.println("myclass static"); } public MyClass() { System.out.println("myclass constructor"); } }
test static myclass static person static person Test test constructor person MyClass myclass constructor
View Code
结果解释:我们先找程序的入口主函数,发现在Test类中,当程序运行先执行Test类中的静态代码块,然后发现主函数创建了MyClass的对象,MyClass类被执行,由于MyClass类继承Test类,我们用拼接的思想把Test类的内容放到MyClass内容上方,当MyClass类执行,Test静态代码块执行,然后MyClass静态代码块执行,Test内容中创建了Person的对象,所以执行Person的静态代码块,三个类中静态代码块均执行一次,可以无视静态代码块的执行,看构造方法,Test中用“Test”为参数创建了Person的对象,故执行Person的构造方法,按顺序分别执行Test构造方法,Person以“MyClass为参数的构造方法,MyClass的无参构造“