static和final&static、final修饰符、内部类

一、static

1. static修饰变量:

static修饰的变量属于静态变量,随着类加载直接分配内存,与实例对象无关,所有类共用静态变量(需要考虑作用域,private、public之类),由于共用内存区域的问题,所以在并发场景下直接使用静态变量会有安全问题,正确打开方式是:对修改静态变量的函数加锁;

2. static修饰函数:

static修饰的函数属于整个类,在类加载]的时候就存在且可以被调用;除此之外,static修饰的函数不可以用abstract修饰,必须实现;

3. static修饰代码块

静态代码块在类构造函数之前就被执行,具体为:
父类静态代码块——>子类静态代码块——>父类非静态代码块——>父类构造方法——>子类非静态代码块——>子类构造方法

二、final

1. final修饰变量

修饰基本数据类型(short\int\long\byte\double\float\char\boolean)时,表示这个变量值不可变;
修饰引用数据类型时,表示这个变量引用不可变,但引用的对象具体内容是可以改变的(比如对象的某个属性值是可变的)

2. final修饰方法

表示此方法不可被继承重写,保证了方案安全性。

3. final修饰类

表示此类不可以被继承

4. 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、匿名级:局部式。

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

猜你喜欢

转载自blog.csdn.net/qq_43842093/article/details/130119046
今日推荐