我说Java完全面向对象,老大过来就是一jio

【Java基础知识 33】Java 中的 static 关键字详解 在 JVM 加载一个类的时候,若该类存在 static 修饰的成员变量和成员方法,则会为这些成员变量和成员方法在固定的位置开辟一个固定大小的内存区域,有了这些“固定”的特性,那么 JVM 就可以非常方便地访问他们。............... 阅读详情

PS:最近又赶上跳槽的高峰期,好多粉丝,都问我要有没有最新面试题,我连日加班好多天,终于整理好了,16000+ 道,295多份,多份面试题大全,我会持续更新中,马上就会整理更多!【文末有领取方式】

好了,回归正题,哈喽,大家好,我是指北君。
自从开始学Java,就知道Java是一门面向对象编程的语言,所以在指北君眼中,Java就是完全面向对象的。
有一天老大问到我这个事情,我脱口而出,结果老大过来就是一jio…

老大问我说static关键词是面向对象的吗?没有对象,能不能调用static关键词修饰的方法,变量,我瞬间哑口无言。

于是,我绞尽脑汁,写下了这篇文章,彻底搞懂了 static 关键词的用法。

static 是Java的一个关键字,可以用来修饰成员变量、修饰成员方法、构造静态代码块、实现静态导包以及实现静态内部类,下面我们来分别介绍。

1、修饰成员变量

用 static 修饰成员变量可以说是该关键字最常用的一个功能,通常将用 static 修饰的成员变量称为类成员或者静态成员,那么静态成员和不用 static 修饰的非静态成员有什么区别呢?

我们先看看不用 static 修饰的成员变量在内存中的构造。

package com.ys.bean;

/**
 * Create by YSOcean
 */
public class Person {
    private String name;
    private Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //get和set方法省略
}

首先,我们创建一个实体类 Person,有两个属性 name 和 age,都是普通成员变量(没有用 static 关键字修饰),接着我们通过其构造方法创建两个对象:

Person p1 = new Person("Tom",21);
Person p2 = new Person("Marry",20);
System.out.println(p1.toString());//Person{name='Tom', age=21}
System.out.println(p2.toString());//Person{name='Marry', age=20}

这两个对象在内存中的存储结构如下:

图片
由上图可知,我们创建的两个对象 p1 和 p2 存储在堆中,但是其引用地址是存放在栈中的,而且这两个对象的两个变量互相独立,我们修改任何一个对象的属性值,是不改变另外一个对象的属性值的。

下面我们将 Person 类中的 age 属性改为由 static 关键字修饰:

package com.ys.bean;

/**
 * Create by YSOcean
 */
public class Person {
    private  String name;
    private static Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //get和set方法省略

}

同样我们还是向上面一样,创建 p1 和 p2 两个对象,并打印这两个对象,看看和上面打印的有啥区别呢?

Person p1 = new Person("Tom",21);
Person p2 = new Person("Marry",20);
System.out.println(p1.toString());//Person{name='Tom', age=20}
System.out.println(p2.toString());//Person{name='Marry', age=20}

我们发现第三行代码打印的 p1 对象 age 属性变为 20了,这是为什么呢?

图片
这是因为用在 jvm 的内存构造中,会在堆中开辟一块内存空间,专门用来存储用 static 修饰的成员变量,称为静态存储区,无论我们创建多少个对象,用 static 修饰的成员变量有且只有一份存储在静态存储区中,所以该静态变量的值是以最后创建对象时设置该静态变量的值为准,也就是由于 p1 先设置 age = 21,后来创建了 p2 对象,p2将 age 改为了20,那么该静态存储区的 age 属性值也被修改成了20。

PS:在 JDK1.8 以前,静态存储区是存放在方法区的,而方法区不属于堆,在 JDK1.8 之后,才将方法区干掉了,方法区中的静态存储区改为到堆中存储。

总结:static 修饰的变量被所有对象所共享,在内存中只有一个副本。由于与对象无关,所以我们可以直接通过 类名.静态变量 的方式来直接调用静态变量。对应的非静态变量是对象所拥有的,多少个对象就有多少个非静态变量,各个对象所拥有的副本不受影响。

2、修饰修饰成员方法

用 static 关键字修饰成员方法也是一样的道理,我们可以直接通过 类名.静态方法名() 的方式来调用,而不用创建对象。

public class Person {
    private  String name;
    private static Integer age;

    public static void printClassName(){
        System.out.println("com.ys.bean.Person");
    }
    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //get和set方法省略

}

调用静态方法:

Person.printClassName();//com.ys.bean.Person

3、静态代码块

用 static 修饰的代码块称为静态代码块,静态代码块可以置于类的任意一个地方(和成员变量成员方法同等地位,不可放入方法中),并且一个类可以有多个静态代码块,在类初次载入内存时加载静态代码块,并且按照声明静态代码块的顺序来加载,且仅加载一次,优先于各种代码块以及构造函数。

public class CodeBlock {
    static{
        System.out.println("静态代码块");
    }
}

由于静态代码块只在类载入内存时加载一次的特性,我们可以利用静态代码块来优化程序性能,比如某个比较大配置文件需要在创建对象时加载,这时候为了节省内存,我们可以将该配置文件的加载时机放入到静态代码块中,那么我们无论创建多少个对象时,该配置文件也只加载了一次。

4、静态导包

用 static 来修饰成员变量,成员方法,以及静态代码块是最常用的三个功能,静态导包是 JDK1.5以后的新特性,用 import static 包名 来代替传统的 import 包名 方式。那么有什么用呢?

比如我们创建一个数组,然后用 JDK 自带的 Arrays 工具类的 sort 方法来对数组进行排序:

package com.ys.test;

import java.util.Arrays;
/**
 * Create by YSOcean
 */
public class StaticTest {

    public static void main(String[] args) {
        int[] arrays = {3,4,2,8,1,9};
        Arrays.sort(arrays);
    }
}

我们可以看到,调用 sort 方法时,需要进行 import java.util.Arrays 的导包操作,那么变为静态导包呢?

package com.ys.test;

import static java.util.Arrays.*;
/**
 * Create by YSOcean
 */
public class StaticTest {

    public static void main(String[] args) {
        int[] arrays = {3,4,2,8,1,9};
        sort(arrays);
    }
}

我们可以看到第三行代码的 import java.util.Arrays 变为了 import static java.util.Arrays.*,意思是导入 Arrays 类中的所有静态方法,当然你也可以将 * 变为某个方法名,也就是只导入该方法,那么我们在调用该方法时,就可以不带上类名,直接通过方法名来调用(第 11 行代码)。

静态导包只会减少程序员的代码编写量,对于性能是没有任何提升的(也不会降低性能,Java核心技术第10版卷1第148页4.7.1章节类的导入有介绍),反而会降低代码的可读性,所以实际如何使用需要权衡。

5、静态内部类

首先我们要知道什么是内部类,定义在一个类的内部的类叫内部类,包含内部类的类叫外部类,内部类用 static 修饰便是我们所说的静态内部类。

定义内部类的好处是外部类可以访问内部类的所有方法和属性,包括私有方法和私有属性。

访问普通内部类,我们需要先创建外部类的对象,然后通过外部类名.new 创建内部类的实例。

package com.ys.bean;

/**
 * Create by hadoop
 */
public class OutClass {

    public class InnerClass{

    }
}

  * OuterClass oc = new OuterClass();
  * OuterClass.InnerClass in = oc.new InnerClass();

访问静态内部类,我们不需要创建外部类的对象,可以直接通过 外部类名.内部类名 来创建实例。

package com.ys.bean;

/**
 * Create by hadoop
 */
public class OutClass {

    public static class InnerClass{

    }
}

OuterClass.StaticInnerClass sic = new OuterClass.StaticInnerClass();

6、常见问题

①、静态变量能存在于普通方法中吗?

能。很明显,普通方法必须通过对象来调用,静态变量都可以直接通过类名来调用了,更不用说通过对象来调用,所以是可以存在于普通方法中的。

②、静态方法能存在普通变量吗?

不能。因为静态方法可以直接通过类名来直接调用,不用创建对象,而普通变量是必须通过对象来调用的。那么将普通变量放在静态方法中,在直接通过类来调用静态方法时就会报错。所以不能。

③、静态代码块能放在方法体中吗?

不能。首先我们要明确静态代码块是在类加载的时候自动运行的。

普通方法需要我们创建对象,然后手工去调用方法,所静态代码块不能声明在普通方法中。

那么对于用 static 修饰的静态方法呢?同样也是不能的。因为静态方法同样也需要我们手工通过类名来调用,而不是直接在类加载的时候就运行了。

也就是说静态代码块能够自动执行,而不管是普通方法还是静态方法都是需要手工执行的。

④、静态导包会比普通导包消耗更多的性能?

不会。静态导包实际上在编译期间都会被编译器进行处理,将其转换成普通按需导包的形式,所以在程序运行期间是不影响性能的。

⑤、static 可以用来修饰局部变量吗?

不能。不管是在普通方法还是在静态方法中,static 关键字都不能用来修饰局部变量,这是Java的规定。稍微想想也能明白,局部变量的声明周期是随着方法的结束而结束的,因为static 修饰的变量是全局的,不与对象有关的,如果用 static 修饰局部变量容易造成理解上的冲突,所以Java规定 static 关键字不能用来修饰局部变量。

7、小结

好了,这就是Java中对 static 关键词的介绍,这下大家都清楚了吧,面向对象的漏网之鱼。

我是指北君,操千曲而后晓声,观千剑而后识器。感谢各位人才的:点赞、收藏和评论,我们下期更精彩!

**面试大全包括:**包括 Java 集合、JVM、多线程、并发编程、设计模式、SpringBoot、SpringCloud、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!

领取方式:扫描下方公众号【Java技术指北】回复【面试大全】即可获取

图片

Java技术指北

Java技术指北

回复:java,获取精华资料。专注分享Java技术干货、Java 技术、Spring 全家桶、JavaWeb、多线程、JVM、Spring Boot、Spring Cloud、Dubbo、架构设计、微服务、面试题、Java最新动态等。

43篇原创内容

公众号

图相似度模型(论文篇) 图相似度模型 阅读详情

相关推荐

ELK 企业级日志分析系统(1)

ELK平台是一套完整的日志集中处理解决方案,将、Logstash和Kiabana三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。ElasticSearch:是基于Lucene(一个全文检索引擎的架构)开发的分布式存储检索引擎,用来存储各类日志。Elasticsearch 是用 Java 开发的,可通过 RESTful Web 接口,让用户可以通过浏览器与 Elasticsearch 通信。

云计算运维工程师的成长之路 1864

Java关键字(三)——static


   我们说Java是一种面向对象编程的语言,而对象是把数据及对数据的操作方法放在一起,作为一个相互依存的整体,对同类对象抽象出其共性,便是Java中的类,我们可以用类描述世间万物,也可以说万物皆对象。但是这里有个特殊的东西——static,它不属于对象,那么为什么呢?
   static 是Java的一个关键字,可以用来修饰成员变量、修饰成员方法、构造静态...

IT可乐 385

实战指南:基于华为Ascend NPU的大模型W8A8量化调优与精度提升

本文提供了一份基于华为Ascend NPU进行大模型W8A8量化的实战调优指南。详细介绍了从环境搭建、使用msmodelslim框架进行基础量化,到通过离群值抑制、校准集优化和量化回退等关键技术提升精度的全流程。旨在帮助开发者在华为NPU硬件上实现模型推理的显著加速,同时有效控制精度损失。

weixin_29227425的博客 271

java8 jvm odf_jdk8中的jvm(转载)

一:JVM中内存JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用运行线程方法存放本地暂时变量与线程中方法运行时候须要的引用对象地址。JVM全部的对象信息都存放在堆内存中。相比栈内存,堆内存能够所大的多,所以JVM一直通过对堆内存划分不同的功能区块实现对堆内存中对象管理。堆内存不够最常见的错误就是OOM(OutOfMemoryError)栈内存溢出最常见的错误就是StackOver...

weixin_34307029的博客 526

从零构建基于ZYNQ与AD9361的SDR信号源:FPGA逻辑与射频前端的协同设计

本文详细介绍了从零开始构建基于ZYNQ与AD9361的SDR信号源的完整流程。通过解析FPGA逻辑与射频前端的协同设计,重点阐述了如何利用FPGA生成基带信号,并通过ARM处理器配置AD9361,最终实现一个可编程的2.4GHz载波信号发生器。内容涵盖硬件选型、Vivado环境搭建、AXI总线通信、LVDS接口设计及软件驱动开发,为SDR开发者提供了实用的实战指南。

weixin_29200485的博客 214

win10离线安装.NetFrameWork3.5出现0x800F081F解决办法。

由于公司开发环境是内网,并且安装arcgis10.2又需要.NetFrameWork3.5的环境,安装.NetFrameWork3.5的又总是报错“0x800F081F”找不到源文件。折腾了两天总算解决了。 首先我们能在网上搜索到的教程,你一定看到过这样的教程,就是使用下面的命令来进行安装。 dism /online /Enable-Feature /Featu...

AIGIS的博客 1万+

java static 详解

1、static目的 java中的static关键字主要用于内存管理。 2、static范围 使用范围:java static关键字可以用在变量、方法、代码块和嵌套类伤。 作用范围:static关键字属于类,而不是类的实例。 静态(static)修饰如下: 变量:称为类变量、静态变量 方法:称为类方法、静态方法 代码块:称为静态代码块 嵌套类:称为静态内部类 3、静态变量 类的成员变量可以分为以下两种: 静态变量(或称为类变量),指被 static 修饰的成员变量。 实例变量,指没.

春风化雨 6万+

手把手教你学 NPU 驱动开发--第一部分:基础准备 开发环境搭建:Linux 内核编译与 NPU 仿真平台配置

摘要:本文详细介绍了搭建Linux内核编译与NPU仿真平台的完整流程。主要内容包括:1) 准备ARM64交叉编译工具链;2) 编译支持KGDB调试的Linux内核;3) 构建最小根文件系统;4) 使用QEMU模拟自定义NPU设备;5) 配置KGDB调试环境。文章重点讲解了如何通过修改设备树添加虚拟NPU设备,并提供了开源NPUIP Gemmini作为实验对象。最后展示了简单的"Hello NPU"驱动验证方法,为后续NPU驱动开发奠定了基础。文中还附有常用命令速查表,方便开发者快速搭建调

MHD0815的博客 384

java中static关键字的使用说明

1、static关键字的用途  在《Java编程思想》P86页有这样一段话:   “static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”   这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简...

奋斗的哼哼 3万+

(十一)随机性与独立性回顾

随机性与独立性回顾

旺旺的碎冰冰~的博客 1017

Windows 11 安装 Maven:下载、安装、配置国内镜像、验证

本文详细介绍了在 Windows 11 系统中安装与配置 Apache Maven 的完整流程,包括 JDK 环境准备、Maven 下载解压、本地仓库路径设置、阿里云国内镜像加速配置、环境变量设置及安装验证。同时提供了常用 Maven 命令速查表,帮助开发者快速上手依赖管理与项目构建,提升开发效率。

寒水馨 · 轻量级技术文档 · hanshuixin.org 1505

面向对象进阶--static关键字及应用,继承的概念知识点

面向对象进阶--static关键字及应用,继承的概念知识点

两点 1255

zynq的vitis工程烧录到Winbond(华邦)型号W25Q256JVEQ的QSPI FLAHS

vitis2023.1直接支持W25Q256JVEQ。

FPGA艺术家的博客 678

理解Java中的static关键字

Static 关键字 在类中,用static声明的成员变量为静态成员变量,或者叫做:类属性,类变量。 特点 它为该类的公用变量,属于类,对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享,在类被载入时被显式初始化。 可以使用“对象.类属性”来调用。不过,一般都是用“类名.类属性”。 Static变量置于方法区中! 用static声明的方法为静态方法,不需要对象,就可以调用(...

weixin_45797022的博客 2490

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java中【static关键子--静态变量,静态方法,原理图解】简单介绍

1.static关键字 1.1概述  关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了 1.2 定义和使用格式  当 static 修饰成员变量时,该变量称为类变量。该类的每个对象都共享同一个类变量的值。任何对象都可以更改该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作。 静态变量 类变量:使用 static关键字修饰的成员变量。 定义格式: static 数据类型

qq_43436117的博客 1652

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java中的static详细总结学习,一篇就够了

java有关静态知识的学习,看完一定有收获

csdnnbyyds的博客 3264

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java中static关键字的使用与练习

在Java编程中,`static`关键字是一个非常重要的概念,它用于修饰类的成员变量和方法。通过`static`关键字,我们可以创建与类本身关联而不是与类的实例关联的成员。下面,我们将详细探讨`static`关键字在Java中的使用,并通过一些简单的练习来加深理解。

qq_36720723的博客 1125

Java类的static成员以及代码块(详细版)

在Java的类中一般定义有成员属性,以及成员方法两种,但实际上两种可以算为一类,但还可以定义另外一种,就是被static修饰的变量和方法,被static修饰的变量称之为静态变量,也可以叫类变量;被static修饰的方法被称之为静态方法,也可以叫类方法。被static修饰的成员,最大的特性就是其不属于对象,不依靠对象,这也就意味着被static修饰的成员在没有实例化对象的情况下就可以使用,被static修饰的成员其属于类,是所有对象所共享的,可以直接使用类名访问并调用。

L326214的博客 2024

深度理解Java中的static

目录 一、static的用法: 二、static的误区(问题思考) 三、问题思考: 一、static的用法: static可以用来修饰类的成员方法、类的成员变量、类中的内部类(以及用static修饰的内部类中的变量、方法、内部类),另外可以编写static代码块来优化程序性能。 作用: 方便在没有创建对象的情况下来进行调用(方法/变量)。 被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。 ①修饰类的成员变量: static.

Ariel_欢 1万+

高频面试题:类初始化和实例初始化等

文章目录问题解析类初始化过程实例初始化过程 问题 现有以下代码,最后的输出是什么? public class Father { private int i = method(); private static int j = staticMethod(); static { System.out.println("(父类静态代码块2)"); } Father() { System.out.println("(父类无参构造器代码)"); } { System.out.println

YonminMa的博客 1473

Java不是完全面向对象的,有了解过么

Java不是完全面向对象的,有了解过么

大连赵哥的博客 712

java之static详细总结

static也叫静态,可以修饰成员变量、成员方法。

qq_62636650的博客 1846

Java中Static关键字的四种用法

java、static

weixin_35282769的博客 6495

【Java 基础】-- Java static 关键字详解

本文通过详细的对比分析,希望能帮助你更好地理解。关键字表示“静态”,用于修饰成员变量、方法、代码块和内部类。其核心作用是让修饰的成员属于类本身,而不是类的实例。静态变量属于类本身,而不是某个具体的实例。无论创建多少个对象,静态变量在内存中都只有一份拷贝。关键字是 Java 中的一个重要概念,广泛应用于类的变量、方法、代码块和内部类。它只能访问静态成员,不能访问实例变量。的用法,不仅能优化代码结构,还能提高程序的性能。静态代码块在类加载时执行,通常用于初始化静态变量。的作用、使用场景、对比分析以及注意事项。

欢迎来到我的博客,一起探索代码里的世界! 2124

Java static关键字详解

static关键字 在类中,用static声明的成员变量为静态成员变量,也成为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。 这里要强调一下: static修饰的成员变量和方法,从属于类 普通变量和方法从属于对象 静态方法不能调用非静态成员,编译会报错 static关键字的用途 一句话描述就是:方便在没有创建对象的情况下进行调用(方法/变量)。 显然,被sta...

测试极客 15万+

Java关键字——Static(超详细讲解)

static 关键字表示静态,可以修饰变量构成静态变量,修饰方法构成静态方法。静态变量和静态方法都归类所有,称为类的静态成员,用static关键字修饰。

Best_Basic的博客 3230
上一篇: GC垃圾收集器&JVM调优汇总
下一篇: final 关键字,你想知道的都在这里
JavaTechNorth
博客等级 码龄5年 36粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值