static、final修饰符、内部类

static修饰符:
static修饰符能够与属性、方法和内部类一起使用,表示静态的。类中的静态变量和静态方法能够与类名一起使用,不需要创建一个类的对象来访问该类的静态成员。

class StaticText{
    //静态变量
    static int i=47;
    //静态方法
    static void echo(){
        System.out.println("There is a Static Method");
     }
    //构造函数
    StaticText(){
        System.out.println("There is a Constructor");
    }
    //静态域
    static {
        System.out.println("There is a static block");
    }

}
public class Text { 
    public static void main(String[] args) {
        StaticText A = new StaticText();
        StaticText B = new StaticText();
        //A.i和B.i指向同一内存空间
        System.out.println(A.i==B.i);
        A.i++;
        //此时还是有A.i==B.i
        System.out.println(B.i);
        //使用类名访问时首选方法,这不仅仅是因为它强调了变量的static结构,还为编译器进行优化提供了更好的机会
        System.out.println(StaticText.i);
    }
}

运行结果为:
There is a static block
There is a Constructor
There is a Constructor
true
true
48

static属性的内存分配:一个类中,一个static变量只会有一个内存空间,虽然有多个类实例,但这些类实例中的这个static变量会共享同一个内存空间。

静态初始器——静态块 : 静态初始器是一个存在与类中方法外面的静态块,仅仅在类装载的时候执行一次,通常用来初始化静态的类属性。

static的变量是在类装载的时候就会被初始化,即, 只要类被装载,不管是否使用了,都会被初始化。

static的基本规则

  • 一个类的静态方法只能访问静态属性;
  • 一个类的静态方法不能直接调用非静态方法;
  • 如访问控制权限允许,static属性和方法可以使用对象名加“.”的方式调用,也可以使用实例加“.”的方式调用;
  • 静态方法中不存在当前对象,因而不能使用this,也不能使用super;
  • 静态方法不能被非静态方法覆盖;
  • 构造方法不允许声明为static的。

尽管当static作用于某个字段时,肯定会改变数据创建的方式(因为static字段对于每一个类来说只有一份存储空间,而非static字段则是对每个对象有一个存储空间)。但是static作用于某个方法时,差别就没有那么大。static方法的一个重要作用就是在不创建任何对象的前提下就可以通过类名来调用它。


final修饰符
在Java声明类、属性和方法时,可以使用关键字final来修饰,final所标记的成分具有终态的特征,表示最终的意思。

final修饰符的基本规则

  • final标记的类不能被继承;
  • final标记的方法不能被子类重写;
  • final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次;
  • final标记的成员变量必须在声明的同时赋值,如果在声明的时候没有赋值,那么只有一次赋值的机会,而且只能在构造方法中显式赋值,然后才能使用;
  • final标记的局部变量可以只声明不赋值,然后再进行一次性的赋值;
  • final一般用于标记那些通用性的功能、实现方式或取值不能随意被改变的成分,以避免被误用。

内部类
在一个类(或方法、语句块)的内部定义另一个类,后者称为内部类,有时也称为嵌套类。

内部类的特点

  • 内部类可以体现逻辑上的从属关系,同时对于其它类可以控制内部类对外不可见等;
  • 外部类的成员变量作用域是整个外部类,包括内部类,但外部类不能访问内部类的private成员;
  • 逻辑上相关的类可以在一起,可以有效地实现信息隐藏 内部类可以直接访问外部类的成员;
  • 编译后,内部类也被编译为单独的类,名称为outclass$inclass的形式。
public class Outer{
    private int size=0;
    class Inner{
      public int counter = 10;
      public void doStuff(){
          size++;
      }
    }
    public static void main(String [] args){
        Outer outer = new Outer();
        Inner inner = outer.new Inner();
        inner.doStuff();
        System.out.println(outer.size);
        System.out.println(inner.counter);   
    }   
}

内部类可以分为四种:1、类级:成员式,有static修饰;2、对象级:成员式,普通,无static修饰;3、本地内部类:局部式;4、匿名级:局部式。

静态变量存放在方法区中。

你可能感兴趣的:(java语言)