java语言中static是什么意思,static是什么意思

  java语言中static是什么意思,static是什么意思

  

  如何解决写爬虫IP受阻的问题?立即使用。

  一、static方法

  静态方法一般称为静态方法。因为静态方法可以在没有任何对象的情况下被访问,所以静态方法不存在这个问题,因为它没有附加到任何对象。既然没有对象,就没有这个。而且由于这个特性,类的非静态成员变量和非静态成员方法在静态方法中是无法访问的,因为非静态成员方法/变量只能依靠特定的对象来调用。

  但是,需要注意的是,虽然不能在静态方法中访问非静态成员方法和变量,但是可以在非静态成员方法中访问静态成员方法/变量。举个简单的例子:

  在上面的代码中,因为print2方法独立于对象而存在,所以可以使用类名直接调用它。如果可以在静态方法中访问非静态方法/变量,那么如果main方法中有以下语句:

  my object . print 2();这个时候没有对象,str2根本不存在,所以会有矛盾。方法也是如此。因为不能预测print1方法中是否访问非静态成员变量,所以禁止在静态成员方法中访问非静态成员方法。

  对于非静态成员方法,访问静态成员方法/变量显然是无限制的。

  因此,如果要调用方法而不创建对象,可以将此方法设置为static。我们最常见的静态方法是main方法。至于为什么main方法一定是静态的,现在清楚了。因为程序在执行main方法时不创建任何对象,所以只能通过类名来访问。

  另外,记住,关于构造函数是否是静态方法,请参考http://blog.csdn.net/qq_17864929/article/details/48006835.

  二、static变量

  静态变量也叫静态变量。静态变量和非静态变量的区别在于,静态变量是所有对象共享的,内存中只有一个副本【存储在方法区】,当且仅当类第一次加载时才会初始化【带final和不带final的静态变量初始化位置不同】。非静态变量归对象所有,创建对象时初始化,有多个副本,每个对象拥有的副本互不影响。

  静态成员变量的初始化顺序根据定义的顺序进行初始化。

  三、static代码块

  Static关键字在形成静态代码块以优化程序性能方面也起着关键作用。静态块可以放在类中的任何地方,一个类中可以有多个静态块。第一次加载类时,每个静态块都会按照静态块的顺序执行,而且只执行一次【根据类加载的原理,每个类加载一次,使用父委托加载】。

  初始化顺序静态代码块构造的代码块构造函数

  公共类客户端{

  {//构造一个代码块

  System.out.println(执行构造块);

  }

  }为什么静态块可以用来优化程序性能,是因为它的特性:在类加载的时候只会执行一次。这里有一个例子:

  类别人员{

  私人日期出生日期;

  公众人物(出生日期){

  this . birth date=birth date;

  }

  boolean isBornBoomer() {

  date start date=date . value of( 1946 );

  date end date=date . value of( 1964 );

  返回birth date . compare to(start date)=0 birth date . compare to(end date)0;

  }

  }isBornBoomer用于确定此人是否出生于1946-1964年,每次调用isBornBoomer都会生成startDate和birthDate两个对象,造成空间浪费。如果换成这样,效率会更高。事实上,它利用了静态代码块在内存中加载一次的机制:

  类别人员{

  私人日期出生日期;

  私有静态日期startDate,endDate。

  静态{

  start date=date . value of( 1946 );

  end date=date . value of( 1964 );

  }

  公众人物(出生日期){

  this . birth date=birth date;

  }

  boolean isBornBoomer() {

  返回birth date . compare to(start date)=0 birth date . compare to(end date)0;

  }

  }所以很多情况下,一些只需要执行一次的初始化操作会在静态代码块中执行。

  四、静态内部类

  这个地方不单独写静态内部类,但是可以通过和普通内部类的对比来加深对静态内部类的理解:

  为什么使用内部类?

  1.内部类一般只用于它的外部类;[这是外部类使用的一个很好的例子。hashmap集合中有一个内部类条目,转换成hashmap存储使用]

  2.内部类提供了某种了解外部类的窗口。内部类有对外部类的引用,所以内部类可以直接访问外部类的属性;

  3.也是最吸引人的原因。每个内部类都可以独立地继承一个接口,不管外部类是否已经继承了一个接口。因此,内部类使得多重继承的解决方案更加完整。

  定义在类内部的类称为内部类,包含内部类的类称为外部类。类可以声明访问限制,如public、protected、private等。在内部,抽象为其他内部或外部类继承和扩展,或静态和最终,或实现特定的接口。

  外部类根据常规的类访问方法(以对象的形式)使用内部类。唯一的区别是外部类可以访问内部类的所有方法和属性,包括私有方法和属性。当外部类访问内部类时,它需要创建对象访问。需要注意的是,内部类不能访问外部类所在的局部变量,只能访问final修改的局部变量。

  在方法中定义内部类时,如果内部类调用方法中的变量,那么这个变量必须声明为final类型,这就令人费解了。后来认为应该是生命周期的原因,因为方法中定义的变量是局部变量。如果离开这个方法,变量就失去了作用,它会被自动消除。但是内部类不离开它的方法,不会失去它的功能,它的生命周期更广。

  (1)创建一个实例

  远远超过。inner class obj=out class instance . new inner class();//注意是外部类实例。新的,内部类

  AAA。StaticInner in=新AAA。static inner();//注意,它是外部类本身,静态内部类(2) this在内部类中

  这在一个类中像其他类一样引用自己。当一个内部类对象被创建时,它将与创建它的外围对象有一些联系,因此它可以访问外围类的所有成员,而无需任何特殊条件。可以理解为内部类链接到外部类。当用外部类创建内部类对象时,内部类对象会偷偷捕获一个对外部类的引用,所以可以通过这个引用访问外围类的成员。

  (3)外部类访问内部类

  内部类类似于外部类,所以在访问内部类对象时,总是需要一个创建的外部类对象。外部类对象以‘外部类名. this . XXX’的形式访问内部类的属性和方法。比如:

  system . out . println( Print in inner outer . index= pouter . this . index);

  system . out . println( Print in inner inner . index= this . index );(4)内部类向上转化。

  内部类也可以像普通类一样具有向上转化的特性。当内部类转化为基类型时,尤其是接口,内部类就有用了。如果内部类是私有的,它只能被它的外部类询问,这样就完全隐藏了实现细节。

  (5)方法中的类

  在方法中创建的类(注意,该类也可以在方法中定义)不能添加访问修饰符。另外,方法内部的类不是在调用方法的时候创建的,也是提前编译好的。

  (6)静态内部类

  定义静态内部类:在定义内部类时,可以在它前面添加一个权限修饰符static。此时,这个内部类变成了一个静态内部类。

  通常称为嵌套类,当内部类是静态的时,它意味着:

  [1]创建嵌套类的对象,不需要它们外围类的对象;

  [2]不能从嵌套类的对象访问非静态外围类对象(不能从静态内部类的对象访问外部类的非静态成员);

  嵌套类和普通内部类还有一个区别:普通内部类的字段和方法只能放在类的外部级别,所以普通内部类不能有静态数据和静态字段,也不能包含嵌套类。但是所有这些都可以包含在嵌套类中。也就是说,不能在非静态内部类中声明静态成员。只有将内部类修饰为静态类,才能在该类中定义静态成员变量和成员方法。

  此外,在创建静态内部类时,不需要将静态内部类的实例绑定到外部类的实例。普通非静态内部类的对象被附加到外部类对象上。要在外部类中定义静态内部类,不需要使用关键字new来创建内部类的实例。静态类和方法只属于类本身,不属于类的对象,更不属于其他外部类的对象。

  (7)内部类标识符

  每个类产生一个. class文件,文件名就是类名。同样,内部类也会产生这样的. class文件,但是它的名字不是内部类的类名,而是有严格的限制:外围类的名字,加上$,加上内部类的名字。

  特定代码:

  公共类远超测试

  {

  静态int a;

  int b;

  公共静态void测试(){

  System.out.println(“外部类静态函数”);

  }

  公共静态void main(String[] args) {

  //新建外部类

  outclass test oc1=new outclass test();

  //通过外部类的对象新建一个非静态内部类

  遥遥领先。inner class no _ static _ inner=oc1 . new inner class();

  //调用非静态内部类的方法

  system . out . println(no _ static _ inner . getkey());

  //调用静态内部类的静态变量

  system . out . println(outclass test。innerstaticclass . static _ value);

  //直接实例化内部静态类,不依赖外部类实例。

  遥遥领先。InnerStaticClass inner=new outclass test。InnerStaticClass();

  //调用静态内部类的非静态方法

  system . out . println(inner . getvalue());

  //调用内部静态类的静态方法

  system . out . println(outclass test。innerstaticclass . getmessage());

  }

  私有类InnerClass {

  //静态成员只能在静态内部类中声明或定义。

  //私有静态字符串TT=“0”;

  private int标志=0;

  公共InnerClass() {

  //三。非静态内部类的非静态成员可以访问外部类的非静态变量和静态变量。

  system . out . println( inner class create a: a );

  system . out . println( inner class create b: b );

  system . out . println( inner class create flag: flag );

  //

  System.out.println(InnerClass调用外部静态函数);

  //调用外部类的静态方法

  test();

  }

  公共字符串getKey() {

  返回“no-static-inner”;

  }

  }

  私有静态类InnerStaticClass {

  //静态内部类可以有静态成员,而非静态内部类不能有静态成员。

  私有静态字符串static _ value=“0”;

  private int标志=0;

  公共InnerStaticClass() {

  system . out . println( inner class create a: a );

  //静态内部类不能访问外部类的非静态成员

  //system . out . println( inner class create b: b );

  system . out . println( InnerStaticClass标志为 flag);

  system . out . println( InnerStaticClass TT为 static _ value );

  }

  public int getValue() {

  //静态内部类访问外部类的静态方法

  test();

  返回1;

  }

  公共静态字符串getMessage() {

  返回“static-inner”;

  }

  }

  public OutClassTest() {

  //新建一个非静态内部类

  inner class IC=new inner class();

  system . out . println(“outer class create”);

  }

  }是的,类名后面有一个. *,表示在这个类中导入静态方法。当然,你可以导入一个静态方法,只需修改。*到静态方法名。然后,在这个类中,可以直接用方法名调用静态方法,而不是用类名调用。方法名称。

  好处:这种方法的好处是可以简化一些操作,比如打印操作system . out . println(…);可以把它写成静态方法print(…),用的时候直接打印(…)就行了。但是,当有许多重复调用时,建议使用这种方法。如果只有一两个电话,不如直接写信方便。

  示例:

  在Java 5中,import语句得到了增强,提供了更强大的减少击键次数的功能,尽管有些人认为这是以牺牲可读性为代价的。这个新特性被称为静态导入。当您想要使用静态成员时,您可以使用静态导入(您可以在API中的类和您自己的类上使用该功能)。以下是静态导入前后的代码示例:

  静态导入前:

  公共类TestStatic {

  公共静态void main(String[] args) {

  System.out.println(整数。MAX _ VALUE);

  system . out . println(integer . tohexstring(42));

  }

  }静态导入后:

  导入静态Java . lang . system . out;

  导入静态Java . lang . integer . *;

  公共类TestStaticImport {

  公共静态void main(String[] args) {

  out . println(MAX _ VALUE);

  out . println(toHexString(42));

  }

  }让我们看看使用静态导入特性的代码会发生什么:

  1.虽然这个特性通常被称为“静态导入”,但是语法必须是import static,后跟要导入的静态成员的完全限定名,或者通配符。在这个例子中,我们对System类的out对象进行静态导入。

  2.在这个例子中,我们可能想要使用java.lang.Integer类的几个静态成员。这个静态导入语句使用通配符来表达“我想在这个类的所有静态成员上静态导入”。

  3.现在我们终于看到了静态导入特性的好处!我们不必在System.out.println中键入System太好了!另外,我们不必在Integer中键入Integer。MAX_VALUE。因此,在这行代码中,我们可以使用静态方法和常量的快捷方式。

  4.最后,我们做了更多的快捷操作,这次是针对Integer类的方法。

  我们有点讽刺这个功能,但我们不是唯一的。我们不认为保存少量的击键会使代码有点难以阅读,但许多开发人员要求将它添加到语言中。

  以下是使用静态导入的一些原则:

  你必须说静态导入,而不是静态导入。

  当心不明确命名的静态成员。比如对Integer类和Long类进行静态导入,引用MAX_VALUE会导致编译器错误,因为Integer和Long都有一个MAX_VALUE常量,Java不会知道你引用的是哪个MAX_VALUE。

  您可以对静态对象引用、常量(记住,它们是静态的或最终的)和静态方法进行静态导入。

  PHP中文网站上有很多java培训视频。欢迎在线学习!这就是java静态的细节。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: