精华内容
下载资源
问答
  • 2.6创建用户关键字 关键字表用于通过将现有关键字组合在一起来创建新的更高级别关键字。这些关键字称为用户关键字,以区别于测试库中实现的最低级库关键字创建用户关键字的语法与创建测试用例的语法非常接近,这...

    2.6创建用户关键字

    关键字表用于通过将现有关键字组合在一起来创建新的更高级别关键字。这些关键字称为用户关键字,以区别于 测试库中实现的最低级库关键字创建用户关键字的语法与创建测试用例的语法非常接近,这使其易于学习。

    2.6.1用户关键字语法

    基本语法

    在许多方面,整体用户关键字语法与测试用例语法相同 用户关键字在关键字表中创建,这些关键字表与测试用例表的区别仅在于用于标识它们的名称。用户关键字名称与测试用例名称类似,位于第一列。用户关键字也是从关键字创建的,可以是测试库中的关键字或其他用户关键字。关键字名称通常位于第二列,但是在从关键字返回值设置变量时,它们位于后续列中。

    用户关键字示例

    关键词行动争论争论
    Open Login Page Open Browser http://host/login.html  
      Title Should Be Login Page  
           
    Title Should Start With [Arguments] ${expected}  
      ${title} = Get Title  
      Should Start With ${title} ${expected}

    大多数用户关键字都需要参考。此重要功能已在上面的第二个示例中使用,本节后面将详细 介绍,与用户关键字返回值类似

    可以在测试用例文件资源文件测试套件初始化文件中创建用户关键字在资源文件中创建的关键字可用于使用它们的文件,而其他关键字仅在创建它们的文件中可用。

    关键字表格中的设置

    用户关键字可以具有与测试用例类似的设置,并且它们具有相同的方括号语法,将它们与关键字名称分开。下面列出了所有可用的设置,本节稍后将对其进行说明。

    [文档]
    用于设置用户关键字文档
    [参数]
    指定用户关键字参数
    [返回]
    指定用户关键字返回值
    [拆除]
    指定关键字拆解从Robot Framework 2.6开始提供。
    [超时]
    设置可能的用户关键字超时超时在他们自己的一节中讨论。

    2.6.2用户关键字名称和文档

    用户关键字名称在user关键字表的第一列中定义。当然,名称应该是描述性的,并且可以使用相当长的关键字名称。实际上,在创建类似用例的测试用例时,最高级别的关键字通常被表述为句子甚至段落。

    用户关键字可以包含使用 [Documentation]设置设置的文档,与测试用例文档完全相同此设置记录测试数据中的用户关键字。它还显示在更正式的关键字文档中,libdoc工具可以从资源文件创建最后,文档的第一行显示为测试日志中的关键字文档 

    有时需要删除关键字,替换为新关键字,或者出于其他原因弃用关键字。通过使用* DEPRECATED *启动文档,可以将用户关键字标记为已弃用,这将在使用keyoword时引发警告。有关更多信息,请参阅 弃用关键字部分。

    2.6.3用户关键字参数

    大多数用户关键字需要采用一些参数。指定它们的语法可能是Robot Framework通常需要的最复杂的功能,但即使这样也相对容易,特别是在大多数常见情况下。参数通常使用[Arguments]设置指定,参数名称使用与变量相同的语法,例如$ {arg}

    位置参数

    指定参数的最简单方法(除了根本没有它们)只使用位置参数。在大多数情况下,这就是所需要的。

    语法是这样的,首先给出[Arguments]设置,然后在后续单元格中定义参数名称。每个参数都在自己的单元格中,使用与变量相同的语法。关键字必须与其签名中的参数名称一样多的参数使用。实际的参数名称与框架无关,但从用户的角度来看,它们应该尽可能具有描述性。建议在变量名中使用小写字母,可以是 $ {my_arg}$ {my arg}$ {myArg}

    用户关键字采用不同数量的参数

    KeywordActionArgumentArgumentArgument
    One Argument [Arguments] ${arg_name}    
      Log Got argument ${arg_name}    
             
    Three Arguments [Arguments] ${arg1} ${arg2} ${arg3}
      Log 1st argument: ${arg1}    
      Log 2nd argument: ${arg2}    
      Log 3rd argument: ${arg3}    

    默认值

    在大多数情况下,位置参数可能已足够。但是,有时能够使用不同数量的参数的关键字并且具有未给定的参数的默认值是有用的。用户关键字也允许这样做,并且所需的新语法不会对已经讨论过的基本语法增加太多。简而言之,默认值被添加到参数中,因此首先存在等号(=)然后是值,例如$ {arg} = default默认值可以有很多参数,但它们都必须在正常的位置参数之后给出。

    注意

    默认值的语法是空间敏感的。=符号之前的空格是不允许的,并且在它之后的可能空格被认为是默认值本身的一部分。

     

    具有参数默认值的User关键字
    KeywordActionArgumentArgument
    One Argument With Default Value [Arguments] ${arg}=default value  
      [Documentation] This keyword takes 0-1 arguments
      Log Got argument ${arg}  
           
    Two Arguments With Defaults [Arguments] ${arg1}=default 1 ${arg2}=default 2
      [Documentation] This keyword takes 0-2 arguments
      Log 1st argument ${arg1}  
      Log 2nd argument ${arg2}  
           
    One Required And One With Default [Arguments] ${required} ${optional}=default
      [Documentation] This keyword takes 1-2 arguments
      Log Required: ${required}  
      Log Optional: ${optional}  

    当关键字接受具有默认值的多个参数并且只需要覆盖其中一些参数时,使用命名参数语法通常很方便 当此语法与用户关键字一起使用时,将指定参数而不使用$ {} 修饰。例如,上面的第二个关键字可以像下面一样使用,$ {arg1}仍会获得其默认值。

     

    Test CaseActionArgumentArgument
    Example Two Arguments With Defaults arg2=new value  

    正如所有Pythonistas必须已经注意到的那样,指定默认参数的语法很大程度上受到函数默认值的Python语法的启发。

    可变数量的参数

    有时甚至默认值都不够,并且需要一个接受任意数量参数的关键字。用户关键字也支持此功能。所需要的只是将列表变量( 例如@ {varargs})作为关键字签名中的最后一个参数。此语法可以与先前描述的位置参数和默认值组合,最后,list变量获取与其他参数不匹配的所有剩余参数。因此列表变量可以具有任意数量的项目,甚至为零。

     

    KeywordActionArgumentArgumentArgument
    Any Number Of Arguments [Arguments] @{varargs}    
      Log Many @{varargs}    
             
    One Or More Arguments [Arguments] ${required} @{rest}  
      Log Many ${required} @{rest}  
             
    Required, Default, Varargs [Arguments] ${req} ${opt}=42 @{others}
      Log Required: ${req}    
      Log Optional: ${opt}    
      Log Others:    
      : FOR ${item} IN @{others}
        Log ${item}  

    同样,Pythonistas可能会注意到可变数量的参数语法非常接近Python中的参数。
    请注意,如果上面的最后一个关键字与多个参数一起使用,则第二个参数
    $ {opt}始终获取给定值而不是默认值。即使给定值为空,也会发生这种情况。最后一个示例还说明了如何在for循环中使用user关键字接受的可变数量的参数这两个相当高级的功能的组合有时可能非常有用。

    2.6.4将参数嵌入到关键字名称中

    Robot Framework还有另一种方法可以将参数传递给用户关键字,而不是在关键字名称后面的单元格中指定它们,如上一节中所述。此方法基于将参数直接嵌入到关键字名称中,其主要好处是可以更轻松地将真实和清晰的句子用作关键字。

    基本语法

    始终可以使用“ 从列表中选择狗”和“ 从列表中选择猫”等关键字,但所有这些关键字必须单独实施。将参数嵌入到关键字名称中的想法是,您只需要一个名称为Select $ {animal} from list的关键字 

     

    一个示例关键字,其名称中嵌入了参数
    KeywordActionArgumentArgument
    Select ${animal} from list Open Page Pet Selection  
      Select Item From List animal_list ${animal}

    使用嵌入式参数的关键字不能采用任何“普通”参数(使用[Arguments]设置指定),否则它们就像其他用户关键字一样创建。名称中使用的参数自然可以在关键字中使用,它们具有不同的值,具体取决于关键字的调用方式。例如, 如果使用关键字中的选择狗,则前一个$ {animal}具有值dog显然,在关键字中使用所有这些参数并不是必须的,因此它们可以用作通配符。

    除了在名称中不忽略空格和下划线之外,这些关键字的使用方式与其他关键字的使用方式相同。但是,它们与其他关键字一样不区分大小写。例如,上面示例中的关键字可以像列表中的选择x一样使用 ,但不能像选择x fromlist那样使用

    嵌入式参数不支持默认值或可变数量的参数,如普通参数。在调用这些关键字时使用变量是可能的,但这会降低可读性。另请注意,嵌入式参数仅适用于用户关键字。

    嵌入式参数匹配太多

    使用嵌入式参数的一个棘手的部分是确保调用关键字时使用的值与正确的参数匹配。这是一个问题,特别是如果有多个参数并且分隔它们的字符也可能出现在给定值中。例如,如果与包含Select Los Angeles Lakers等部分的城市一起使用,则关键字Select $ {city} $ {team}无效

    解决这个问题的一个简单方法是引用参数(例如 选择“$ {city}”“$ {team}”)并使用引用格式的关键字(例如选择“洛杉矶”“湖人队”)。但是,这种方法还不足以解决所有这类冲突,但仍然强烈推荐这种方法,因为它使得参数从关键字的其余部分中脱颖而出。更强大但也更复杂的解决方案,在定义变量时使用自定义正则表达式,将在下一节中介绍。最后,如果事情变得复杂,那么使用普通的位置参数可能更好。

    在创建忽略给定/ when / then /和前缀的关键字时,通常会发生参数匹配过多的问题例如, $ {name}回家比赛鉴于Janne回家,因此$ {name}获得价值给予Janne围绕参数的引用,如“$ {name}”回家,很容易解决这个问题。

    使用自定义正则表达式

    当调用具有嵌入参数的关键字时,使用正则表达式 (简称regexps)在内部匹配值默认逻辑使得名称中的每个参数都替换为模式。*?基本上匹配任何字符串。这个逻辑工作得相当好正常,但上面刚刚讨论,有时关键词匹配超过预期引用或以其他方式将参数与其他文本分开可能有所帮助,但是,例如,下面的测试失败,因为关键字 I执行带有“-lh”的“ls”匹配两个定义的关键字。

     

    Test CaseStep
    Example I execute "ls"
      I execute "ls" with "-lh"

     

    KeywordActionArgumentArgument
    I execute "${cmd}" Run ${cmd}  
    I execute "${cmd}" with "${opts}" Run ${cmd} ${opts}  

    此问题的解决方案是使用自定义正则表达式,该表达式确保关键字仅匹配特定上下文中的内容。为了能够使用此功能,并完全理解本节中的示例,您至少需要了解正则表达式语法的基础知识。

    在参数的基本名称之后定义自定义嵌入式参数正则表达式,以便使用冒号分隔参数和正则表达式。例如,只能匹配数字的参数可以定义为$ {arg:\ d +}以下示例说明了使用自定义正则表达式。

    Test CaseStep
    Example I execute "ls"
      I execute "ls" with "-lh"
      I type 1 + 2
      I type 53 - 11
      Today is 2011-06-27

     

    KeywordActionArgumentArgumentArgument
    I execute "${cmd:[^"]+}" Run ${cmd}    
    I execute "${cmd}" with "${opts}" Run ${cmd} ${opts}    
    I type ${a:\d+} ${operator:[+-]} ${b:\d+} Calculate ${a} ${operator} ${b}
    Today is ${date:\d{4\}-\d{2\}-\d{2\}} Log ${date}    

    在上面的示例关键字中,我执行“ls”与“-lh”匹配,用“$ {opts}”执行“$ {cmd}”这是保证,因为自定义正则表达式[^“] +我执行‘$ {CMD:[^’]}”指的是匹配的参数不能包含任何报价。在这种情况下,不需要将自定义regexp添加到另一个I执行变体中。

    小费

    如果引用参数,则使用正则表达式[^“] + 保证参数仅匹配第一个结束引号。

    支持正则表达式语法

    使用Python实现,Robot Framework自然使用Python的 re模块,该模块具有非常标准的正则表达式语法嵌入式参数完全支持此语法,但不能使用格式(?...)的 regexp扩展另请注意,匹配嵌入式参数不区分大小写。如果正则表达式语法无效,则创建关键字失败,并在测试执行错误中显示错误

    逃避特殊字符

    在自定义嵌入式参数regexp中使用时,需要转义一些特殊字符。首先,模式中可能关闭花括号(})需要使用单个反斜杠(\}进行转义,否则参数将在那里结束。前面的示例中说明了关闭魁梧的大括号,其中关键字今天是$ {date:\ d {4 \} - \ d {2 \} - \ d {2 \}}

    反斜杠(\)是Python正则表达式语法中的特殊字符,因此如果要使用文字反斜杠字符,则需要进行转义。在这种情况下最安全的转义序列是四个反斜杠(\\\\)但是,根据下一个字符,两个反斜杠也可能就足够了。

    公告同时在他们的关键字名称和可能的嵌入参数应该使用正常进行转义测试数据转义规则这意味着,例如,$ {name:\ w +}等表达式中的反斜杠不应该被转义。

    使用自定义嵌入式参数正则表达式的变量

    每当使用自定义嵌入式参数正则表达式时,Robot Framework会自动增强指定的正则表达式,以便除了与模式匹配的文本外,它们还匹配变量。这意味着始终可以使用具有嵌入参数的关键字的变量。例如,以下测试用例将使用前面示例中的关键字传递。

    使用自定义正则表达式的变量

     

    VariableValue
    ${DATE} 2011-06-27

     

    Test CaseStep
    Example I type ${1} + ${2}
      Today is ${DATE}

    变量自动匹配自定义正则表达式的缺点是,关键字获取的值可能实际上与指定的正则表达式不匹配。例如,上例中的变量 $ {DATE}可以包含任何值,而 今天$ {DATE}仍然匹配相同的关键字。

    行为驱动的开发示例

    将参数作为关键字名称的一部分的最大好处是,在以行为驱动的方式编写测试用例时,可以更容易地使用更高级别的类似句子的关键字以下示例说明了这一点。还要注意的是前缀考虑然后冷落的关键词定义的

    BDD样式测试使用的嵌入式参数

    Test CaseStep
    Add two numbers Given I have Calculator open
      When I add 2 and 40
      Then result should be 42
       
    Add negative numbers Given I have Calculator open
      When I add 1 and -2
      Then result should be -1
    KeywordActionArgumentArgument
    I have ${program} open Start Program ${program}  
           
    I add ${number 1} and ${number 2} Input Number ${number 1}  
      Push Button +  
      Input Number ${number 2}  
      Push Button =  
           
    Result should be ${expected} ${result} = Get Result  
      Should Be Equal ${result} ${expected}

    注意

    Robot Framework中的嵌入式参数功能受到如何在名为Cucumber的流行BDD工具中创建步骤定义的启发

    2.6.5用户关键字返回值

    与库关键字类似,用户关键字也可以返回值。返回值使用[Return] 设置定义然后可以将值分配给测试用例或其他用户关键字中的变量

    在典型情况下,user关键字返回一个值,并且可以将其设置为标量变量。这是通过在[Return]设置之后的下一个单元格中返回值来完成的用户关键字也可以返回多个值,然后可以将它们一次分配到多个标量变量,列表变量,或标量变量和列表变量。只需在[Return]设置后指定不同单元格中的值,即可返回多个值 

    用户关键字返回值

    Test CaseActionArgumentArgumentArgument
    One Return Value ${ret} = Return One Value argument  
      Some Keyword ${ret}    
             
    Multiple Values ${a} ${b} ${c} = Return Three Values
      @{list} = Return Three Values    
      ${scalar} @{rest} = Return Three Values  
    KeywordActionArgumentArgumentArgument
    Return One Value [Arguments] ${arg}    
      Do Something ${arg}    
      ${value} = Get Some Value    
      [Return] ${value}    
             
    Return Three Values [Return] foo bar zap

    2.6.6关键字拆解

    从Robot Framework 2.6开始,用户关键字也可能被拆除。它是使用[Teardown]设置定义的

    关键字拆解与测试案例拆解的工作方式大致相同最重要的是,拆卸始终是一个关键字,尽管它可以是另一个用户关键字,并且当用户关键字失败时也会执行。此外,即使其中一个失败,也会执行拆解的所有步骤。但是,关键字拆解失败将导致测试用例失败,并且不会运行测试中的后续步骤。要作为拆卸执行的关键字的名称也可以是变量。

    User KeywordActionArgumentArgument
    With Teardown Do Something    
      [Teardown] Log keyword teardown
           
    Using variables [Documentation] Teardown given as variable
      Do Something    
      [Teardown] ${TEARDOWN}  

     

    转载于:https://www.cnblogs.com/colos/p/11083350.html

    展开全文
  • 如果在ORACLE的SQL中包含关键字,可能会提示错误 例如: select * from user where number=10;   由于number是关键字,执行SQL的时候会报错   因此可以修改为 select * from user where "number"...

    如果在ORACLE的SQL中包含关键字,可能会提示错误

    例如:

    select * from user where number=10;

     

    由于number是关键字,执行SQL的时候会报错

     

    因此可以修改为

    select * from user where "number"=10;即可(这里是双引号,不是两个单引号)

     

    在sql server中要写成

    select * from user where [number]=10;

     

    同理在创建表的表名,或者字段名有关键字的里也可以这么处理,当然还是不建议把关键字做为表名或字段名的。

    展开全文
  • 创建一个通过一个,您可以将自定义关键字分组到特定类别,从而使关键字更易于搜索和使用。1. 从主菜单中选择“ 文件”>“新建”>“”以打开“ 新建关键字包” 对话框。输入的名称,然后...

    除了内置关键字,用户还可以定义自定义关键字以扩展Katalon Studio的功能。创建后,自定义关键字可以像其他内置关键字一样用于测试用例。此功能允许用户扩展关键字并在项目中重复使用它们。

    创建一个包

    通过一个包,您可以将自定义关键字分组到特定类别,从而使关键字更易于搜索和使用。

    1.  从主菜单中选择“ 文件”>“新建”>“包”以打开“ 新建关键字包” 对话框。输入包的名称,然后单击“ 确定” 

    新的自定义关键字包

    2.相应地在Katalon Studio的关键字创建新包

    Katalon Studio的关键词

    创建自定义关键字

    1.  从主菜单中选择“ 文件”>“新建”>“关键字”以打开“ 新建关键字” 对话框。输入关键字的名称,然后选择关键字的点击确定

    新关键字对话框

    2.  相应地在指定的下创建新关键字

    新关键字已创建

    3.  在你的类中输入以下代码,通过Java / Groovy定义自定义关键字:

    ItemDescription
    @Keyword用来表示下面的代码是在定义关键字
    keywordName自定义关键字的名称
    parameters自定义关键字中使用的参数列表

    例如:

    在Java / Groovy中定义自定义关键字

    4.完成后保存关键字文件。

    手动视图中的自定义关键字

    按照以下步骤在测试用例手动视图使用您定义的自定义关键字

    。 在“ 手动” 视图中打开测试用例,然后从命令工具栏中添加脚本中的自定义关键字

    在手动视图中添加自定义关键字

    2.  添加一个新的测试步骤,其中包含所有已定义的自定义关键字的列表。在此选择您最近创建的关键字。

    自定义关键字

    “脚本”视图中的自定义关键字

    按照以下步骤在测试用例脚本视图使用您定义的自定义关键字

    •  CustomKeywords允许您访问所有的自定义关键字。在脚本编辑器中输入以下语法:

    </span>
     
    CustomKeywords.
    • 输入点字符后,内容辅助功能将被调用内容辅助为代码完成提供了上下文相关的建议。因此,测试项目中定义的所有自定义关键字将显示如下:

    内容辅助功能

    • 选择最近创建的关键字并根据需要提供所有参数。

    以下API文档提供了有关用于处理自定义关键字的函数的详细信息:

    ClassMethodDescription
    Driver FactorygetWebDriver()获取当前在活动的web driver
    Test ObjectaddProperty(String name, ConditionType condition, String value)将新属性添加到测试对象
    setProperties(List<TestObjectProperty> properties) 设置测试对象的属性
    getObjectId()获取对象ID
    findPropertyValue(String name, boolean caseSensitive)使用名称查找属性的值
    Keyword UtillogInfo(String message)记录消息
    markError(String message)将关键字标记为错误
    markErrorAndStop(String message)将关键字标记为错误并停止执行
    markFailed(String message)将关键字标记为失败并继续执行
    markFailedAndStop(String message)将关键字标记为失败并停止执行
    markPassed(String message)将关键字标记为已通过
    markWarning(String message)将关键字标记为警告

    展开全文
  • 面试|static 关键字什么作用

    万次阅读 多人点赞 2019-06-16 12:43:01
    今天主要学习下Java语言中的static关键字。 static关键字的含义及使用场景 ...(注意:不能修饰普通类,除了内部类,这是为什么?) class A { static { System.out.println("A : 静态代码块"); ...

    今天主要学习下Java语言中的static关键字。

    static关键字的含义及使用场景

    static是Java50个关键字之一。static关键字可以用来修饰代码块表示静态代码块修饰成员变量表示全局静态成员变量修饰方法表示静态方法。(注意:不能修饰普通类,除了内部类,这是为什么?)

    class A {
    	static {
    		System.out.println("A : 静态代码块");
    	}
    	
    	static int i ;  // 静态变量
    	
    	static void method() {
    		System.out.println("A: 静态方法");
    	}
    }
    

    简而言之,被static关键字修饰的内容都是静态的。
    静态是相对于动态的,动态是指Java程序在JVM上运行时,JVM会根据程序的需要动态创建对象并存储对象(分配内存),对象使命结束后,对象会被垃圾回收器销毁,即内存回收由JVM统一管理并分配给其他新创建的对象;静态是指Java程序还没有运行时,JVM就会为加载的类分配空间存储被static关键字修饰的内容;如静态成员变量,Java类加载到JVM中,JVM会把类以及类的静态成员变量存储在方法区,我们知道方法区是线程共享且很少发生GC的区域,所以被static关键字修饰的内容都是全局共享的且只会为其分配一次存储空间
    所以当类的某些内容不属于对象,而由对象共享即属于类的时候,就可以考虑是否用static关键字进行修饰

    static关键字的的作用

    1 修饰代码块

    类中用static关键字修饰的代码块称为静态代码,反之没有用static关键字修饰的代码块称为实例代码块。

    实例代码块会随着对象的创建而执行,即每个对象都会有自己的实例代码块,表现出来就是实例代码块的运行结果会影响当前对象的内容,并随着对象的销毁而消失(内存回收);而静态代码块是当Java类加载到JVM内存中而执行的代码块,由于类的加载在JVM运行期间只会发生一次,所以静态代码块也只会执行一次

    因为静态代码块的主要作用是用来进行一些复杂的初始化工作,所以静态代码块跟随类存储在方法区的表现形式是静态代码块执行的结果存储在方法区,即初始化量存储在方法区并被线程共享

    2 修饰成员变量

    类中用static关键字修饰的成员变量称为静态成员变量,因为static不能修饰局部变量(为什么?),因此静态成员变量也能称为静态变量。静态变量跟代码块类似,在类加载到JVM内存中,JVM会把静态变量放入方法区并分配内存,也由线程共享。访问形式是:类名.静态成员名。

    public class StaticTest {
    	public static void main(String[] args) {
    		System.out.println(D.i);
    		System.out.println(new D().i);
    	}
    }
    class D {
    	static {
    		i = 2;
    		System.out.println("D : 静态代码块1");
    	}
    	static int i;
    }
    

    运行结果:

    D : 静态代码块1
    2
    2
    

    静态变量存储在类的信息中,且可以在线程间共享,那么它当然也属于该类的每个对象,因此可以通过对象访问静态变量,但编译器并不支持这么做,且会给出警告。

    注意:

    • 一个类的静态变量和该类的静态代码块的加载顺序。类会优先加载静态变量,然后加载静态代码块,但有多个静态变量和多个代码块时,会按照编写的顺序进行加载。
    class D {
    	static {
    		i = 2;
    		System.out.println("D : 静态代码块1");
    	}
    	static {
    		i = 6;
    		System.out.println("D : 静态代码块2");
    	}
    	static int i;
    }
    

    可以想一下运行的结果。

    • 静态变量可以不用显式的初始化,JVM会默认给其相应的默认值。如基本数据类型的byte为0,short为0,char为\u0000,int为0,long为0L,float为0.0f,double为0.0d,boolean为false,引用类型统一为null。
    • 静态变量既然是JVM内存中共享的且可以改变,那么对它的访问会引起线程安全问题(线程A改写的同时,线程B获取它的值,那么获取的是修改前的值还是修改后的值呢?),所以使用静态变量的同时要考虑多线程情况。如果能确保静态变量不可变,那么可以用final关键字一起使用避免线程安全问题;否则需要采用同步的方式避免线程安全问题,如与volatile关键字一起使用等。
    • static关键不能修饰局部变量,包括实例方法和静态方法,不然就会与static关键字的初衷-共享相违背。
    3 修饰方法

    用static关键字修饰的方法称为静态方法,否则称为实例方法。通过类名.方法名调用,但需要注意静态方法可以直接调用类的静态变量和其他静态方法,不能直接调用成员变量和实例方法(除非通过对象调用)。

    class D {
    	static {
    		i = 2;
    		System.out.println("D : 静态代码块");
    	}
    	static final int i;
    	int j;
    	
    	static void method() {
    		System.out.println(i);
    		System.out.println(new D().j);
    		
    		method1();
    		new D().method2();
    	}
    	
    	static void method1() {
    		System.out.println(i);
    	}
    	void method2() {
    		System.out.println(i);
    	}
    }
    

    注意:既然类的实例方法需要对象调用才能访问,而静态方法直接通过类名就能访问,那么在不考虑部署服务器的情况下,一个类是如何开始执行的呢?最大的可能就是通过“类名.静态方法”启动Java,而我定义那么多静态方法,JVM又是如何知道主入口呢?
    或许,你想到了main方法。
    没错,就是main方法被Java规范定义成Java类的主入口。Java类的运行都由main方法开启:

    public static void main(String[] args) {
    	for (String arg : args) {   // 参数由外部定义
    		System.out.println(arg);
    	}
    }
    

    但注意main并不是Java关键字,它只是一个规定的程序入口的方法名字;另外main方法可以重载。

    注意static关键字虽然不能修饰普通类,但可以用static关键字修饰内部类使其变成静态内部类。static关键字本身的含义就是共享,而Java类加载到JVM内存的方法区,也是线程共享的,所以没必要用static关键字修饰普通类。

    4 静态导入

    在用import导入包或者类时,可以用static修饰包名或者类,表示静态导入。静态导入可以与动态导入放在一起比较来加深理解。
    动态导入是当你程序运行时需要new一个不在此包中的类的对象时,才会根据全路径类名加载类;而静态导入则是随着类的加载而加载静态导入的类,所以它是提前导入的。

    public class StaticTest {
    	static void method1() {
    		System.out.println("static method1");
    	}
    	
    	static void method2() {
    		System.out.println("static method2");
    	}
    }
    

    静态导入:

    import static com.starry.staticImport.StaticTest.method1;
    
    public class Client {
    	public static void main(String[] args) {
    		method1();   // 
    		StaticTest.method2();
    	}
    }
    

    注意method1()是静态导入,所以可以不需要通过类名访问;而method2()没有导入,则需要通过类名调用。那么什么时候需要静态导入呢?
    静态导入常用于静态方法以及含有静态方法的类,枚举类等的导入,可以在编译阶段确定导入类的信息或者方法信息。

    static关键字的缺点

    封装是Java类的三大特性之一,也是面向对象的主要特性。因为不需要通过对象,而直接通过类就能访问类的属性和方法,这有点破坏类的封装性;所以除了Utils类,代码中应该尽量少用static关键字修饰变量和方法。

    展开全文
  • 首先解决了关键字的问题,表和方法都不是我写的,改了两个bug 第一:表设计有一列名字是values, 我查了下说事因为 values 属于关键字,所以不能使用。不然会冒红 第二:  原因。设计表时候,主键忘了添加 auto_...
  • 表tb_system_help2中包含关键字字段order 插入时会报错。 INSERT INTO tb_system_help2(sysid,sysname,helpid,helpname,parentid,isLeaf,order) VALUES(?,?,?,?,?,?,?)  解决办法: INSERT INTO tb_system_help2...
  • 关键字

    2014-07-05 11:24:38
    关键字不能用做变量名、类名、方法名、名。java关键字用来表示一种数据类型、流程控制、访问范围、类的实例等。 例如数据类型关键字:byte、char、short、long、int、double、float、boolean(8种基本数据类型)...
  • 我们经常会使用到 javascript:void(0) 这样的代码,那么在 JavaScript 中 javascript:void(0) 代表的是什么意思呢?????? javascript:void(0) 中最关键的是 void 关键字, void 是 JavaScript 中非常重要的...
  • 今天由于要解决一个前台问题,有个图片不知道哪里冒出来的。 由于我的前端知识太差了,忘记到对应的css文件去找那个图片路径。 直接根据这几天的python学习,写了一个搜索文件。 然后感慨到Python神马的简直太方便了...
  • 的导入、import关键字

    千次阅读 2019-09-10 20:06:07
    1)什么是包 ​ java 程序中存放同一个模块或单元,一些类的集合 2)为什么使用 1、不同包中的类可以重命 2、方便团队开发 3)如何使用 1、在类中可以通过名访问不同包中的类 2、java中一个类是通过全类名来...
  • 什么是关键字堆砌(keyword stuffing)? 关键字堆砌(keyword stuffing)是指在一个网页中非常密集地放置关键字。一般说来,如果关键字的出现过于频繁,就会盖过网页的其他内容。虽然过度使用关键字有可能触发 ...
  • 当抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一种形式定义和表示,就是接口interface特点:对于接口中常见的成员:而且这些成员都有固定的修饰符,不写就默认存在1:全局常量 : 都是 public static ...
  • new和newinstance()区别 在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者newInstance()是使用类...
  • java this和super关键字什么作用

    千次阅读 2009-12-30 16:37:00
    本文原址:http://www.hbzxr.com/web/36/2027736-1138928.html java this和super关键字什么作用成员函数中定义了和成员变量中相同的变量时,引用成员变量要用this. 构造函数中调用同一个类的其他构造函数时用...
  • MySQL关键字,主关键字,候选关键字

    千次阅读 2016-09-22 23:20:28
    二维表中,能够惟一确定记录的一个字段或几个字段的组合被称为“超关键字”。“超关键字”虽然能唯一确定记 录,但是它所包含的字段可能是有多余的。  如果一个超关键字去掉其中任何一个字段后不再能唯一地确定...
  • 用于关键字package和import

    千次阅读 2020-02-29 14:39:58
    大家在写代码的时候肯定都遇到这种情况,...在 Java 中,我们有 package()的概念,为了避免命名重复,我们可以放在一个里面,这样就不会出错了,或者我们可以将有关联的几个类放在一个下,也便于我们使用 p...
  • 使用enum关键字创建枚举类

    千次阅读 2018-07-31 19:13:30
    使用enum关键字创建枚举类型,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum&lt;E extends Enum&lt;E&gt;&gt;,而 E 表示枚举...
  • Oracle Minus关键字 不包含 取差集

    千次阅读 2016-09-08 17:28:09
    Oracle Minus关键字  SQL中的MINUS关键字  SQL中有一个MINUS关键字,它运用在两个SQL语句上,它先找出第一条SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果 中。如果有的话,那这一笔记录就被...
  • oracle包含最多关键字的查询语句

    千次阅读 2013-12-21 05:40:49
    我在这里给出创建表的代码: create table BOOK( b_id number primary key,--主键 b_name varchar(50) not null,--书名不能为空 b_type varchar(50),--图书类型 b_writer varchar(20),--图书作者 b_...
  • Java关键字

    2020-01-26 00:01:00
    Java关键字是对Java编译器有特殊含义的字符串,是编译器和程序员的一个约定,程序员利用关键字来告诉编译器其声明的变量类型、类、方法特性等信息。Java语言共定义了如下所示的关键字。 abstract .....
  • 如何定义关键字

    2019-01-23 13:52:00
    Katalon Studio除了内置的关键字之外,...创建包是为了存储关键字,一个包允许您将定制的关键字分组到不同的类别中。File > New > Package 创建一个关键字 新建关键字,在新的关键字对话框输入关键...
  • Static关键字

    千次阅读 2017-11-28 15:10:09
    Static关键字  本文摘抄自java编程思想第4版  static关键字  通常来说,当创建类时,就是在描述那个类的外观与行为。除非用new创建那个类的对象,否则,实际上并未获得任何对象,执行new来创建对象时,数据储存...
  • Java 关键字

    2020-08-04 14:38:07
    关键字 访问控制关键字 关键字 说明 private 私有的 protected 受保护的 public 公共的 default 默认 类、方法和变量修饰符关键字 关键字 说明 ...新,创建 static 静态 stri
  • volatile关键字到底有什么作用

    千次阅读 多人点赞 2020-03-27 09:42:19
    单例模式的双重锁为什么要加volatile [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ocKJ6ro3-1585273171038)(…/images/6.png)] 需要volatile关键字的原因是,在并发情况下,如果没有...
  • Robot Framework关键字

    2019-03-12 15:05:53
    Robot Framework关键字分为用户关键字和系统关键字,用户关键字指的是在项目中或者在测试套件中创建关键字,只在该项目中有效;系统关键字是导入的库封装的类或方法,如Selenium2Library库,也通过自己开发。 一...
  • java关键字详解

    千次阅读 多人点赞 2018-11-22 15:29:32
    一、什么是关键字关键字是java语言中一些被赋予特定意义的一些单词,不可以把它当做标识符来使用。 在java中有两个特殊的关键字goto、const,我们称这两个关键字为保留字。 二、java中有哪些关键字? 先来...
  • static关键字、package关键字、import关键字 static关键字 静态成员变量与成员变量的区别 静态成员变量 成员变量 所属不同 静态属于类,因此也叫类变量 ...随着对象的创建创建,随...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 593,988
精华内容 237,595
关键字:

创建包的关键字是什么