Java中的static关键字示例

时间:2020-02-23 14:37:18  来源:igfitidea点击:

在本教程中,我们将在中看到关于static关键字java.So 静态关键字可以与以下项关联:

  • 变量
  • 方法
  • 代码块
  • 嵌套类

静态变量:

如果任何实例变量被声明为静态。
它被称为静态变量。

static int countryCounter;

关于静态变量的一些点是:

  • 静态变量属于不对对象的类。
  • 静态变量在课堂加载时仅在类区域中初始化一次
  • 所有对象共享静态变量的单副本
  • 我们无需创建对象以访问静态变量。我们可以使用类名直接访问它。
  • 静态变量也可以通过实例访问Java方法访问。

如果我们创建一个具有两个变量的类,则该类的一个静态,一个非静态。
该类的静态变量(从该类创建的对象)获取其自己的该变量版本。
但是通过静态变量,它属于程序,只有一个。
虽然来自该类的任何对象都可以引用它。
示例:让我们采取一个非常简单的例子。
我们想追踪我们创建的对象数量。
Class.lets中有一个静态变量表示程序是:Country.java

package org.igi.theitroad;
/*
 * @author:igi Mandliya
 */
public class Country {
 
    //static variable
   static int countryCounter;
  
    //instance variable
    String name;
    int dummyCounter;
    Country(String name)
    {
        this.name=name;
        countryCounter++;
        
        dummyCounter++;
    }
  
    public static void main(String[] args)
    {
        System.out.println("");
 
        Country Netherlands=new Country("Netherlands");
        System.out.println("Country Name: "+Netherlands.getName());
        System.out.println("Number of country object created: "+Country.countryCounter);
        System.out.println("Dummy counter not a static variable: "+Netherlands.dummyCounter);
        System.out.println("");
        Country france=new Country("France");
        System.out.println("Country Name: "+france.getName());
        System.out.println("Number of country object created: "+france.countryCounter);
        System.out.println("Dummy counter not a static variable: "+france.dummyCounter);
 
        System.out.println("");
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
 
}

输出:当我们运行上面的程序时,我们将获取以下结果:

Country Name: Netherlands
Number of country object created: 1
Dummy counter not a static variable 1

Country Name: France
Number of country object created: 2
Dummy counter not a static variable 1

在上面的示例中,我们有一个名为"countrycounter"的静态变量,因此每当我们创建一个新对象时,它的值将递增1,因为所有国家对象都是共享的逆向变量,我们只要每当名为"dummycounter"的实例变量创建任何新对象,它的值再次初始化为0。

静态方法:

如果任何方法被声明为静态。
它被称为静态方法。

public static void printCountryCounter()
    {
        System.out.println("Number of country object created: "+countryCounter);
    }

关于静态方法的一些要点是:

  • 静态方法属于不是对象的类。
  • 可以使用ClassName直接调用静态方法。虽然它也可以使用ObjectName调用它
  • 通常静态方法用于获取静态字段。
  • 我们可以通过Java实例方法访问静态方法。
  • 我们无法以静态方法访问非静态方法或者实例变量。
  • 静态方法不能引用此或者超级关键字。

示例:我们将创建上面的示例,并将使用一个静态方法PrintCountryCounter用于打印CountryCounter变量。

Country.java.

package org.igi.theitroad;
/*
 * @author:igi Mandliya
 */
public class Country {
 
    String name;
    static int countryCounter;
    int dummyCounter;
    Country(String name)
    {
        this.name=name;
        countryCounter++;
       
        dummyCounter++;
    }
    
 
    public static void main(String[] args)
    {
        Country Netherlands=new Country("Netherlands");
       
        System.out.println("");
        System.out.println("Country Name: "+Netherlands.getName());
        printCountryCounter();
        System.out.println("Dummy counter not a static variable: "+Netherlands.dummyCounter);
        System.out.println("");
        Country france=new Country("France");
        System.out.println("Country Name: "+france.getName());
        printCountryCounter();
        System.out.println("Dummy counter not a static variable: "+france.dummyCounter);
        System.out.println("");
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
    
    public static void printCountryCounter()
    {
        System.out.println("Number of country object created: "+countryCounter);
    }
}

输出:当我们运行上面的程序时,我们将获取以下结果:

Country Name: Netherlands
Number of country object created: 1
Dummy counter not a static variable 1

Country Name: France
Number of country object created: 2
Dummy counter not a static variable 1

为什么我们无法从静态方法访问非静态成员:

从静态方法调用非静态方法时,我们将获得编译错误。
例如:在上面的printcountrycounter()中,让我们说你调用给getName()你会编译错误。

public static void printCountryCounter()
 
 {
 
        getName();  //Compilation error
 
        System.out.println("Number of country object created: "+countryCounter);
 
 }

想象一下,当你被允许从printcountrycounter()调用getName()时。
我们可以使用类名称调用printcountrycounter(),所以当我们调用printcountrycounter()时,GetName()应该返回的值,因为值可能不同新对象,它将引用哪个值。
因此,这就是为什么,不允许从静态方法调用非静态成员。

静态块:

静态块,是Java类内的一个语句,当一个类首先加载到JVM时将被执行

关于静态块的一些点是:

  • 静态块用于初始化静态数据成员。
  • 静态块在主方法执行之前执行。
package org.igi.theitroad;
public class StaticBlockExample {
 
    /**
 
     * @Author:igi Mandliya
 
     */
 
    static{
        System.out.println("This block will get call before main method");
    }
 
    public static void main(String[] args) {
        
        System.out.println("In main method");
    }
}

输出:当我们运行上面的程序时,我们将获取以下结果:

This block will get call before main method
In main method

静态类:

在Java中,我们可以在另一个类中定义一个类。
这样的类被称为嵌套类。
封闭嵌套类的类被称为外部类。
在Java中,我们无法制作外层静态。

只能声明为静态的嵌套类

关于嵌套静态类的一些点数是:

  • 嵌套的静态类不需要外表的参考。
  • 静态类无法访问外部类的非静态成员。它只能访问外部类的静态成员,包括私有。

例子:

package org.igi.theitroad;
/*
 * @author:igi Mandliya
 */
public class OuterClass {
 
 
    static class InnerStaticClass{
       
        public void printInnerClass()
        {
            System.out.println("In inner class");
        }
    }
       
    public static void main(String[] args)
    {
       
       
        System.out.println("");
        OuterClass.InnerStaticClass inc=new OuterClass.InnerStaticClass();
        inc.printInnerClass();
        System.out.println("");
    }
 
    public static void printOuterClass()
    {
        System.out.println("In outer class");
    }
    
}

输出:当我们运行上面的程序时,我们将获取以下结果:

In inner class