static

修饰变量

1.static修饰的变量(类变量,静态变量)被所有的对象共享,优先于对象存在,可以通过 类名.静态成员 来访问。
2.静态变量是属于类本身的,而不属于某个对象,在内存中只有一个复制,只要静态变量所在的类被加载,这个静态变量就会被分配空间。
3.与普通的非static成员变量比较:

成员变量随着对象的创建而存在随着对象的回收而释放
静态变量随着类的加载而存在随着类的消失而消失

成员变量也称为实例变量
静态变量称为类变量

成员变量只能被对象调用
静态变量可以被对象调用,也可以用类名调用。(推荐用类名调用)

成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。

4.方法如何访问static修饰的变量(即静态变量)的?

  • 普通方法可以访问静态变量
  • 静态方法只能访问静态变量,而不能访问普通的成员变量
  • 静态方法中不能使用this或者super关键字
  • 主方法是静态的(public static void main(String[] args) {})

修饰变量

static修饰的方法(类方法,静态方法),可以通过 类名.静态方法 来访问,可以调用类变量和类方法,不能调用普通的成员变量和成员方法,其他跟类变量一样。

修饰局部变量(方法内的变量)

有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量保留上一次函数调用结束时的值。
虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的,也就是说,在其他函数中它是“不可见”的。

修饰初始化块

static可以修饰初始化块,静态初始化块的优先级最高,也就是最先执行,并且仅在类第一次被加载时执行.

不能修饰构造方法

JAVA中静态的东西都是属于类的,为类服务,构造函数是为了初始化对象,为对象服务。
构造函数是用来生成实例,既然是实例就不是static的。

修饰类

不能修饰普通类,但是可以修饰内部类

final

修饰全局变量,局部变量

final修饰的变量可以看成一个常量,必需赋值,再次赋值会报错。
在继承中可以被覆盖

修饰方法

表明此方法不能被重写,但是可以被子类调用,如果此方法为private final,即也不能被子类调用和重写。
可以实现重载是没问题的,如下面代码都通过,也说明重载跟访问修饰符和加不加final无关系:

public  final void x(){}
public void x(String xx){}
private  final  void x(int xx){}
void x(double x){}

修饰类

表示此类为最终类,不允许继承,只能被实例化
被声明为最终类的,通常为有固定作用,用来完成某种标准功能的类.
修饰类的话,那此类的成员方法变成final方法
非final类(包括抽象类)也可以包含final属性/final方法,包含final属性/final方法的非final类可以被继承.

其他修饰

不能修饰构造方法,初始化块

abstract

修饰方法

父类的抽象方法必须被子类实现(如果子类也是抽象类即不用)
只需声明,无方法体.(结构为 : abstract 返回值类型 抽象方法名(参数列表);)

修饰类

什么是抽象类?
只定义一种结构,给定一组方法的接口,不提供任何完整的方法去实现,即定义一个能够被所有子类共享的通用结构父类,把具体实现功能的细节留给每个子类去实现,这种特殊的父类称为抽象类.

抽象类不能被实例化,只能被继承
抽象类不一定包含抽象方法(可以包含普通方法),但一个类如果包含抽象方法,则这个类必须声明为抽象类.
抽象类可以不实现接口的方法,由抽象类的子类实现.
抽象类的作用类似模板,用来规范子类.

与接口的区别
https://blog.csdn.net/f346867698/article/details/79435263

其他

不能修饰变量,构造方法,初始化块