讀書筆記1

數據類型

整型

  • int 存儲要求:4byte 取值範圍:-2147483648 -- 2147483647(超過20億)java

  • short 存儲要求:2byte 取值範圍:-32768 -- 32767面試

  • long 存儲要求:8byte 取值範圍:-9223372036854775808 -- 9223372036854775807sql

  • byte 存儲要求:1byte 取值範圍:-128 -- 127
    java沒有任何無符號類型(unsigned) segmentfault

浮點類型

  • float 存儲要求:4byte 取值範圍:大約+-3.40282347E+38F(有效位數爲6~7位)數組

  • double 存儲要求:8byte 取值範圍:大約+-1.79769313486231570E+308(有效位數爲15位)this

  • double類型的精度是float的兩倍spa

  • float類型的數值有一個後綴F(如3.14F),沒有後綴的浮點數值(如3.14)默認爲double類型。固然也能夠在浮點數值後添加後綴D表示double類型code

char類型

char用於表示單個字符,一般用來表示字符常量對象

boolean類型

值true,false,用來斷定邏輯條件。 整型值和布爾值之間不能進行轉換 繼承

變量

變量名必須是一個以字母開頭的由字母或數字構成的序列,可是+,@這樣的符號不能出如今變量名中,空格也不行。變量名的長度沒有限制。另外,不能將變量命名爲java的保留字。能夠在一行中聲明多個變量,如int i,j;

變量初始化

聲明一個變量後,必須用賦值語句對變量進行顯式初始化,千萬不要使用未被初始化的變量,如

int a;
System.out.println(a);//ERROR--variable not initialized

常量

利用關鍵字final表示,這個變量只能被賦值一次,一旦被賦值,就不能再更改了。習慣上,常量名使用全大寫。
類常量用關鍵字static final表示

運算符

算是運算符+,-,*,/分別表示加,減,乘,除。當參與/的兩個數都是整數時,表示整數除法,不然表示浮點除法。%表示求餘操做。

x+=4;
x=x+4;

二者等價。

數值類型間的轉換

圖片描述
實心箭頭表示無信息丟失的轉換,虛線箭頭表示可能有精度損失的轉換。
若是試圖將一個數值從一種類型強制轉換爲另外一種類型,而又超過了目標類型的取值範圍,結果會截斷成一個徹底不一樣的值

字符串

將一個字符串與一個非字符串的值進行拼接(+)時,後者會被轉換成字符串,由於任何一個java對象均可以轉換成字符串.

控制流程

塊做用域

是由一對花括號括起來的若干簡單的java語句,塊肯定了變量的做用域,一個塊能夠嵌套到另外一個塊中。

public static void main(String[] args)
{
    int n;
    ...
    {
        int k;
        ...
    }//變量k的做用域到這裏爲止
}

可是,不能在嵌套的兩個塊中聲明相同名字的變量

public static void main(String[] args)
{
    int n;
    ...
    {
        int n;
        int k;
        ...
    }//這裏不能再定義變量n了
}

for循環

  • 在循環中,檢測兩個浮點數是否相等須要當心

for(double x=0;x!=10;x+=0.1)...
  • 在for語句中聲明的變量,做用域是for循環的整個循環體

for(int i=0;i<10;i++){
    ...
}//i的做用域到此爲止

若是想在循環體外使用i,就要確保i在循環語句的前面且在外部聲明過

int i;
for(i=0;i<10;i++){
    ...
}
//循環體外面還可使用i
  • 能夠在各自獨立的不一樣for循環中定義同名變量

for(int i=0;i<10;i++){
    ...
}
...
for(int i=10;i<20;i++){
    ...
}

switch語句

switch(choice){
    case 1:
        ...
        break;
    ...
    default:
        ...
        break;
}

case標籤能夠是

  • 類型爲char,byte,shortint,以及它們包裝類的常量表達式

  • 枚舉常量

  • 字符串字面量(從java7開始),如

switch(inputString){
    case "yes":
        ...
        break;
    ...
}

大數值

若是基本的整數和浮點數精度不能知足要求,可使用java.math包中的BigInteger,BigDecimal.這兩個類能夠處理包含任意長度數字序列的數值。BigInteger實現了任意精度的整數運算,BigDecimal類實現了任意精度的浮點數運算。
使用靜態的valueOf方法能夠將普通的數值轉換爲大數值。

BigInteger a=BigInteger.valueOf(100);

大數值間的運算須要使用大數值類中的方法,而不能算術運算符。

數組

聲明數組int[] a;,實例化int[] a=new int[100];,這裏建立了一個能夠存儲100個整數的數組,裏面的全部元素都仍是初始化狀態(值爲0)。
對象數組的元素則初始化爲null,表示這些元素還沒存聽任何對象
一旦建立了數組,就不能再改變它的大小(儘管能夠改變每一個數組元素)
數組其餘初始化方式int[] a={1,2,...};int[] a=new int[]{1,2,...};

方法參數

  • 按值調用:方法接收的是調用者提供的值

  • 按引用調用:方法接收的是調用者提供的變量地址

java老是採用按值調用,也就是說,方法獲得的是全部參數值的一個拷貝,結果就是方法不能修改傳遞給它的任何參數變量。
可是方法參數有兩種類型
1.基本數據類型(int,boolean,...)
2.對象引用
對象引用做爲參數能夠經過調用對象裏的方法改變對象裏的類變量,可是這並不說明java的方法參數是對象引用

public class Employer {
    String name=null;
    Employer(String name){
        this.name=name;
    }
    static void swap(Employer a,Employer b){
        Employer temp=a;
        a=b;
        b=temp;
    }
    void print(){
        System.out.println(this.name);
    }
    public static void main(String[] args){
        Employer employer1=new Employer("aaa");
        Employer employer2=new Employer("bbb");
        swap(employer1,employer2);
        employer1.print();//aaa
        employer2.print();//bbb
    }
}

能夠看到,儘管swap方法將兩個Emplyer實例交換,但實際上交換的僅僅是兩個對象引用的拷貝.

對象構造

調用另外一個構造器

若是構造器的第一行語句形如this(...),這個構造器將調用同一類的另外一個構造器。

public class TestCons {
    String name;
    public TestCons(){
        this("default1");
        //this.name="default";
    }
    public TestCons(String name){
        this.name=name;
    }
    public static void main(String[] args){
        TestCons testCons=new TestCons();
        System.out.println(testCons.name);//default1
    }
}

初始化塊

在一個類的聲明中,能夠包含多個代碼塊,只要構造類的對象,這些塊就會被執行。
具體參見一道面試題引起的思考:(1),文章說的很詳細。

對象析構與finalize方法

java有自動的垃圾回收器,不須要人工回收內存,因此java不支持析構器。
finalize方法在垃圾回收器清除對象前調用。實際應用中,不要依賴於使用finalize方法回收任何短缺資源,由於很難知道這個方法何時調用。
若是某個資源須要在使用完畢後馬上被關閉,就須要由人來管理。對象使用完,能夠用close方法(若是有)完成相應的清理操做。

類的導入

只能使用(*)導入一個包,而不能使用import java.*或import java.*.*導入以java爲前綴的全部包。
大多數時候,只導入所需的包就能夠了。但發生命名衝突的時候,就須要變成具體的包名。例如
java.utiljava.sql包裏都有Date類

import java.util.*;
import java.sql.*;
...
Date today;//ERROR!--java.util.Date or java.sql.Date?
...

靜態導入

import static java.lang.System.*;
...
out.println("gwegwe");//不用加類名前綴
exit(0);

警告
編譯器在編譯源文件時,不檢查目錄結構。
package com.theviper;,即便源文件沒有在目錄com\theviper下,也能夠編譯。若是它不依賴於其餘包,就不會出現編譯錯誤。可是最終的程序將沒法運行,由於虛擬機找不到類文件

繼承

使用super調用構造器的語句必須是子類構造器的第一條語句。
若是子類構造器沒有顯式調用超類構造器,則將自動調用超類默認(沒有參數)的構造器。
若是子類沒有不帶參數的構造器,而且在子類構造器中沒有顯式調用超類的其餘構造器,則編譯器將報錯。
super關鍵字做用

  1. 調用超類方法

  2. 調用超類構造器

this關鍵字做用

  1. 引用隱式參數(如this.name=name)

  2. 調用該類的其餘構造器
    在覆蓋一個方法時,子類方法可見性不能低於超類方法

阻止繼承:final類和方法

目的:確保它們不會在子類中改變語義。
類變量也能夠被聲明爲final,可是構造對象後就不容許再改變類變量的值了

public class Parent {
    final String name="aaa";
    void setName(String name){
        this.name=name;
    }
    public static void main(String[] args){
        Parent parent=new Parent();
        parent.setName("bbb");//The final field Parent.name cannot be assigned
    }
}

可是若是將一個類聲明爲final,後面能夠改變類變量的值了

public final class Parent {
    String name="aaa";
    public static void main(String[] args){
        Parent parent=new Parent();
        parent.name="bbb";
        System.out.println(parent.name);//bbb
    }
}

抽象類

  • 類即便不含抽象方法,也能夠聲明爲抽象類

  • 抽象類不能被實例化,但能夠建立抽象類的具體子類對象

  • 能夠定義抽象類的對象變量,但只能引用非抽象子類的對象。

AbstractClass a=new AbstractConcrete();

訪問修飾符

  • private:僅對本類可見

  • public:對全部類可見

  • protected:對本包和全部子類可見

  • 默認(不須要修飾符):對本包可見

相關文章
相關標籤/搜索