Java学习笔记(关于static)

Excel药品说明书数据库:从零开始搭建医药数据查询系统(附完整模板) 本文详细介绍了如何从零开始搭建Excel药品说明书数据库,提供完整的医药数据查询系统模板。涵盖数据库架构设计、数据清洗标准化、智能查询系统搭建及维护优化,帮助医药从业者高效管理药品信息,提升查询速度和准确性。 阅读详情

        最近分布式课程上有个课设需要用到java RMI,并且新的项目有一个模块师兄以前也一直希望我帮他用java实现,因此决定这次扎扎实实的将java“入个门”。

        对我来说之前从来没有接触过java,从本科到现在一直都是C/C++过来的,虽然很久前玩过一段时间C#,写过一些简单的小工具,但那个时候其实对Programming Paradigm还有程序的结构根本没有概念,所以根本没有特别的在意一些语法以及程序运行的细节,只是知道“哦!这样能跑出正确结果!”。直到现在回头看才发现这种工作和学习的方式真的是浪费时间,虽然从开始真正了解java不到一周,但是决定从这次开始好好的努力记录学习的过程,因为经历了这么多才发现,记忆是靠不住的,大脑的容量是有限的,每天接受的信息太多,因此自然会自动删除很多信息。

        好了,说了这么多废话,开始第一次笔记,想整理的内容是关于Java中的static的用法,同时,也和C++的static做一个对比记录,方便自己以后翻看,也希望能帮助到对这些概念比较模糊的朋友。

        static是静态的意思,在C++中,如果申明一个static类型的成员变量,该变量实际上存在于进程的Data Segment,也就是数据段,因此在C++中,static定义的变量,无论出现在源文件的哪个角落(函数内,函数外,类内,类外),其实都有全局变量的意思,该变量在整个进程运行生命期内存在,且只会维护一份实体。然而,Java是没有全局变量的概念的,Java的可执行程序.class文件,并不是像C/C++的可执行程序一样直接由内核装入开始运行并执行CPU的命令集的,而是运行在Java虚拟机也就是JVM中,JVM其实完全可以看作一个中间件,屏蔽了底层系统的不同,.class文件中其实是JVM的指令集,因此Java才有了它经典的slogan:complie once, run anywhere...

        那么,就从对比Java和C++中的static的用法对比开始:

1.static修饰成员变量

例如,对于Java来说,在一个类中 ,修饰一个成员变量:这里可以直接为number指定一个初值:
private static int number = 0;
并且,在Java中非静态方法内不能声明static变量
public void foo() {
    static int number = 0; /*错误,成员方法内不能定义static变量*/
}

而对于C++来说,就不是这样了,由于C++中存在const修饰符,对于const static和static成员变量的初值设定稍有不同:
对于static成员变量来说,由于其是一个全局变量,因此,要保证该变量只能被定义一次,如果在类内进行定义,或者在头文件中进行定义那么在类被多次实例化和头文件被多次包含时,static变量就会被重复定义了,这是不允许的,因此,static成员变量的定义需要放在类外。
class Test
{
public:
    Test(){}
    ~Test(){}

    static int number;                  /*非const static变量不能在类内初始化,只能声明*/
    const static int const_number = 0;  /*const static变量可以直接在类内初始化*/
};

int Test::number = 10;/*非const的static变量的定义必须在源文件(不能是头文件)的类外定义*/
并且,在C++的成员函数中,static变量也是可以声明和定义的,这时static变量依然保持它的性质:唯一一份实例
class Test
{
public:
    /*class members or functions*/
    
    int foo()
    {
        static int number = 0; /*正确*/
        return number++;
    }
};

2.static修饰成员方法/函数

在Java和C++中,static修饰成员方法/函数的方式倒是一致,被static修饰的方法/函数可以直接用类名进行调用。
对于Java是直接用类名.方法的形式调用静态成员方法
Class Test{
    /*other members*/
    public static void foo(){
        System.out.print("foo\n");
    }
}
Test.foo(); /*Java调用静态成员方法*/
而对于C++来说,用类名::成员函数的方式来调用静态成员函数
class Test
{
public:
    /*other members*/
    static void foo()
    {
        cout << "foo" << endl;
    }
};
Test::foo(); /*C++调用静态成员函数*/

3.static和非static初始化块

这个特性是Java独有的,感觉是个很有趣的特性,也是和C++一个比较大的区别,对于C++的类来说,所有的初始化都是从构造函数开始的,包括vtbl。然而对于Java来说,构造函数恐怕是要靠边站的一个角色了,因为在它的前面,还有static初始化块和非static初始化块。
static初始化块和非static初始化块的示例代码如下:
class Test{
	
	public Test() {
		System.out.println("construct Test:tt");
	}
	
	/*staic 初始化块*/
	static 
	{
		System.out.println("static initial block");
	}
	
	/*非 static 初始化块*/
	{
		System.out.println("non-static initial block");
	}
}
如果在main()方法中使用 Test tt = new Test();来创建一个对象,那么将会有一下输出:
static initial block
non-static initial block
construct Test:tt
可以看到,三个初始化过程的顺序为:
  1. static初始化块
  2. 非static初始化块
  3. 构造函数
其实到这里,还不能很好的说明一些问题,那么如果一个继承Test的子类也有上述结构,那么在实例化时会怎么样呢?
class Test{
	
	public Test() {
		System.out.println("parent construct Test:tt");
	}
	
	/*staic 初始化块*/
	static 
	{
		System.out.println("parent static initial block");
	}
	
	/*非 static 初始化块*/
	{
		System.out.println("parent non-static initial block");
	}
}

class NewTest extends Test{
	
	public NewTest() {
		System.out.println("child construct Test:tt");
	}
	
	/*staic 初始化块*/
	static 
	{
		System.out.println("child static initial block");
	}
	
	/*非 static 初始化块*/
	{
		System.out.println("child non-static initial block");
	}
}
在main()方法中使用 Test tt = new NewTest();来创建一个对象,那么将会有一下输出:
parent static initial block
child static initial block
parent non-static initial block
parent construct Test:tt
child non-static initial block
child construct Test:tt
可以看到,static初始化是最先执行的
其次是父类的non-staic块和构造函数
最后才是子类的non-static快和构造函数。
        这个其实很好理解,在执行new NewTest()时,JVM首先要用classLoader将NewTest以及它的父类加载到JVM中,这时默认就会按照父类->子类的顺序调用static静态初始化块,static初始化块仅仅在该类第一次加载到JVM时运行一次,因为它是属于整个类而不是某一个对象的,而non-static初始化块和构造函数是在类被实例化为一个对象时才会运行的,因此,如果一个类被实例化多次,static块也只会执行一次,non-static块将在每一次实例化时执行。


关于C++和Java类中static的区别,暂时只理解了这么多,另外,还发现另外一个区别:
  • Java中,如果你没有给你的类定义一个默认构造函数,那么Java会给你创建一个无参数的构造函数,然而,如果你的类定义了一个带参数的构造函数(却没有定义一个无参数的默认构造函数)那么将不能再用classname obj = new classname();的方式实例化一个对象了,必须传入你所定义的参数,也就是说,Java不会再为你提供一个默认构造函数了。
  • C++中,无论如何,只要你没有定义默认的构造函数,C++都会为你创建一个。






(三) Debian 安装linuxcnc-ethercat中间件 1.在这里同样的也是需要下载一下依赖包 sudo apt install linuxcnc-uspace-dev 2.依赖包安装完成, 接着执行下面命令 sudo git clone https://github.com/sittner/linuxcnc-ethercat 还是可能出现下载网络错误下载不成功,可以直接下载我已上传百度云linuxcnc目录下 注意一下,后面make可能会出现头文件(xxx.h)的报错提示,在这里给大家一个处理办法 用aptitude 工具可以搞定 sudo apt-get 阅读详情

相关推荐

AI提示词设计中的批判性思维训练方法

在人工智能应用中,提示词(prompt)设计是影响生成内容质量的关键因素。通过引入批判性思维框架,可以有效提升AI输出的逻辑性和多样性。该方法基于目的澄清、证据评估、假设检验和多视角分析四大支柱,构建结构化的问题拆解和证据链。在学术论文辅助写作、商业决策模拟等场景中,这种训练方式能显著提高内容质量,特别适合学生、职场人士和内容生产者。结合思维可视化工具和本地知识库,可以实现从基础应用到专家级分析的进阶。

weixin_33624741的博客 229

extern\const\static的使用详解

注意:extern关键字只需要指明类型和变量名就行了,不能再重新赋值,初始化需要在原文件所在处进行,如果不进行初始化的话,全局变量会被编译器自动初始化为0。必须在除定义变量的文件之外的所有文件中应用 extern。const修饰的变量是不能被修改的用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。函数的使用方式与全局变量类似,在函数的返回类型前加上static,就是静态函数。利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数,extern。在模板声明中,extern。

weixin_66828150的博客 1428

景观格局指数计算方法及代表的生态学意义(待补充)

景观指数 斑块密度(PD) 斑块密度(PD)表现某种斑块在景观中的密度,可反映出景观整体的异质性与破碎度[17],公式为PD=NP/A(1)式中NP———斑块数量,个A———景观或斑块的总面积,hm2PD———斑块密度,个/hm2 最大斑块指数(LPI) 最大斑块指数(LPI)用于确定景观中的优势斑块类型,间接反映人类活动干扰的方向和大小,公式为LPI=amaxA×100%(0≤LPI≤100%)(2)式中amax———景观或某一种斑块类型中最大斑块的面积,hm2LPI———最大斑块指数,% 凝聚

soderayer的博客 13万+

static用法详解

一. 面向过程程序设计 1、静态全局变量   在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下:    [cpp] view plaincopy //Example 1     #include &lt;iostream.h&gt;     void fn();     stati...

weixin_34292402的博客 219

FlightStream实战:如何用面元法在笔记本电脑上完成无人机气动分析(附NASA案例)

本文详细介绍了如何利用FlightStream面元法在笔记本电脑上高效完成无人机气动分析,包括其核心技术优势、NASA D8案例实战解析及高效工作流建立。FlightStream作为快速CFD分析工具,显著提升了早期设计阶段的迭代速度,适用于概念设计验证和多气动构型比较。

weixin_28363123的博客 258

snipersim安装

snipersim安装记录,便于后续使用tip:snipersim需要在python2的环境下编译。

weixin_53507617的博客 917

static、const关键字的含义与作用

static static static有三个明显的作用: 1)在函数体中,一个被声明静态的变量在这一函数被调用过程中维持其值不变。 2)在模块内(但在函数体外),一个被申明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3)在模块内,一个被声明为静态的函数指只可被这一模块内的其它函数调用,这个函数只能在声明它的模块的本地范围内使用。 const 1.可...

weixin_42952472的博客 1119

history 历史命令记录功能如何防坏人(高级)

在 Linux 下面可以使用 history 命令查看用户的所有历史操作,同时 shell 命令操作记录默认保存在用户目录的 .bash_history 文件中。通过这个文件可以查询 shell 命令的执行历史,有助于运维人员进行系统审计和问题排查,同时在服务器遭受黑客攻击后,也可以查询黑客登录服务器的历史命令操作。但是黑客在入侵后,为了抹除痕迹,会删除 .bash_history 文件,这个就需...

墨痕诉清风的博客 1656

【Java】关键字-static【主线学习笔记】

关键词static;Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架和实践技巧等,分享学习心得,对自己学习过程进行整理和总结,也希望能为其他学习Java的朋友提供一些帮助和参考。

CBCY_csdn的博客 556

S7-1200 PN与G120变频器控制起停及调速PROFINET实现详解

S7-1200 PLC与G120变频器通过PROFINET通信可实现高效、实时的电机控制。2. 《S7-1200与G120 CU250S-2PN的PROFINET通讯指南》- 控制器:S7-1200 PLC (如1214C DC/DC/DC)- 变频器:G120 CU250S-2PN (带PROFINET接口)- 输出区(PZD1-2):控制字(16位)、速度设定值(16位)- 输入区(PZD1-2):状态字(16位)、实际速度值(16位)- P922=1:选择报文类型为"标准报文1 (PZD2/2)"

电工 1866

英伟达DeepStream学习笔记7——DeepStream接入USB相机并实现广角摄像头的畸变矫正

deepstream官方提供了一个畸变矫正的例子,包含了鱼眼和普通广角的矫正。我目前准备做一个广角的畸变矫正,我已经使用opencv实现功能,目前增加到deepstream框架中。示例代码在\opt\nvidia\deepstream\deepstream-5.0\sources\apps\sample_apps\deepstream-dewarper-test 中,鱼眼矫正——deepstream官方版 https://developer.nvidia.com/blog/calibration-trans

耶律大石的博客 1602

Java学习笔记之---static

Java学习笔记之---static static不能修饰类,局部变量 (一)静态成员的特征 static+属性 静态属性 无论实例化出来多少个对象,都会共用同一块静态空间,类对象共享 静态成员从第一次被加载之后一直到这个类不再有任何对象被使用,也就是说被彻底的销毁的时候,才会进行资源的释放,生命周期长 public class Pig { String n...

weixin_30852451的博客 81

Google Earth Engine——使用STARFM 图像融合算法将Landsat 和 MODIS 融合得出2000-2023 NDVI长时序图(空间分辨率为 30 米、时间分辨率为 16 天)

非本地入侵物种是全球生态系统面临的主要威胁之一。野葛(Pueraria montana)是一种生长迅速的藤本植物,原产于亚洲,现已入侵美国一些地区,因此该物种的管理成为一个重要问题。利用 Landsat 和 MODIS 平台收集的数据,计算了 2000 年至 2015 年肯塔基州三个侵扰地点的归一化差异植被指数(NDVI)估算值。使用 STARFM 图像融合算法将大地遥感卫星和 MODIS 得出的 NDVI 结合成空间分辨率为 30 米、时间分辨率为 16 天的时间序列。

此星光明博客 2509

《Java面向对象程序设计》学习笔记——静态内部类的访问方法(static/无static)

没有用static修饰内部类,则需要new一个外部类实例,再通过外部实例创建内部类。用static修饰内部类,可以直接通过内部类类名访问静态内部类。

奇妙方程式的博客 938

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java学习笔记-static

Java学习笔记-static 参考 MCBBS论坛-JAVA高手训练营第五章 static是一个修饰符,如果一个类的字段/方法属于整个类而非单个实例,可以用static修饰。 没有被声明为static的成员叫做实例成员,反之称为静态成员。 被声明为static的成员有以下特点: 类一旦被加载,其也被加载; 静态成员优先于实例成员; 静态成员多了一种被调用的方式:类名.方法名/类名.字段名。 ...

z86588的博客 134

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

网易云课堂微专业Java学习笔记_static修饰符

#Java学习笔记_static修饰符

qq_35907339的博客 127

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java static学习笔记

static的理解以及具体用法 static 意思是静态的 (1)对于static的个人理解: 在类加载的时候,会将静态的内容也加载到方法区的静态域中。(就是类创建后static关键字创建的也会被加载。) 静态的内容先于对象存在,这个静态内容被所有该类的对象共享。(就是说没创建对象之前这个静态的内容已经存在了。) (2)官方推荐的访问属性的方式: 类名.属性名 static修饰属性总结 static 修饰属性的注意点: 一、在类加载的时候一起加载入方法区中的静态域中 二、先于对象存在 三、可以通过类名.属性

CCAHSC的博客 228

java static 学习笔记

package base.study.com; public class StaticDemo { /** * 关键字:static * 使用场景:当变量是所有对象共性的变量时可以被定义为static,节省堆内存,既可以修饰函数,也可以修饰变量 * 好处: * 1)静态函数或变量多了一种调用方式,可以被类直接调用; * 2)静态成员随着类的加载而加载 * 3)静态成员优先于对象存在 * 4)静态成...

xsz880227的博客 175

Java static关键字 学习笔记

目录 static 关键字 静态变量 与 非静态变量  静态方法  static 特点 Java 类执行顺序 面试题 参考资料 static 关键字 static关键字主要用来用于修饰成员(包括成员变量和成员函数),被static修饰的成员被所有的类对象所共享。 Java是面向对象的语言,正常情况下只有用new实例化对象时才会正式生产数据存储空间,并可使用相应的方法。但对于static(静态)关键字来说是特殊的,一旦将成员变量、成员函数设为 static 后,我们就可以...

知其所以然 399

【狂神说java学习笔记】十一:java面向对象(多态、instanceof和static关键字)

本文整理了狂神说Java课程的面向对象编程笔记,包括Java面向对象编程的三大特性之一:多态。另外还包括instanceof和static关键字的详解。

weixin_41637679的博客 421

java学习笔记(static详解)

目录static关键字概述 static关键字概述 简单来说,就是当类的属性或者方法加上static关键字后,该属性或者方法的所属就是该类。而没有加static关键字的属性和方法,其所属为该类实例化后的对象。为了更好理解,这里通过图像的来区分有没有static关键字之间的区别。 现在创建一个同班同学的类,该类对应的对象拥有的属性有姓名、年龄、学号以及所在教室。 ...

qq_36334929的博客 327

Java学习笔记-static关键字

Java学习笔记——Static关键字有关 static关键字的概念 static关键字,在书本上的描述是“如果有些属性希望被所有对象共享,则就必须将其声明为static属性”,其实书上的语言描述起来有一点点啰嗦,其实对于static我们可以直接理解为C/C++里面的全局变量。如果想把某个属性改变成所有对象都能使用的,在属性声明之前加个“static”就OK了。 static关键字的用途 1.声明属性 和上面讲到的一样,如果想将一个属性作为全局属性使用,在属性定义之前加一个static,例如 class P

qq_50395600的博客 336

Java学习笔记---static关键字

Java学习笔记---static关键字static关键字基本介绍static声明属性static属性的注意事项Java中常用的内存区域(主要4块)static声明方法static方法的注意事项static声明内部类static内部类的注意事项static的相关应用 static关键字 基本介绍 创建实例化一个类对象时,JVM会分别开辟一个栈内存和一个堆内存。在堆内存里保存对象中的属性,每个对象都...

weixin_44823875的博客 301

[Java]学习笔记33:static

一旦使用了static关键字,那么这样的内容就不再属于对象自己,而是属于类的,所以凡是本类的对象,都共享一份。 static修饰成员变量 用static修饰学号,每new一个对象,学号id就+1 Student.java public class Student { private String name; private int age; private static int id; static int room; public Student(){} .

weixin_46285081的博客 122

java static学习笔记

static的局限性: 1.在static的方法中仅能够调用其他的static方法和static变量; 2.在static方法中不能以任何方式引用this或 super; 3.static变量在定义时必须进行初始化,并且初始化的时间早于非静态。 4.static的变量的初始化仅能一次,且只在需要输出之前接受最后一次初始化 static的用法原理: 1.在java虚拟机中,对于...

lq110713114的专栏 183

java static使用技巧_Java学习笔记十七:Java中static使用方法

Java中static使用方法一:Java中的static使用之静态变量;我们都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在某些时候,我们更希望该类所有的对象共享同一个成员。此时就是static 大显身手的时候了!!Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用...

weixin_39860583的博客 131
上一篇: 关于fork()||fork();
下一篇: Ogre学习记录(一)-启动流程
tinyFatAries
博客等级 码龄12年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值