Java中static关键字

时间:2023-08-26
本文章向大家介绍Java中static关键字,主要内容包括叙述:、一.static关键字用途、二.常见笔试题、使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

叙述:

static关键字是很多朋友在编写和阅读代码时比较难理解的一个关键字,但也是面试尤其笔试的考点。下面就从

  1. static关键字的用途
  2. 常见面试题

两个方面来描述以下我对static关键字的理解

原文链接:http://www.cnblogs.com/dolphin0520/p/3799052.html

一.static关键字用途

在《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的无参构造“

主要参考:Java中的static关键字解析 - Matrix海子 - 博客园 (cnblogs.com)

原文地址:https://www.cnblogs.com/ywwwik/p/17658498.html