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
- 【释疑文】DeveMobile、EaseMobile 及Devework 主题的区别
- DeveMobile/EaseMobile 主题双双更新1.1,增加离线存储,社交媒体关注等功能
- Angularjs基础(六)
- 如果机器人拥有痛觉,这个世界会怎样
- 阻止iOS Web APP中点击链接跳转到Safari 浏览器新标签页
- 专门攻击工资支付系统的网络犯罪
- Angularjs基础(五)
- DW Replace Open Sans:将WordPress 后台中的open-sans字体加载源从Google Fonts换为360 CDN
- Google Fonts 已可正常访问,相关插件可卸
- 微信支付宝完成这几个设置,别人偷不走你一毛钱!
- Angularjs基础(四)
- Google Fonts导致WordPress 速度问题的三个解决方案
- DW Replace Open Sans:将WordPress 后台中的open-sans字体加载源从Google Fonts换为360 CDN
- Angularjs基础(三)
- 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 文档注释
- Kafka核心API——Producer生产者
- Linux Lab v0.5 正式发布,功能强大,用法简单
- Kafka核心API——AdminClient API
- PyQt5 技术篇-调用颜色对话框(QColorDialog)获取颜色,调色板的调用。
- Kafka的安装与配置
- PyQt5 技术篇-如何彻底删除控件?布局移除控件方法。
- PyQt5 技术篇-设置滚动条拉动位置,scrollArea滚动条位置设置方法。
- CentOS8更换yum源后出现同步仓库缓存失败的问题
- log4j配置方式
- 基于MHA搭建MySQL Replication集群高可用架构
- PyQt5 技巧篇-解决相对路径无法加载图片问题,styleSheet通过"相对"路径加载图片,python获取当前运行文件的绝对路径。
- 基于MMM搭建MySQL Replication集群高可用架构
- Python 技术篇-按任意格式灵活获取日期、时间、年月日、时分秒。日期格式化。
- 当删库时如何避免跑路
- Python 句法错误:"SyntaxError: invalid character in identifier",原因及解决方法