首页 > 编程语言 >Java:static关键字

Java:static关键字

时间:2023-05-16 18:22:27浏览次数:31  
标签:Java 变量 静态 class 关键字 static public

(一)static关键字的基本用法

1.static关键字基本概念

我们可以一句话来概括:方便在没有创建对象的情况下来进行调用

也就是说:被static关键字修饰的不需要创建对象去调用,直接根据类名就可以去访问

2.static关键字修饰类

Java里面static一般用来修饰成员变量或函数。但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以。下面看看如何使用。

public class StaticTest {
    //static关键字修饰内部类
    public static class InnerClass{
        InnerClass(){
            System.out.println("============= 静态内部类=============");
        }
        public void InnerMethod() {
            System.out.println("============= 静态内部方法=============");
        }
    }
    public static void main(String[] args) {
        //直接通过StaticTest类名访问静态内部类InnerClass
        InnerClass inner=new StaticTest.InnerClass();
        //静态内部类可以和普通类一样使用
        inner.InnerMethod();
    }
}
/*  输出是
 * ============= 静态内部类=============
 * ============= 静态内部方法=============
 */

如果没有用static修饰InterClass,则只能new 一个外部类实例。再通过外部实例创建内部类。

3.static关键字修饰方法

修饰方法的时候,其实跟类一样,可以直接通过类名来进行调用:

 
public class StaticMethod {
    public static void test() {
        System.out.println("============= 静态方法=============");
    };
    public static void main(String[] args) {
        //方式一:直接通过类名
        StaticMethod.test();
        //方式二:
        StaticMethod fdd=new StaticMethod();
        fdd.test();
    }
}

4.static关键字修饰变量

被static修饰的成员变量叫做静态变量,也叫做类变量,说明这个变量是属于这个类的,而不是属于是对象,没有被static修饰的成员变量叫做实例变量,说明这个变量是属于某个具体的对象的。

我们同样可以使用上面的方式进行调用变量:

public class StaticVar {
    private static String name="java的架构师技术栈";
    public static void main(String[] args) {
        //直接通过类名
        StaticVar.name;
    }
}

5.static关键字修饰代码块

静态代码块在类第一次被载入时执行,在这里主要是想验证一下,类初始化的顺序。
  1. 父类静态变量
  2. 父类静态代码块
  3. 子类静态变量
  4. 子类静态代码块
  5. 父类普通变量
  6. 父类普通代码块
  7. 父类构造函数
  8. 子类普通变量
  9. 子类普通代码块
  10. 子类构造函数

代码验证一下:

首先我们定义一个父类

public class Father{
    //父类静态代码块
    static{
        System.out.println("Father static");
    }
    //父类构造函数
    public Father(){
        System.out.println("Father constructor");
    }
}

然后定义一个子类

public class Son extends Father{
    //静态代码块
    static{
        System.out.println("Son static");
    }
    //构造方法
    public Son(){
        System.out.println("Son constructor");
    }
    public static void main(String[] args) {
        new Son();
    }
}

看个结果

(二)深入分析static关键字

上面我们只是描述了一下static关键字的基本使用场景,下面主要解析一下static关键字的深层原理。

1.JVM内存

要理解static为什么会有上面的特性,首先我们还需要从jvm内存说起。我们先给出一张java的内存结构图,然后通过案例描述一下static修饰的变量存放在哪?

从上图我们可以发现,静态变量存放在方法区中,并且是被所有线程所共享的。这里要说一下java堆,java堆存放的就是我们创建的一个个实例变量。

堆区: 

  1. 存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
  2. jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 

栈区:

  1. 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
  2. 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
  3. 栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

方法区: 

  1. 又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
  2. 方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

下面通过一个案例说明一下,从内存的角度来看,static关键字为什么会有这样的特性。

首先我们定义一个类

public class Person {
    //静态变量
    static String firstName;
    String lastName;
    public void showName(){
        System.out.println(firstName+lastName);
    }
    //静态方法
    public static void viewName(){
      System.out.println(firstName);
    }
    
    public static void main(String[] args) {
        Person p =new Person();
        Person.firstName = "张";
        p.lastName="三";
        p.showName();
        
        Person p2 =new Person();
        Person.firstName="李";
        p2.lastName="四";
        p2.showName();
    }
}
//输出。张三、李四

 

标签:Java,变量,静态,class,关键字,static,public
From: https://www.cnblogs.com/imreW/p/17406453.html

相关文章

  • Java public、protected、default和private四种修饰符区别
    一、相同点都是修饰符二、不同点访问权限不同public任何地方都可以访问,被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。****protected修饰符,权限介于public与default之间。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类......
  • C++:全局变量和static变量初始化
    (一)全局变量全局变量、文件域中的静态变量、类中的成员静态变量在main函数执行前初始化;局部变量中的静态变量在第一次调用时初始化。C++保证,全局变量在main函数第一次使用它之前,就把它初始化好。(可以直接理解成在main函数执行前就初始化好)但这个初始化可细分为:编译时初始化和运......
  • java 获取ip
     获取ip信息publicstaticStringgetRealIp(HttpServletRequestrequest){Stringip=request.getHeader("x-forwarded-for");if(ip==null||ip.length()==0||"unknown".equalsIgnoreCase(ip)){ip=request.g......
  • Java Instant 创建和使用
    JavaInstant创建和使用 JavaInstant是一个日期和时间相关的类,它表示时间轴上的一个点,精确到纳秒。在Java8中引入了Instant类,可以方便地进行时间戳的操作和转换。创建Instant实例可以通过以下几种方式: 1、使用now()方法获取当前时间的Instant对象Instant......
  • Java网络编程----通过实现简易聊天工具来聊聊BIO
    IO模型即输入输出模型,我们今天主要来聊的是java网络编程中的IO模型---BIO模型。BIO即阻塞式IO,BlockingIOblocking[ˈblɒkɪŋ]v. 堵塞;阻塞;堵住(某人的路等);挡住(某人的视线等);妨碍;阻碍;那究竟什么是阻塞呢?这里的阻塞和多线程并发控制中,对未持有锁的线程进行同步阻......
  • Java中ArrayList集合类的使用
    一、概述什么是ArrayList?ArrayList类是可以动态修改的数组,没有固定的大小限制,可以添加、删除、修改、遍历元素。ArrayList继承了AbstractList,实现了List接口。二、ArrayList的使用1、在使用前需要导入包: 1importjava.util.ArrayList; 2、初始化: 1ArrayList<E>objec......
  • Java学习笔记
    一、JAVA发展简史1.JAVA的诞生​在1991年时候,詹姆斯·高斯林(JamesGosling)在SUN公司的工程师小组想要设计这样一种小型计算机语言。该语言主要用于像电视盒这样的消费类电子产品。2.JAVA的发展史1991年,Sun公司的Green项目(Oak语言)1995年,推出JAVA测试版1996......
  • 01初识Java
    初识java一、Java特性简单性,相当于C++语法的一个“纯净版本”;面向对象;分布式(微服务),Java有丰富的例程库,用于处理像HTTP和FTP之类的TCP/IP协议;健壮性,Java与C++最大的不同在于Java采用的指针模型可以消除重写内存和损坏数据的可能性。不仅如此,Java编译器能够检测许多......
  • 用Java集合中的Collections.sort方法对list排序的两种方法
    用Collections.sort方法对list排序有两种方法[color=darkblue][b]第一种是list中的对象实现Comparable接口[/b][/color],如下:/***根据order对User排序*/publicclassUserimplementsComparable{privateStringname;privateIntegerorder;publicStringge......
  • BeanUtils beanjavaBean与Map互转
    importjava.lang.reflect.InvocationTargetException;importjava.util.Map;importorg.apache.commons.beanutils.BeanUtils;publicclasstest{publicstaticvoidmain(String[]args){Personperson1=newPerson();person1.......