Java中static关键字
叙述:
static关键字是很多朋友在编写和阅读代码时比较难理解的一个关键字,但也是面试尤其笔试的考点。下面就从
- static关键字的用途
- 常见面试题
两个方面来描述以下我对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
结果解释:首先我们找到主函数在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
结果解释:我们先找程序的入口主函数,发现在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
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- String - 44. Wildcard Matching
- DFS&BFS - 37. Sudoku Solver
- Array - 36. Valid Sudoku
- Array - 57. Insert Interval
- Binary Search - 378. Kth Smallest Element in a Sorted Matrix
- Array - 59. Spiral Matrix II
- Array - 54. Spiral Matrix
- String - 8. String to Integer (atoi)
- Array - 16. 3Sum Closest
- Array - 15. 3Sum
- Design - 146. LRU Cache
- LinkedList - 142. Linked List Cycle II
- LinkedList - 2. Add Two Numbers
- Array - 56. Merge Intervals
- golang 内存分析/内存泄漏