JAVA_SE基础——35.static修饰成员函数
在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的特征了 下面来回答大部分人的疑问:
为什么静态函数中不能访问非静态成员?
静态成员访问非静态成员时,如果非静态成员没有声明对象的情况下,静态函数中不能访问非静态变量。 如果静态成员一定要访问非静态变量的话。可以通过传递一个对象的引用到静态方法里,
测试代码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块
如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
注意:
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的主方法"); } }运行结果: