一.解析
"static方法就是没有this的方法,在static方法内部不能调用非静态的方法,反过来是可以的,而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法,这实际上正是static方法的主要用途"
也就是说static方法时方便在没有创建对象的情况下来进行调用方法或者变量
被static关键字修饰的方法或者变量不需要依赖于对象进行访问,只要类被加载类,就可以通过类名进行访问
static可以用来修饰类的成员方法,类的成员变量 可以编写static代码块来优化程序性能
static块可以用来优化程序性能是因为它只会在类加载的时候执行一次
static关键字不会影响到变量或者方法的作用域,在java中能影响到访问权限的只有private public protected
二.相关面试题
1.说出以下代码输出结果
public class StaticTest extends Base{
static{
System.out.println("StaticTest static");
}
public StaticTest(){
System.out.println("StaticTest constructor");
}
public static void main(String[] args){
new StaticTest();
}
}
class Base{
static{
System.out.println("Base static");
}
public Base(){
System.out.println("base constructor");
}
}
out:
Base static
StaticTest static
base constructor
StaticTest constructor
分析:
程序开始执行后会首先寻找main方法,但是在执行main方法之前首先需要加载StaticTest类,在加载StaticTest类的时候会发现这个类继承自Base,所以会先去加载Base类,这个时候发现Base中有static块,执行staic块,当Base加载完成后会回到StaticTest类加载,发现StaticTest类中也有静态块,执行,在加载所有类后开始执行main方法,在执行new StaticTest()时,会先调用父类的构造器,然后再调用自身的构造器。
2.说出以下代码输出结果
public class StaticTest2 {
Person person = new Person("Test");
static{
System.out.println("test static");
}
public StaticTest2() {
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 StaticTest2 {
Person person = new Person("MyClass");
static{
System.out.println("myclass static");
}
public MyClass() {
System.out.println("myclass constructor");
}
}
out:
test static
myclass static
person static
person Test
test constructor
person MyClass
myclass constructor
分析:
同样的,首先寻找main方法,发现main方法在StaticTest2中,那么就需要加载StaticTest2,遇到static块就执行,加载之后执行main方法中的new MyClass(),因为MyClass类还没有被加载过因此加载MyClass类,因为MyClass类继承自StaticTest2,但是因为StaicTest类已经加载过了所以不许要加载,所以就执行MyClass中的static块,加载完成后则会通过构造器来生成对象,但是在生成对象的时候必须先初始化父类的成员变量,所以会执行StaticTest2中的Person person = new Person("test");Person类没有被加载过,接着加载Person类执行静态方法,加载后执行构造器生成person方法,接着执行父类的构造方法完成父类的初始化,然后就能初始化自身了
以上。