final和static

*final:最终的、不可改变的-------单独应用率低:
1.修饰变量:变量不能被改变
  1)final修饰成员变量,必须如下两个位置初始化:
    1.1)声明同时初始化成员变量
    1.2)在构造方法中初始化成员变量
  2)final修饰局部变量,只要在用之前初始化即可
例:
class Aoo{
final int a = 5; //声明同时初始化成员变量
final int b;
Aoo(){
b = 5; //在构造方法中初始化成员变量
}
void test(){
final int c;//final修饰局部变量,只要在用之前初始化即可,不给值也可以
//a = 55; //编译错误,final的变量不能被改变
}
}

2.修饰方法:方法不能被重写,可以重写别的方法
例:
class Boo{
final void show() {}
void test() {}
}
class Coo extends Boo{
//void show() {} //编译错误,final的方法不能被重写
void test() {}
}

3.修饰类:类不能被继承,可以继承超类
例:
final class Doo{}
//class Eoo extends Doo{} //编译错误,final修饰的类不能被继承
class Foo[]
final class Joo extends Foo{} //编译正确,final修饰的类可以继承超类


*static:静态的
1.静态变量(没有static修饰就称为实例变量)
1.1)由static修饰
1.2)属于类,存储在方法区中,就一份
1.3)既然属于类就常常通过类名点来访问
1.4)何时用:所有对象所共享的数据(图片、音频、视频等)

2.静态方法(没有static修饰就称为实例方法)
  2.1)由static修饰
  2.2)属于类,储存在方法区中,就一份
  2.3)既然属于类就常常通过类名点来访问
    Scanner scan = new Scanner(System.in);//new一个对象
    int a = scan.nextInt(); //实例方法
    double b = scan.nextDouble();//实例方法

    double c = Math.random(); //静态方法(通过类名Math.来访问)
    double d = Math.sqrt(25);(求参数的平方根) //静态方法(通过Math.来访问)
    Arrays.sort(arr); //静态方法(通过类名Arrays.来访问)
2.4)静态方法没有默认的this传递(没有this意味着没有对象,而实例变量必须通过对象来访问)
         静态方法不能直接访问实例成员
2.5)何时用:方法的操作仅与参数相关而与对象无关的时候用
{
假设sqrt()不是静态的:
无论m1,m2,m3,...,m100中的哪一个对象,去sqrt(25),最终结果都是一样的
说明:sqrt()的操作仅与参数相关而与对象无关
这种情况下sqrt()适合做成静态的

Math m1 = new Math();
double d = m1.sqrt(25); //5.0

Math m2 = new Math();
double d = m2.sqrt(25); //5.0

Math m3 = new Math();
double d = m3.sqrt(25); //5.0
}

3.静态块
  3.1)属于类的,在类被加载期间自动执行,因为类只被加载一次,所以静态块只执行一次
  3.2)何时用:加载/初始化静态资源(图片、音频、视频等)

*static final常量:
1.必须声明同时初始化
2.由类名点来访问,不能被改变
3.建议:常量名所有字母都大写,多个单词由_分隔
4.编译器在编译时将常量直接替换为具体的值,效率高
5.何时用:数据永远不变,并且经常使用(做成static final常量是最好的)

欢迎大佬指点。
原文地址:https://www.cnblogs.com/tietouwa/p/13448734.html