在Java中适用static关键字修饰的方法称为静态方法。

声明静态方法的语法格式如下:

权限修饰符 static 数据类型 方法名(){

方法体

}

静态方法

可以使用类名直接调用     类名.方法名()

1:静态函数中不能访问非静态成员变量,只能访问静态变量。

2:静态方法不可以定义this,super关键字.

3:非静态函数:非静态函数中可以访问静态成员变量

p.s.

静态成员: 静态变量或者是静态函数

声明为static的类成员或者成员函数便能在类的范围内共同享,我们把这样的成员称做静态成员和静态成员函数。

测试代码1(证明静态代码可以直接用类名调用):

class Test{
public static void printInfo(){
System.out.println("静态方法被调用");
} public static void main(String[] args){
Test.printInfo();
}
}

运行结果:

测试代码2(证明:静态函数中不能访问非静态成员):

class Test{

	int a = 2 ;

	public static void printInfo(){
System.out.println(a);
} public static void main(String[] args) {
Test.printInfo();
}
}

运行结果:

测试代码3(证明:静态函数只能访问静态成员):

class Test{

	static int a = 2 ;

	public static void printInfo(){
System.out.println("a = :"+a);
} public static void main(String[] args) {
Test.printInfo();
}
}

运行结果:

测试代码4(静态方法不可以定义this,super关键字(super以后讲到这里先略过).):

class Test{

	static int a = 2 ;

	public static void printInfo(){
System.out.println(this.a);
} public static void main(String[] args) {
Test.printInfo();
}
}

运行结果:

测试代码5(非静态函数中可以访问静态成员):

class Test{

	static int a = 2 ;

	public static void printInfo_1(){
System.out.println("静态方法被非静态方法调用中.....");
}
public void printInfo(){
printInfo_1();
System.out.println("a="+a);
} public static void main(String[] args) {
Test b = new Test();
b.printInfo();
}
}

运行结果:

证明完了static的特征了 下面来回答大部分人的疑问:

为什么静态函数中不能访问非静态成员?

java编程思想第四版中文版86页作者提到的,静态方法内部不能调用非静态方法,这不是绝对的,我们可以传递一个对象的引用到静态方法里,

静态成员访问非静态成员时,如果非静态成员没有声明对象的情况下,静态函数中不能访问非静态变量。  如果静态成员一定要访问非静态变量的话。可以通过传递一个对象的引用到静态方法里,

测试代码6(传递一个对象的引用到静态方法里,让静态成员能访问到非静态变量):

public class Test{    

	int a = 1;
Test(int a){
this.a = a;
}
public static void ask(Test x){
x.say();
}
public void say(){
System.out.println("a="+a);
}
public static void main(String[] args){
Test c = new Test(2);
c.ask(c);
}
}

运行结果:

static特点

1 随着类的加载而加载,静态会随着类的加载而加载,随着类的消失而消失。说明它的生命周期很长。

2 优先于对象存在。-->静态是先存在,对象是后存在。

3 被所有实例(对象)所共享。

4 可以直接被类名调用

静态变量(类变量)和实例变量的区别:

1存放位置

①:类变量随着类的加载而加载存在于方法区中.

②:实例变量随着对象的建立而存在于堆内存中.

2生命周期

①:类变量生命周期最长,随着类的消失而消失.

②:实例变量生命周期随着对象的消失而消失.

3静态优缺点

优点:对对象的共享数据进行单独空间的存储,节省空间 例如Person 都有国籍。该数据可以共享可以被类名调

缺点:生命周期过长

访问出现局限性。(静态只能访问静态)

什么时候定义静态变量

1:静态变量(类变量)当对象中出现共享数据

例如:学生的学校名称。学校名称可以共享

对象的数据要定义为非静态的存放在对内存中(学生的姓名,学生的年龄)

什么时候定义静态函数

如果功能内部没有访问到非静态数据(对象的特有数据。那么该功能就可以定义为静态)

P.S.

静态方法作为类和接口的重要组成部分,可以通过类名或接口直接访问,通常将那些使用频率较高的方法声明为静态方法,从而可以方便地使用这些方法,并能提高程序的开发效率和性能。

static块

静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。

如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。

注意:
1 静态代码块不能存在于任何方法体内。
2 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。


测试代码7(静态代码块优于主方法执行):
class Code{

    static{
System.out.println("Code的静态代码块");
}
} public class CodeBlock{
static{
System.out.println("CodeBlock的静态代码块");
} public static void main(String[] args){
System.out.println("CodeBlock的主方法");
}
}

运行结果:








JAVA_SE基础——35.static修饰成员函数的更多相关文章

  1. JAVA_SE基础——34.static修饰成员变量

    需求:描述一下学校的学生.  特点:都是中国人.... 测试代码1: class Student{ String name; String country = "中国"; //国籍 ...

  2. 【c++基础】static修饰的函数作用与意义

    static修饰的函数作用与意义 static修饰的函数叫做静态函数,静态函数有两种,根据其出现的地方来分类: 如果这个静态函数出现在类里,那么它是一个静态成员函数: 静态成员函数的作用在于:调用这个 ...

  3. .static 和const分别怎么用,类里面static和const可以同时修饰成员函数吗。

    static的作用: 对变量: 1.局部变量: 在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量. 1)内存中的位置:静态存储区 2)初始化:局部的静态变量只能被初始化一次, ...

  4. C++基础-4-封装(构造函数与析构函数,深拷贝与浅拷贝,静态成员,this,友元,const修饰成员函数)

    4. 封装 4.1.1 封装的意义 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 con ...

  5. C++ static类成员,static类成员函数

    转载:ZJE_ANDY static修饰类中成员,表示类的共享数据 1.static类成员 C++primer里面说过,static类成员不像普通的类数据成员,static类数据成员独立于一切类对象处 ...

  6. C++之static类成员,static类成员函数

    0.static修饰类中成员,表示类的共享数据 1.static类成员 在C++primer里面说过,static类成员不像普通的类数据成员,static类数据成员独立于一切类对象处在.static类 ...

  7. 转载----c++ static修饰的函数作用与意义

    static修饰的函数叫做静态函数,静态函数有两种,根据其出现的地方来分类: 如果这个静态函数出现在类里,那么它是一个静态成员函数: 静态成员函数的作用在于:调用这个函数不会访问或者修改任何对象(非s ...

  8. const 修饰成员函数 前后用法(effective c++ 03)

    目录 const在函数后面 const修饰成员函数的两个作用 const在函数前面 总结 const在函数后面 类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态 ...

  9. JAVA_SE基础——42.final修饰符

    高手勿喷~ final关键字可用于修饰类.变量和方法,它有"这是无法改变的"或者"最终"的含义,因此被final修饰的类.变量和方法将具有以下特征: 1.fin ...

随机推荐

  1. python PEP8相关介绍

    在学习了python相关技术之后,开始重视其开发规范,以满足代码的可读性以及可维护性.主要的是学习了PEP8-style for python code的相关内容. 代码布局 缩进:每一级4个缩进.连 ...

  2. 封装好的MD5加密

    /** * 不可逆加密类 为密码提供不可逆的加密运算,使用MD5算法 * * 使用方法: MD5 encrypt = new MD5(); encrypt.getMD5ofStr(str); //返回 ...

  3. c# List实现原理

    在研究前辈们写的代码,总是搞不明白.word文中引文的索引和引文列表中的索引对应关系是什么呢?是如何对应上的?我冥思苦想,昨天又系统地看了下代码,才所有悟,所以记录下我的探索过程. 如下图所示: 图1 ...

  4. fitnesse - 安装部署

    fitnesse - 安装部署 2017-09-29 1 先决条件Java环境 确保机器上装了java, java -version 2 安装fitnesse http://fitnesse.org/ ...

  5. handsontable 事件汇总

    Hook插件 afterChange (changes: Array, source: String):1个或多个单元格的值被改变后调用 changes:是一个2维数组包含row,prop,oldVa ...

  6. python数据库连接池设计

    一.背景: 传统访问资源,一般分为一下几个步骤: 1.实例数据驱动对象与链接资源.2.实例操作资源游标.3.获取资源.4.关闭链接资源. 根据以上步骤,我们可以很简单使用这个原始方法来访问资源为我们业 ...

  7. Selenium和Firefox兼容问题

    运行时遇到错误: org.openqa.selenium.firefox.NotConnectedException: Unable to connect to host 127.0.0.1 on p ...

  8. Hadoop搭建全程

    修改配置文件 cd /etc/sysconfig/network-scripts  #进入网络配置目录 dir ifcfg*                         #找到网卡配置文件 ifc ...

  9. git远程提交失败

    同步仓库并解决403报错 这时候对本地仓库和github进行同步 # git push -u origin master error: The requested URL returned error ...

  10. SSM 使用 mybatis 分页插件 pagehepler 实现分页

    使用分页插件的原因,简化了sql代码的写法,实现较好的物理分页,比写一段完整的分页sql代码,也能减少了误差性. Mybatis分页插件 demo 项目地址:https://gitee.com/fre ...