java中static关键字以及相关面试题

一.解析

"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方法,接着执行父类的构造方法完成父类的初始化,然后就能初始化自身了

 

 

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值