首頁  >  文章  >  Java  >  Java基礎之資料型態、記憶體、修飾符、程式碼區塊

Java基礎之資料型態、記憶體、修飾符、程式碼區塊

巴扎黑
巴扎黑原創
2017-06-26 11:28:371121瀏覽

Java 資料型別

  • 基本資料型別

  • ##字元: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; // falsebyte 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[]:命令列參數,規定必須有

<pre class="sourceCode java">public static void abc(String args[]) // 函数名不是main,不是主函数public static void main() // 缺少命令行参数 String args[]也不是主函数static void abc(String args[]) // 不是主函数,一定要是public static void main(String args[])</pre>

靜態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();// 还剩99System.out.println(a.getMonney());// b用的是同一份moneyb.useMoney();// 还剩98System.out.println(b.getMonney());
    }
}
###
  • 成员变量和静态变量

  1. 成员变量随对象的建立而建立,随对象消亡而消亡。13dd6e535e0887248bab718236989bd4 静态变量随着(和对象即实例区别开)的加载而加载,随类的消亡而消亡。即静态成员是先于实例存在的,还没new出对象就存在了。

  2. 成员对象只能是new出新实例后调用。13dd6e535e0887248bab718236989bd4 静态成员可以直接使用,类名.静态变量即可。

  3. 成员变量被称为实例变量。13dd6e535e0887248bab718236989bd4 静态变量被称为类 变量

  4. 成员变量位于堆内存的对象中,是对象的特有数据。 13dd6e535e0887248bab718236989bd4 静态变量位于方法区(的静态区)中,也叫对象的共享数据

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() --> 构造代码块 --> 构造方法

以上是Java基礎之資料型態、記憶體、修飾符、程式碼區塊的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn