Java基礎之數據類型、記憶體、修飾符、代碼塊

来源:http://www.cnblogs.com/sun-haiyu/archive/2017/06/16/7026210.html
-Advertisement-
Play Games

Java 數據類型 基本數據類型 數值:int、short、long 字元:char 布爾:boolean 引用數據類型 class(類) interface(介面) 數組[] 所占位元組數 ( ) int:4位元組 char: 規定2位元組。若使用UTF 8編碼,數字和英文等占1個位元組,中文3個位元組;若 ...


Java 數據類型

  • 基本數據類型

  • 數值:int、short、long
  • 字元:char
  • 布爾:boolean

  • 引用數據類型

  • class(類)
  • interface(介面)
  • 數組[]

  • 所占位元組數1 byte= 8 bits

  • int:4位元組
  • char: 規定2位元組。若使用UTF-8編碼,數字和英文等占1個位元組,中文3個位元組;若用GBK編碼,中文是2個位元組
  • float:4位元組
  • short:2位元組
  • long:8位元組
  • double:8位元組

註意:Java中整數預設的是Int,小數預設double

float f = 2.3; // 2.3預設為double,不能轉為float,可能丟失精度
float f = 2.3f; // true 末尾加f,表示這是一個float型

long l = 12343565475989778034; // false, 預設為int,但是超出了範圍
long l = 12343565475989778034l; // 末尾加l,表示這是long型

但是如下代碼第一行是正確的。

byte b = 4; // 預設int,但經過檢查4是在byte型範圍內的,發生int -> byte的隱式強轉
b =  b + 3; // false,和為int,int型不能賦值給byte
// aa和bb都是變數,其和不能確定是否在範圍內
byte aa = 3;
byte bb = 4;
byte cc = aa + bb; // false

byte cc = 3 + 4; // 但若明確給出常量,則true
  • 變數(局部)僅在一對{}內有效,然後被銷毀。局部代碼塊,可以決定局部變數的生命周期。
{
  int a = 3;
}
System.out.println(a); // false, 已經出了這對{},被銷毀了
  • switch語句
// 若不加break,從匹配到的那個case開始,之後如果都沒break,都執行,不會跳出
switch (expression) {
  case x: 
    code;
    break;
  case y:
    code;
    break;
  default:
    code;
    break
}

函數重載和重寫(覆寫@Override

  • 函數重載
  • 同一個類中
  • 同名
  • 參數不同,或者類型不同
  • 函數重載和返回類型無關
  • 函數覆寫(@Override)
  • 繼承了父類或者實現了藉口,有事需要Override父類的方法,定義子類特有的方法。
  • 返回類型,參數列表,函數名都一致。修飾符一般也一致,總的來說,除了內部實現全部一樣。

數組--引用類型

  • 數組的定義
int[] a = {1, 23, 3};
int[] b = new int[4]; // 此種定義方式必須指定數組長度
int[] c = new int[]{1, 2, 3}; // 一般不這麼寫
  • 二維數組
int[][] arr2= new int[3][]; // 至少給第一維指定長度
// 每行的列數相同,3行2列
int[][] = arr2 = new int[3][2];
// 每行列數不一樣
int[][] arr2= new int[3][];
arr2[0] = new int[2]; // 第1行
arr2[1] = new int[3]; // 第2行
arr2[2] = new int[4]; // 第3行

棧記憶體和堆記憶體

  • 棧記憶體:存儲的是局部對象,作用域結束就被釋放
  • 堆記憶體:存儲的是數組和對象,凡是new建立的都在堆記憶體中
int[] arr = new int[3];
// 這句右邊new一個引用數據到堆記憶體,給三個值預設初始化為0
// a指向這個數組對象,即地址。也可以說new出來的數組把它的地址給了arr
// arr = null; 表示空,不綁定地址了

int[] a = new int[3];
int[] b = new int[5];
a = b; // 把b的地址綁定到a,a和b都指向b的地址了

System.out.println(arr); // 列印的是地址,格式為"[I@number",表示int,number為16進位表示的地址

訪問修飾符

  • public:任何類任何包都可以訪問
  • private:僅限於當前類中訪問
  • default(什麼修飾符都不寫,預設):同一個包的都可以訪問,不同包的子類也不能訪問
  • protected:同一個包,不同包只有子類可訪問。(範圍比default大一點)

public static void main(String args[])

這是固定格式!

為什麼必須這樣寫?

  • public:外界(JVM)調用main()函數,為了方便訪問,設為最高許可權
  • static:靜態函數,非類成員函數,無需new新對象就可通過類名.main()直接調用。

  • void:main()函數就是執行任務,不需要返回什麼值。
  • main():JVM識別main()字樣,當滿足public static void main(String args[])這樣的寫法時,則把其當成程式的入口開始執行。
  • String args[]:命令行參數,規定必須要有

public static void abc(String args[]) // 函數名不是main,不是主函數
public static void main() // 缺少命令行參數 String args[]也不是主函數
static void abc(String args[]) // 不是主函數,一定要是public static void main(String args[])

靜態static

靜態函數

靜態函數一般作為工具函數,裡面不可以用類成員,只能全用靜態成員或者方法,但是成員函數卻可以用靜態數據和方法。

靜態變數

static int money這樣就是一個靜態數據了。可以被很多對象共用,對象A改變了a,對象B中的a也改變了。大家用同一份money。

package Test;


public class StaticDemo {

    private static int money = 100;

    public int getMonney() {
        return money;
    }

    public void useMoney() {
        money--;
    }

    public static void main(String[] args) {
        StaticDemo a = new StaticDemo();
        StaticDemo b = new StaticDemo();
        // a用了一塊
        a.useMoney();
        // 還剩99
        System.out.println(a.getMonney());
        // b用的是同一份money
        b.useMoney();
        // 還剩98
        System.out.println(b.getMonney());
    }
}
  • 成員變數和靜態變數
  1. 成員變數隨對象的建立而建立,隨對象消亡而消亡。< -- > 靜態變數隨著(和對象即實例區別開)的載入而載入,隨類的消亡而消亡。即靜態成員是先於實例存在的,還沒new出對象就存在了。
  2. 成員對象只能是new出新實例後調用。< -- > 靜態成員可以直接使用,類名.靜態變數即可。
  3. 成員變數被稱為實例變數。< -- > 靜態變數被稱為類 變數
  4. 成員變數位於堆記憶體的對象中,是對象的特有數據。 < -- > 靜態變數位於方法區(的靜態區)中,也叫對象的共用數據

Q:static為何不能調用非靜態方法或者數據?

A:因為靜態數據先於對象就已經產生,成員變數還不存在,不能訪問。同理static函數中不能出現this、super關鍵字。

Q: 什麼時候用static?

A:1. 靜態變數,共用數據時,各個對象都使用同一個數據,不必作為對象特有的數據時候。如每個學生的姓名是特有的,但是每個學生可以共用同一個圖書館。

  1. 靜態方法,無需訪問類成員時(非靜態),就可以定義為靜態,一般為工具函數。

各種代碼塊

public class Abc {
  
  // 構造代碼塊,沒有static。每new一個對象,就執行一次,故稱為構造代碼塊
  // 針對不同的對象,進行相同的初始化,而構造函數對不同的對象進行不同的初始化,如給不同的人傳入不同的名字和年齡進行初始化
  {
    System.out.println("我是構造代碼塊")
  }
  // 構造函數
  Abc() {
    System.out.pritnln("我是構造函數,後於構造代碼塊執行");
  }
  // 靜態代碼塊最先執行,不論放在main()前面還是後面,都先於main載入,且只執行一次
  static {
  System.out.println("我最先");
}

  public static void main(String args[]) {
    Abc a = new Abc(); // 先進入先構造代碼塊,
    // 以下是局部代碼塊,b只在這對{}內有效
    {
      int b = 3;
    }
    System.out.println(b); // false,b已經被釋放
  }
}

!!!總的來說,執行順序:static代碼塊 --> main() --> 構造代碼塊 --> 構造方法


by @sunhaiyu

2016.12.8


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上一篇幾乎都在說DoubleAnimation的應用,這篇說說PointAnimation。 1. 使用PointAnimation 使用PointAnimation可以讓Shape變形,但實際上沒看到多少人會這麼用,畢竟WPF做的軟體多數不需要這麼花俏。 1.1 在XAML上使用PointAnim ...
  • 背水一戰 Windows 10 之 控制項(集合類 - ItemsControl 的佈局控制項): ItemsStackPanel, ItemsWrapGrid ...
  • 操作系統: CentOS 6.9_x64 go語言版本: 1.8.3 問題描述 golang沒有提供生成uuid的介面,但開發中確實需要uuid。 這裡把看到的代碼記錄下,也方便我以後查閱。 解決方案 示例代碼如下: 運行效果: 討論 當然如果你只是想快速的得到uuid,而且使用的是linux系統, ...
  • 學習Java繼承之前,我們想回憶一下Java面向對象需要特別註意的幾個關鍵點。 面向對象是將複雜的事情簡單化了,它通過封裝的方式使得代碼的重用性更高和安全性更強。平時我們要學會用面向對象的方式去思考,去描述事物或行為。 想要使用OOP,一定要清楚其三個主要特征: 1.對象的行為(behavior): ...
  • 1、問題:啟動Tomcat時報錯! 主要錯誤代碼如下 1 1 在這段代碼之前還有錯誤代碼: 1 1 2、出現錯誤的環境:spring MVC + MyBatis框架下,涉及有control層、service層、dao層。 3、問題分析:一開始以為是由於control層使用@Resource出現的異常 ...
  • 最近開發一個項目,需要調用第三方的介面,第三方提供的數據是xml,我直接使用Array2XML把php數組轉成XML格式。 XML格式如: 由於php數組無法指定多個重覆下標,後面的會覆蓋前面的值,最終只會展示一個值 上面php數組用Array2XML轉成XML,body裡面只會有一個item節點。 ...
  • 本文為公司製作API介面後臺的小結! 1.命名註意事項: 不要使用易混淆的名字,如index,index01... 我喜歡用拼音... 比如: 2.資料庫文件修改: 去database.php里把數據得首碼去掉; 3.獲取請求的值: 4.操作資料庫: (1)原生操作: (2)name查詢: 5.返回 ...
  • 前言: 這幾天剛剛開始學習python,然後就安裝了pycharm,但是那個中文亂碼的問題真是讓人心煩,在網上找了好久,都寫得好亂,今天終於讓我解決了,在這裡總結一下經驗,希望可以幫到你們 問題:如下圖,我的問題主要是在控制台輸入漢字的時候會出現以下亂碼 一般的解決方法 1. 首先如上圖所示,把fi ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...