Java——关于static关键字的那些事总结

时间:2022-08-22 02:53:38

前言:

  先说说今天为啥要谈这个东西,虽然学Java已经有两年了,但是今天,本着温故而知新的态度,仔细的第三次翻看了《Head Firt Java》这本书,虽然这本书介绍的很多东西都特别基础,但这次阅读感觉还是有不一样的收获,就像我初次邂逅Lambda表达式的感觉一样。

静态方法与非静态方法的区别:

在外部调用静态方法时,可以使用”类名.方法名”的方式,也可以使用”对象名.方法名”的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。

静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制

测试1:静态方法调用非静态方法

public class Test {
public int add(int x,int y){
return x+y;
}
public static void main(String[] args) {
//这里调用了上面的非静态add方法
int result=add(1,3);
System.out.println(result);
}
}

还没运行eclipse就会提示如下错误:

Java——关于static关键字的那些事总结

解决办法:

如果要在一个静态方法里调用一个非静态方法该怎么做?

public class Test {
public int add(int x,int y){
return x+y;
}
public static void main(String[] args) {
//创建包含该方法的对象
Test test=new Test();
//通过该对象调用该方法
int result=test.add(1,3);
System.out.println(result);//控制台输出:4
}
}

  这就是我们平时经常使用的东西,我不知道有多少和我一样没有注意到,反正我是今天才知道main方法中使用非静态方法是这样用的(虽然一直以来我都是这样用而不知道原因),甚至今天才真真认识到:哇,原来main方法是一个静态方法。

其他:

  我们在上面程序的基础上新增加一个类Test2,现在来测试是否能通过this访问静态成员变量以及static是否会改变类中成员的访问权限。

public class Test2 {
static int b=4;
private statci int c=5;
}
package studenthomework;

public class Test {
static int a=3;
//可以通过this访问静态成员变量
public int add(int x,int y){
System.out.println(a+Test2.b);
return x+y;
} public static void main(String[] args) {
//创建包含该方法的对象
Test test=new Test();
//通过该对象调用该方法
int result=test.add(1,3);
System.out.println(result);
}
}

输出结果:

Java——关于static关键字的那些事总结

当Test类访问Test2类中的变量c时会报错

Java——关于static关键字的那些事总结

  测试结果表明可以通过this访问static静态成员变量,另外static关键字不会影响到变量或者方法的作用域(与C/C++中的static不同,区分好两者),在Java中能够影响到访问权限的只有public ,friendly,protected,private这几个关键字。

public static void main(String[] args):

  作为Java程序的入口,这个东西我们或许很常见了。但是之前只是单纯的知道public static void main(String[] args){}方法里面放自己想让Java程序 帮我们做的事,做这些事的方法其他类可能帮我们已经实现了,然后我们创建包含该方法的对象后直接通过该对象调用就行了,而不知道它的确切含义。

  public是权限修饰符,表明任何类或者对象都可以访问这个方法,static表明main()方法是一个静态方法,即方法中的代码是存储在静态存储区的,只要类被加载后就可以使用该方法,不需要通过实例化对象来访问,可以直接通过类名.main()直接访问。JVM在启动时就是按照上述方法的签名(必须有public与static修饰,返回值为void,且方法的参数为字符串数组)来查找方法的入口地址,若能找到就执行,找不到就会报错。void表明方法没有返回值,main是JVM识别的特殊方法名,是程序的入口方法。字符串数组参数args为开发人员提供了在命令行状态下与程序交互的一种手段。

main()方法的定义有如下形式也是合理的:

static public void main(String[] args),public与static没有先后顺序的约束。

public static final void main(String[] args),main方法为final。

static public synchronized void main(String[] args),线程同步的锁机制。

注意:

  同一个.java文件中可以有多个main()方法,每一个类中都可以定义main()方法,但只有与文件名相同的用public修饰的类中的main()方法才能作为整个程序的入口方法。

static{}静态代码块与{}普通代码块:

 

  相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,定义多个时按定义的顺序执行,一般在代码块中对一些static变量进行赋值。

  不同点:静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每new一次就执行一次。非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。

  一般情况下,如果有些代码比如一些项目最常用的变量或对象必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的。如果我们想要设计不需要创建对象就可以调用类中的方法,例如:Arrays类,Character类,String类等,就需要使用静态方法,

  两者的区别是:静态代码块是自动执行的而静态方法是被调用的时候才执行的.

看下面例子:

public class Test {
public Test() {
System.out.print("默认构造方法!-->");
} // 非静态代码块
{
System.out.print("非静态代码块!-->");
}
// 静态代码块
static {
System.out.print("静态代码块!-->");
} public static void test() {
System.out.print("静态方法中的内容! -->");
{
System.out.print("静态方法中的代码块!-->");
} }
public static void main(String[] args) { //Test test = new Test();
Test.test();
}

输出结果:

Java——关于static关键字的那些事总结

public class Test {
public Test() {
System.out.print("默认构造方法!-->");
} // 非静态代码块
{
System.out.print("非静态代码块!-->");
}
// 静态代码块
static {
System.out.print("静态代码块!-->");
} public static void test() {
System.out.print("静态方法中的内容! -->");
{
System.out.print("静态方法中的代码块!-->");
} }
public static void main(String[] args) { Test test = new Test();
//Test.test();
}
}

输出结果:

Java——关于static关键字的那些事总结

  我们发现类中的代码快在创建类时才调用,在调用类中其他方法时代码块不调用,而静态代码块在调用类中的方法时就会调用。

Java——关于static关键字的那些事总结的更多相关文章

  1. java中static关键字的作用

    java中static关键字主要有两种作用: 第一:为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关. 第二,实现某个方法或属性与类而不是对象关联在一起 简单来说,在Java语言中,s ...

  2. Java的static关键字

    本文参考:Java的static关键字 通过static关键字可以满足两方面的需要.一种情形是,只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建任何对象.另一种情形是,希 ...

  3. java的static关键字 – Break易站

    本文内容来自:java的static关键字 – Break易站 (原文网站阅读体验更好) 通过static关键字可以满足两方面的需要.一种情形是,只想为某特定域分配单一存储空间,而不去考虑究竟要创建多 ...

  4. Java面向对象-static关键字、静态方法与普通方法、静态成员变量

    Java面向对象-static关键字.静态方法与普通方法 static关键字的基本作用:方便在没有创建对象的情况下来进行调用(方法/变量). 很显然,被static关键字修饰的方法或者变量不需要依赖于 ...

  5. Java 静态static关键字,main函数,对象的初始化过程,对象调用成员,单例模式的设计,静态代码块(6)

    Java 静态static关键字,静态代码块详情参考:static的使用原理讲解http://www.cnblogs.com/itcqx/p/5519464.html main函数: java Mai ...

  6. 面试官:兄弟,说说Java的static关键字吧

    读者乙在上一篇我去系列文章里留言说,"我盲猜下一篇标题是,'我去,你竟然不知道 static 关键字'".我只能说乙猜对了一半,像我这么有才华的博主,怎么可能被读者猜中了心思呢,必 ...

  7. Java:static关键字小记

    Java:static关键字小记 对 Java 中的 static 关键字,做一个微不足道的小小小小记 static 修饰变量 静态变量:是被 static 修饰的变量,也称为类变量,它属于类,因此不 ...

  8. Java中static关键字的定义

    1.static存在的主要意义 static的主要意义是在于创建独立于具体对象的域变量或者方法.以致于即使没有创建对象,也能使用属性和调用方法! static关键字还有一个比较关键的作用就是 用来形成 ...

  9. [java基础]java中static关键字

    1.static概念 static是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序 ...

随机推荐

  1. 新手看Mockplus

    如今是一个快节奏的社会,每一天都会有无数的软件发布,每一款软件的制作过程不可避免的需要使用原型设计工具.而Mockplus就是一款原型设计软件,可以用于移动端,PC端以及WEB的原型设计.它也符合如今 ...

  2. svn:Repository UUID 'XXX' doesn't match expected UUID 'YYY'

    About a month ago, CodePlex have upgraded their TFS servers to to TFS 2010. While this transition wa ...

  3. tomcat部署两个相同的项目报错不能访问

    需要在同一个tomcat上搭建一个项目的两个版本,都要能跑起来   直接复制两个项目部署,会出现两个错误: 1,webAppKey 冲突 2,tomcat启动会有内存溢出(OutOfMemoryErr ...

  4. [C#] 常用工具类——文件操作类

    /// <para> FilesUpload:工具方法:ASP.NET上传文件的方法</para> /// <para> FileExists:返回文件是否存在&l ...

  5. Activity的任务栈Task以及启动模式与Intent的Flag详解

    什么是任务栈(Task) 官方文档是这么解释的 任务是指在执行特定作业时与用户交互的一系列 Activity. 这些 Activity 按照各自的打开顺序排列在堆栈(即“返回栈”)中. 其实就是以栈的 ...

  6. Spring环境配置

    研究spring3的时候发现一个非常好用的特性:环境配置(spring2是否有此特性未知) 官方演示样例代码例如以下: <!-- app-config.xml --> <beans ...

  7. ExtJS:Grid数据导出至excel实例

    导出函数ExportExcel() var config={ store: alldataStore, title: '测试标题' }; var tab=tabPanel.getActiveTab() ...

  8. 用canvas画弧形进度条

    function toCanvas(id ,progress){ //canvas进度条 var canvas = document.getElementById(id), ctx = canvas. ...

  9. 自动化打包 Jenkins 持续集成 Git Gradle MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  10. data&colon;image&sol;png&semi;base64这什么玩意

    周末下载了个开源的cms系统,基于java. jeecms 这是官网链接 后台页面采用VUE技术全面进行了改版 我勒个去,啥玩意,无非就是js的框架罢了.vue文件 之后再后台管理页面调试的时候发现了 ...