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

以上。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值