ROS2學習之旅(16)——建立自定義ROS2 msg和srv檔案
1、final資料
在Java中,用來告知一塊資料時恆定不變的:
#一個永遠不會改變的編譯時常量
#一個在執行時被初始化的值,且不希望被改變
編譯時常量:在編譯時執行計算式,減輕了一些執行時的負擔,這類常量必須時基本資料型別,且需要用final修飾,在這個常量進行定義的時候,必須進行賦值。
修飾變數
# 用final關鍵字修飾的變數,只能進行一次賦值操作,並且生存期內不可以改變他的值。final修飾的變數可以先宣告,後賦值。
#final修飾基本型別時,起到常量的作用,基本型別的值不可變。
# final修飾物件引用的時候,使引用恆定不變。一旦引用被初始化指向一個物件,就無法再把它改為指向另一個物件。但是物件自身可以修改。
#一個既是static又是final的域只佔據一段不能改變的儲存空間
#當final作用於類的成員變數時,成員變數必須再定義時或者構造器中進行初始化。
#Java允許生成空白final,所謂空白final是指被宣告為final但是並沒有被初始化,但是再使用之前必須確保初始化。
import java.util.Arrays; import java.util.Random; class Value{ int i; public Value(int i){ this.i = i; } } public class FinalData { privatestatic Random rand = new Random(40); private String id; public FinalData(String id){ this.id = id; } private final int ValueOne = 9; private static final int VALUE_TWO = 99; public static final int VALUE_THREE = 39; private final int i1 = rand.nextInt(20); staticfinal int i2 = rand.nextInt(20); private Value v1 = new Value(11); private final Value v2 = new Value(22); private static final Value V3 = new Value(33); private final int[] a = {1,2,3,4,5}; @Override public String toString() { return "FinalData{" + "id='" + id + '\'' + ", ValueOne=" + ValueOne + ", i1=" + i1 + ", v1=" + v1 + ", v2=" + v2 + ", a=" + Arrays.toString(a) + '}'; } public static void main(String[] args) { FinalData fd1 = new FinalData("fd1"); //fd1.id; //fd1.ValueOne++; //fd1.v2.i; System.out.println(fd1); } }
2.final修飾方法引數
編寫方法時,可以在引數面前新增final關鍵字,他表示在整個方法中,不能改變引數的值。也就是說不能改變引數的值,但是可以改變引用型別引數的物件的值。同時,即使沒有final的修飾,引數的改變也不會影響到方法外的變數。
class Test{ public int test(final int i){ return i + 1; } }
//僅僅可以讀取i,不能改變
3.final修飾方法
final關鍵字修飾方法時,表示該方法不可以被重寫。類中所有的private方法都隱式的指定為是final的,由於無法在類外使用private方法,所以也無法覆蓋他。
4.final修飾類
final修飾的類無法被繼承。且類中所有的成員方法都會被隱式的定義為final
5.final的優點
5.1final關鍵字提高了效能。JVM和JAVA應用都會快取final變數
5.2final變數可以安全的在多執行緒的環境下進行共享,而不需要有額外的同步開銷
5.3在使用匿名內部類的時候所有變數都是final變數
static和final區別
1.static修飾的欄位在類載入過程中的準備階段被初始化為0或者null,之後再初始化階段才會被賦予程式碼中設定。
2.final修飾的欄位再執行時被初始化,一旦賦值,便不能修改。
詳細理解可以看我static的部落格。