`
thinkingmt
  • 浏览: 25345 次
  • 性别: Icon_minigender_1
  • 来自: 桂林
社区版块
存档分类
最新评论

About"static"

 
阅读更多

static静态修饰符,大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在。

 

在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是有种情况例外,就是该成员是用static声明的。

 

在java类库当中有很多类成员都声明为static,可以让用户不需要实例化对象就可以引用成员,最基本的有Integer.parseInt(),Float.parseFloat()等等用来把对象转换为所需要的基本数据类型。这样的变量和方法我们又叫做类变量和类方法。

 

下面是一个,个人认为比较典型的介绍类成员的例子:

 

public class StaticTest 
{ 
    int x=1; //实例变量 
    static int y=1; //类变量 
    
    public StaticTest() 
    { 
        x++;
        y++; 
    } 
    
    public void nonStaticMethod() 
    { 
        System.out.println("run a non_static method."); 
    } 
    
    public static void staticMethod() 
    {
        System.out.println("run a static method."); 
    } 
    
    public static void main(String args[]) 
    { 
        //生成实例t1
        StaticTest t1=new StaticTest();
        
        //生成实例t2 
        StaticTest t2=new StaticTest(); 
        
        //输出实例t1中的变量x 
        System.out.println("t1.x="+t1.x); 
        //输出实例t2中的变量x 
        System.out.println("t2.x="+t2.x); 
        
        //System.out.println("StaticTest.x="+StaticTest.x); 该行代码有编译错误,错误如下:
        //无法从静态上下文中引用非静态变量x  
        
        //nonStaticMethod(); 该行代码有编译错误,错误如下:
        //无法从静态上下文中引用非静态方法 nonStaticMethod(); 
        
        //对于以上两个编译错误的解释:
        //对于非静态属性和方法,必须先实例化对象后,通过对象的引用才能够访问这些成员,
        //但是有种情况例外,就是该成员是用static声明的。故正确使用方法如下:
        t1.nonStaticMethod(); 
        
        //在不用对象引用的情况下,对静态方法直接调用:
        staticMethod(); 
        //当然,也可以用对象的引用来调用静态方法,但这违背了定义静态方法的目的,故不推介:
        t1.staticMethod();
        
        //输出类StaticTest中的类变量y(静态变量y) 
        System.out.println("StaticTest.y="+StaticTest.y); 
        //当然,也可以用对象的引用来调用静态属性,但这违背了定义静态属性的目的,故不推介:
        System.out.println("t1.y="+t1.y); 
    } 
} 

 

 

上例中t1.y和t2.y是 指向同一个储存空间。

 

执行后输出结果如下:
t1.x=2
t2.x=2
run a non_static method.
run a static method.
run a static method.
StaticTest.y=3
t1.y=3

对以上结果的解释说明:

  • 当生成StaticTest类的实例t1时系统为实例变量x初始化分配空间,并执行x++,因此t1的x为2,而y++使y也为2;生成第二个实例t2时重新初始化x为1、而类变量y此时已在创建t1的时候被++为2,故此时y再次++变为3。
  • 实例变量无法由类直接引用,必须在生成实例后由实例进行引用。

 另外一个例子,基于上面的StaticTest 类:

 

public class UsingStatic
{
    StaticTest t1;
    StaticTest t2;
    
    public UsingStatic()
    {
        t1 = new StaticTest();
        t2 = new StaticTest();
    }
    
    public void usingNonStaticMember()
    {
        //successful scenario:
        System.out.println("t1.x="+t1.x);  
        System.out.println("t2.x="+t2.x);
        t1.nonStaticMethod();
        t2.nonStaticMethod();
        
        //failure scenario:
        //System.out.println("t1.x="+StaticTest.x);//无法从静态上下文中引用非静态变量x
        //StaticTest.nonStaticMethod();//无法从静态上下文中引用非静态方法 nonStaticMethod(); 
    }
    
    public void usingStaticMember()
    {
        //successful scenario:
        System.out.println("StaticTest.y="+StaticTest.y);
        StaticTest.staticMethod();
        
        //not suggested,no point to using a object to invoke the static attributes.
        //the suggested approach see the successful scenario, use the class to invoke the static attributes.
        System.out.println("t1.y="+t1.y);
        System.out.println("t2.y="+t2.y);//not suggested
        
        //not suggested,no point to using a object to invoke the static methods.
        //the suggested approach see the successful scenario, use the class to invoke the static methods.
        t1.staticMethod();
        t2.staticMethod();//not suggested
    }
}
 

 

 

运行usingNonStaticMember()的结果:
t1.x=2
t2.x=2
run a non_static method.
run a non_static method.
运行usingStaticMember()的结果:
StaticTest.y=3
run a static method.
t1.y=3
t2.y=3
run a static method.
run a static method.

 

 

至于类方法,如:Integer.parseInt(),可以在不创建对象的情况下使用。至今未发现难点。

 

 

 

 

 

 

 

接下来讲讲为什么 main函数的写法是固定的:

 

为什么要那样写,和JVM的运行有关系。
当一个类中有main()方法,执行命令“java 类名”则会启动虚拟机执行该类中的main方法。

由于JVM在运行这个Java应用程序的时候,首先会调用main方法,调用时不实例化这个类的对象,而是通过类名直接调用因此需要是限制为public static。

对于java中的main方法,jvm有限制,不能有返回值,因此返回值类型为void。
main方法中还有一个输入参数,类型为String[],这个也是java的规范,main()方法中必须有一个入参,类细必须String[],至于 字符串数组的名字,这个是可以自己设定的,根据习惯,这个字符串数组的名字一般和sun java规范范例中mian参数名保持一致,取名为args。

因此,main()方法定义必须是:“public static void main(String 字符串数组参数名[])”。

 

分享到:
评论

相关推荐

    scratch少儿编程逻辑思维游戏源码-Pyorovania.zip

    scratch少儿编程逻辑思维游戏源码-Pyorovania.zip

    scratch少儿编程逻辑思维游戏源码-弹力猫.zip

    scratch少儿编程逻辑思维游戏源码-弹力猫.zip

    scratch少儿编程逻辑思维游戏源码-地心引力.zip

    scratch少儿编程逻辑思维游戏源码-地心引力.zip

    基于金枪鱼群优化算法的SVM在多变量时间序列预测中的MATLAB实现及优化

    内容概要:本文介绍了一种基于金枪鱼群优化算法(TSO)和支持向量机(SVM)的混合算法模型——TSO-SVM,在多变量时间序列预测中的应用。文中详细解释了TSO-SVM的工作原理,即通过模拟金枪鱼群觅食行为来优化SVM的参数,从而提升预测性能。同时提供了具体的Matlab代码实现步骤,包括参数初始化、模型训练和预测。实验结果显示,TSO-SVM相较于传统SVM方法,显著提升了预测的准确性和稳定性,并展示了良好的泛化能力。 适合人群:对机器学习尤其是时间序列预测感兴趣的科研人员和技术开发者。 使用场景及目标:①需要进行多变量时间序列预测的研究项目;②希望利用自然启发式优化算法改善现有SVM模型效果的技术团队。 其他说明:推荐使用Libsvm工具箱配合Matlab 2018B及以上版本,仅限于Windows 64位操作系统。

    机器视觉技术:OpenCV与Qt在工业相机采集及图像处理中的应用

    内容概要:本文深入探讨了机器视觉技术,重点介绍了OpenCV和Qt在工业相机采集及图像处理中的应用。文中详细讲述了卡尺工具、找线、找圆、颜色检测、模板匹配及形状匹配等关键技术的具体实现方法,并特别强调了海康工业相机采集与基于形状的模板匹配界面的开发。此外,形状匹配算法已被封装成DLL,方便直接调用。通过实际案例和技术解析,帮助读者全面掌握机器视觉系统的构建。 适合人群:对机器视觉感兴趣的初学者、有一定编程基础的研发人员、从事工业自动化领域的工程师。 使用场景及目标:适用于希望深入了解机器视觉技术及其应用场景的专业人士,旨在提升图像处理能力,优化工业自动化流程,提高生产效率。 其他说明:文章不仅提供理论知识,还附有示例代码,便于读者动手实践并加深理解。

    scratch少儿编程逻辑思维游戏源码-Billy奇妙之旅.zip

    scratch少儿编程逻辑思维游戏源码-Billy奇妙之旅.zip

    电动汽车BMS电池管理系统应用层软件模型:MBD方法、通信协议及AUTOSAR构建

    内容概要:本文详细介绍了基于模型开发(MBD)的BMS电池管理系统应用层软件模型。首先概述了BMS的核心任务,即确保电池的安全与高效运行,涉及充电、放电控制、实时监测和电池均衡管理。接着重点讨论了SUMlink电池管理系统策略模型,该模型通过收集和处理电池的数据(如电压、电流、温度),并运用多种算法(如SOC估算、SOH评估)来优化电池性能。文中还阐述了BMC CVS内部通讯协议DBC的作用,确保各模块间数据传输的准确性与效率。最后,介绍了AUTOSAR标准在BMS系统中的应用,特别是针对MPC5644A芯片的底层Build工程,提高了系统的可维护性、可扩展性和可靠性。此外,提到了INCA A2L标定文件的应用,用于配置和调整系统参数,以满足不同需求。 适合人群:从事电动汽车电池管理系统研究与开发的技术人员,尤其是对MBD方法、通信协议和AUTOSAR标准感兴趣的工程师。 使用场景及目标:适用于希望深入了解BMS系统的设计原理和技术细节的专业人士,旨在提高他们对该领域的理解和实际操作能力。 其他说明:通过对代码的具体分析,读者能够更加直观地理解BMS的工作流程及其各个组件间的协作关系。

    少儿编程scratch项目源代码文件案例素材-深海困境.zip

    少儿编程scratch项目源代码文件案例素材-深海困境.zip

    少儿编程scratch项目源代码文件案例素材-去吧泡泡糖.zip

    少儿编程scratch项目源代码文件案例素材-去吧泡泡糖.zip

    KEPServerEX6-6.17.269.0

    KEPServerEX6-6.17.269.0,最新版

    scratch少儿编程逻辑思维游戏源码-第二个循环.zip

    scratch少儿编程逻辑思维游戏源码-第二个循环.zip

    少儿编程scratch项目源代码文件案例素材-手里剑.zip

    少儿编程scratch项目源代码文件案例素材-手里剑.zip

    少儿编程scratch项目源代码文件案例素材-山地跳跃.zip

    少儿编程scratch项目源代码文件案例素材-山地跳跃.zip

    机器人路径规划中Informed RRT*算法详解与代码实现

    内容概要:本文详细介绍了Informed RRT*算法及其在机器人路径规划领域的应用。文章首先解释了该算法相较于传统RRT*算法的优势,即通过将采样范围限制在由起点和终点构成的椭圆区域内来提高搜索效率。接着,文中提供了具体的代码实现,包括椭圆采样的核心公式、路径优化的rewire步骤以及动态调整邻居半径的方法。此外,还讨论了路径队列管理和椭圆区域随路径优化动态更新的重要性。通过这些技术手段,Informed RRT*能够在找到初始路径后显著加快优化速度。 适合人群:对机器人路径规划感兴趣的科研人员、工程师及学生。 使用场景及目标:适用于需要高效路径规划的实际应用场景,如自动驾驶汽车、无人机飞行路径规划等。目标是在复杂环境中快速找到从起点到终点的最佳路径。 其他说明:建议读者在理解理论的基础上,结合提供的代码进行实验,以便更好地掌握算法的工作机制。同时,在不同环境条件下测试算法性能,观察其自适应能力。

    基于COMSOL有限元仿真的变压器辐射传热数值分析:从入门到进阶

    内容概要:本文详细介绍了基于COMSOL有限元软件的变压器辐射传热数值分析方法。首先,解释了变压器内外辐射传热的基本机理,包括热量通过传导、对流和辐射的方式传递,重点在于辐射传热的作用及其数学描述。接着,逐步引导读者从零开始构建有限元仿真模型,涵盖模型参数确定、网格划分、材料属性定义、边界条件设置、传热方程设定、仿真运行及结果分析等多个步骤。最后,探讨了进一步研究的方向,如不同因素(温度、材料属性、几何形状)对辐射传热的影响,以及该模型在电力电子设备和热管理系统的潜在应用。 适合人群:电气工程专业学生、初学者和技术爱好者,尤其是对有限元仿真和变压器辐射传热感兴趣的群体。 使用场景及目标:适用于希望通过实际操作掌握有限元仿真技能的人群,旨在帮助他们理解变压器辐射传热机制并能独立完成相关仿真项目。 其他说明:本文不仅提供了理论知识,还附带了详细的视频教程和仿真模型,使学习过程更加直观易懂。

    scratch少儿编程逻辑思维游戏源码-Scratch 奔跑.zip

    scratch少儿编程逻辑思维游戏源码-Scratch 奔跑.zip

    scratch少儿编程逻辑思维游戏源码-超级马里奥兄 回放引擎.zip

    scratch少儿编程逻辑思维游戏源码-超级马里奥兄 回放引擎.zip

    少儿编程scratch项目源代码文件案例素材-你准备好了吗?.zip

    少儿编程scratch项目源代码文件案例素材-你准备好了吗?.zip

    少儿编程scratch项目源代码文件案例素材-潜水艇.zip

    少儿编程scratch项目源代码文件案例素材-潜水艇.zip

    基于Python的两电平三相并网逆变器有限控制集模型预测控制(FCS-MPC)实现及波形分析

    内容概要:本文详细介绍了如何利用Python实现两电平三相并网逆变器的有限控制集模型预测控制(FCS-MPC)。首先建立了逆变器的数学模型,接着探讨了预测控制的核心思想,即通过遍历所有可能的开关状态选择最优解。文中给出了具体的代码实现步骤,包括系统模型建立、开关状态枚举、代价函数设计以及完整的控制循环流程。此外,还讨论了仿真过程中可能出现的问题及其解决方法,如电感参数不准确、延时补偿不足等,并提供了提高控制精度的小技巧。 适合人群:具有一定编程基础并对电力电子控制系统感兴趣的工程师和技术爱好者。 使用场景及目标:适用于希望深入了解FCS-MPC原理并在实践中掌握其实现方法的人群。通过本教程的学习,读者能够独立完成从建模到仿真的全过程,最终获得理想的电流电压波形。 其他说明:文章强调了实际调试中的注意事项,如坐标变换的选择、延时补偿的重要性、代价函数的设计等,这些都是确保控制效果的关键因素。同时指出,在某些情况下,经验性的调整可能会比严格的理论计算带来更好的效果。

Global site tag (gtag.js) - Google Analytics