【Java】final & static

final关键字

Java final关键字用于限制用户,可以用于变量,方法以及类当中

final.jpg

final 变量

final关键字与变量一起使用,该变量没有值,称为空白final变量或者未初始化final变量。只能够在构造函数中初始化。空白final若是是静态(static)的,则只能够在静态块中初始化。

如果定义一个final变量,该变量的值不能够被改变,将会是一个常量

public class Test {
    final int date = 2020;
    void run(){
        date = 2021;
    }

    public static void main(String[] args){
        Test t = new Test();
        t.run();
    }
}

在IDEA中运行上述代码;

Output:

Error:(6, 9) java: 无法为最终变量date分配值

public class Test {
    final int date;
    Test() {
        date = 2020;
        System.out.println(date);
    }


    public static void main(String[] args){
        Test t = new Test();
    }
}

final 方法

如果定义一个final方法,该方法将不能够被覆写

class Bike{
    final void run(){
        System.out.println("running");
    }
}

class Test extends Bike{
    void run(){
        System.out.println("running safely with 100kmph");
    }

    public static void main(String args[]){t
        Test t= new Test();
        t.run();
    }
}

Output:

Error:(10, 10) java: package1.Test中的run()无法覆盖package1.Bike中的run()被覆盖的方法为final

final 类

如果定义一个final类,那么该类将不能够被继承

final class Bike{ }

class Test extends Bike{
    void run(){
        System.out.println("go go go!");
    }
    public static void main(String args[]){
        Test t= new Test();
        t.run();
    }
}

Output:

Error:(5, 20) java: 无法从最终package1.Bike进行继承

注:final 方法可以被继承但是不能覆写

?什么是空白或未初始化的final变量?

再变量声明时没有进行初始化的final变量

?可以声明构造函数为final吗

不可以,因为构造函数从不继承

static关键字

Java中的static关键字主要用于内存管理,可以将static关键字与变量、方法、块以及嵌套类一起使用

java-static-keyword1.png

static 变量

  • static变量可用于引用所有对象的公共属性
  • static变量在类加载时仅在类区域中获得一次内存

通过使用静态变量可以使得程序的内存使用效率更高

class Student{  
     int id;  
     String name;  
     String college="MIT";  
}  

现假设学校里面有500名学生,每次创建对象时,所有实例数据成员都将获得内存。每一名学生都有唯一的idnamecollege是同属于一个学校,是指所有对象的共同属性,因此将其设为静态变量,该字段就只获取一次内存。

class Student{  
   int rollno;
   String name;  
   static String college ="MIT";
   
   Student(int r, String n){  
       rollno = r;  
       name = n;  
   }
}

例1:没有静态变量的计数器

class Counter{  
    int count=0;
    Counter(){  
        count++;
        System.out.println(count);  
    }  
    public static void main(String args[]){  
        Counter c1=new Counter();  
        Counter c2=new Counter();  
        Counter c3=new Counter();  
    }  
}  

在这个例子中,创建了一个名为count的实例变量,该变量在构造函数中递增。由于实例变量在创建对象时获取内存,所有在每个对象中count变量的值都为1

例2:静态变量计数器

class Counter2{  
    static int count=0;
    Counter2(){  
        count++;
        System.out.println(count);  
    }  
    public static void main(String args[]){  
        Counter2 c1=new Counter2();  
        Counter2 c2=new Counter2();  
        Counter2 c3=new Counter2();  
    }  
}  

在这个例子中,静态变量仅获得一次内存。如果任何对象更改了静态变量的值,都将保存下来

static 方法

  • 静态方法属于类而不是类的对象
  • 可以直接调用静态方法而不需要创建类的实例
  • 静态方法可以访问静态数据成员并更改其值
class Student{
    int rollno;
    String name;
    static String college = "MIT";
    static void change(){
        college = "PKU";
    }
    Student(int r, String n){
        rollno = r;
        name = n;
    }
    void display(){
        System.out.println(rollno + " " + name + " " + college);
    }
}

public class TestStaticMethod{
    public static void main(String args[]){
        Student.change();  
        Student s1 = new Student(001, "Mike");
        Student s2 = new Student(002, "Hulk");
        Student s3 = new Student(003, "Mary");

        s1.display();
        s2.display();
        s3.display();
    }
}

在上面的例子中,可以不实例化就直接调用静态方法change(),并且可以直接通过静态方法访问修改静态变量的值。

限制

  • 静态方法不能够使用非静态数据成员或者直接调用非静态方法
  • this和super不能够再static context中使用

?为什么Java中的main方法是static

因为静态方法不需要创建对象就能够直接被调用,而如果是非静态方法,则JVM首先要创建一个对象,然后调用main方法,这将导致额外的内存分配

static 块

  • 用于初始化静态数据成员
  • 在类加载时,它在main方法之前执行
class Test{  
    static{
        System.out.println("static block is invoked");
    }  
    public static void main(String args[]){  
        System.out.println("Hello main");  
    }  
}  

Output:
static block is invoked
Hello main

?可以执行没有main方法的程序吗

不可以。从JDK1.7开始,没有main方法就无法执行Java类

参考

https://www.javatpoint.com/final-keyword

https://www.javatpoint.com/static-keyword-in-java

猜你喜欢

转载自www.cnblogs.com/CH42e/p/12459586.html