zoukankan      html  css  js  c++  java
  • 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的特征了 下面来回答大部分人的疑问:

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

    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静态优缺点

    优点:对对象的共享数据进行单独空间的存储,节省空间 例如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的主方法");
          }
    }
    
    运行结果:







  • 相关阅读:
    梦的解析 —— 梦知道答案
    梦的解析 —— 梦知道答案
    数学骗术
    数学骗术
    vs 外部依赖项、附加依赖项以及如何添加依赖项目
    vs 外部依赖项、附加依赖项以及如何添加依赖项目
    二叉搜索树相关性质的应用
    Haskell 差点儿无痛苦上手指南
    Android下用Properties保存程序配置
    volatile
  • 原文地址:https://www.cnblogs.com/Jhaiha0/p/8465308.html
Copyright © 2011-2022 走看看