java基礎——入門篇


1、認識java

  核心知識點:JVM、搭建Java開發環境、java的發展史、java特點、java程序類型、垃圾收集器、J2SE下載和安裝、環境變量的配置和測試、以及簡單的開發工具的使用等等;主要了解java的發展史、特點、JDK、JRE、java技術體系、以及工具的安裝與簡單使用;

1.1、初步了解計算機

1.1.1 硬件與軟件的區別?

   硬件
   1.cpu是一台計算機的運算核心和控制核心。其功能主要是解釋計算機指令以及處理計算機軟件中的數據。CPU由運算器、控制器、寄存器、高速緩存及實現它們之間聯系的數據、控制及狀態的總線構成。作為整個系統的核心,CPU 也是整個系統最高的執行單元,因此CPU已成為決定電腦性能的核心部件,很多用戶都以它為標准來判斷電腦的檔次。CPU的主頻,即CPU內核工作的時鍾頻率(CPU Clock Speed)。該時鍾速度越快,時間段內執行的指令就越多。
   2.內存是數據與CPU進行溝通的橋梁。計算機中所有程序的運行都是在內存中進行的,內存(Memory)也被稱為內存儲器,其作用是用於暫時存放CPU中的運算數據,以及與硬盤等外部存儲器交換的數據。
   3.存儲設備:內存不能長久保存數據(非ROM),斷電時信息就丟失,程序和數據都會被保存在存儲設備中(例如硬盤),當程序和數據需要使用時,再加載進內存,注意:內存讀取和寫入的速度要比存儲設備快的多。
   存儲設備主要有:磁盤驅動器,光盤驅動器(cd dvd)USB閃存(U盤)。


   軟件
   軟件的概述:按照一定順序組織的計算機數據與指令的集合。
   軟件 = 數據+指令+文檔
   1.系統軟件
   例如:Widows xp   、 Linux  、 Unix
   2.應用軟件
   例如:QQ、WPS、Photoshop、微軟的Office
   軟件開發:制作軟件。
   軟件的本質 :提高人與計算機交流效率,方便人與機器交互。

  1.1.2人機交互的方式

  1.圖形化界面:簡單直觀,容易操作,用戶的體驗好。
  2.dos命令交互方式:需要有一個控制台,輸入特定的指令,讓計算機完成一些操作。較為麻煩,需要記錄住一些命令,而且只能完成一些比較單一的功能。
  控制台打開的步驟:

    第一種方式:win—— 運行——cmd
    第一種方式:win鍵盤 + R


  常見的dos命令
    盤符: 進入指定的盤符下。
    dir : 列出當前目錄下的文件以及文件夾
    md : 創建目錄
    rd : 刪除目錄 注意:rd不能刪除非空的文件夾,而且只能用於刪除文件夾。
    cd : 進入指定目錄
    cd.. : 退回到上一級目錄
    cd \ : 退回到根目錄
    echo "hello java">a.txt 寫入文本到指定文件
    type a.txt 顯示文件內容命令
    del : 刪除文件 注意:不能刪除文件夾,只能刪除文件。
    exit : 推出dos命令行
    cls : 通知計算機將當前的命令清空
    *: 是通配符。
    tab 命令補全。
    方向鍵上下是找回上次你寫過的命令。

    或者

  小知識點

  / 和 \ 區別:Unix操作設計了這種路徑分割法,他是用斜杠 /,由於網絡是首先應用在Unix計算機之間的,至今為止,一半以上的網絡服務器一半使用的是unix操作系統,所以網址也沿用了斜杠作為分隔符
  微軟在開發DOS2.0時候,從unix中借鑒了這種目錄結構,但是由於dos中斜杠已經用來作為命令行參數的標志了(unix中的是 - ),所以只得使用反斜杠 \
  到了windows時代,很多時候已經沒有命令行參數的干擾,加上網絡使用的擴展,現在斜杠和反斜杠大多數時候都可以互換,沒有什么影響。
  cls:清除屏幕
  exit:退出cmd

1.2 java簡介

  語言起源
  Java是SUN ( Stanford University Network 斯坦福大學網絡公司 ) 1995年推出的一門高級編程語言。 Java名稱的來源Java最初被命名為Oak,目標在於家用電器等小型系統的編程語言,隨着市場的變化,SUN着眼於網絡應用的開發。Java的名字的來源:Java是印度尼西亞爪哇島的英文名稱,因盛產咖啡而聞名。 創始人James Gosling被業界稱之為java之父;
  1995年5月23日,JAVA語言誕生 雛形
  1996年,1997分別推出JDK1.0,JDK1.1版 1999年,JAVA被分成J2SE,J2EE,J2ME
  2000年,JDK1.4發布 2004年9月30日18:00PM,J2SE1.5發布,成為Java語言發展史上的又一里程碑。為了表示該版本的重要性,J2SE1.5更名為Java SE 5.0 2005年,JAVA版本正式更名為JAVAEE,JAVASE, JAVAME 2006年12月,SUN公司發布JRE6.0
      2009年04月20日,Oracle以74億美元收購Sun。取得java的版權。
   2010年9月,JDK7.0已經發布,增加了簡單閉包功能。
   2011年7月,甲骨文公司發布java7的正式版。

1.3 java語言重要特性之跨平台

  什么是跨平台(計算機系統),跨平台概念是軟件開發中一個重要的概念,即不依賴於操作系統,也不信賴硬件環境。一個操作系統下開發的應用,放到另一個操作系統下依然可以運行。
  Java的跨平台是相對於其他編程語言而言的,通過Java語言編寫的應用程序在不同的系統平台上都可以運行。一般的高級語言如果要在不同的平台上運行,至少需要編譯成不同的目標代碼。在windows編譯的c語言程序,在linux下是不能運行的。當然在linux下編譯的c語言程序在windows下也是不能運行的。而Java語言在不同平台上運行時不需要重新編譯。
  Java跨平台的原理:Java的跨平台是通過Java虛擬機(JVM)來實現的。

 


1.4Java虛擬機(JVM)

  Java Virtual Machine 一個軟件模擬的計算機。Java源程序想象成我們的C源程序,Java源程序編譯后生成的字節碼(.class)就相當於C源程序編譯后的二進制可執行文件。JVM虛擬機相當於計算機系統(操作系統+硬件環境),Java解釋器相當於CPU。
  .exe文件直接在windows操作系統下運行,在CPU上運行的是機器碼(.exe文件)
  .class字節碼文件是運行在JVM虛擬機下的,在Java解釋器上運行的是Java字節碼。
  Java解釋器相當於運行Java字節碼的“CPU”,但該“CPU”不是通過硬件實現的,而是用軟件實現的。Java解釋器實際上就是特定的平台下的一 個應用程序。只要實現了特定平台下的解釋器程序,Java字節碼就能通過解釋器程序在該平台下運行,這是Java跨平台的根本。當前,並不是在所有的平台 下都有相應Java解釋器程序,這也是Java並不能在所有的平台下都能運行的原因,它只能在已實現了Java解釋器程序的平台下運行。

1.5 Java是什么???

  是一門面向網絡的高級程序設計語言,程序員可以用它創建應用程序,這些應用程序通過網絡下載后運行,相對於本地是安全的。如果將Java和網絡融合在一起,則會組成一個網絡計算機環境;

  Java的三大平台
     Java SE(Java Platform,Standard Edition)。Java SE 以前稱為J2SE。它允許開發和部署在桌面、服務器、嵌入式環境和實時環境中使用的Java 應用程序。Java SE 包含了支持Java Web 服務開發的類,並為Java Platform,Enterprise Edition(Java EE)提供基礎。
例子:類似QQ、掃雷、飛秋、凌波這樣子的桌面應用。
Java EE
     Java EE(Java Platform,Enterprise Edition)。這個版本以前稱為J2EE。企業版本幫助開發和部署可移植、健壯、可伸縮且安全的服務器端 Java 應用程序。Java EE 是在Java SE 的基礎上構建的,它提供Web 服務、組件模型、管理和通信API,可以用來實現企業級的面向服務體系結構(service-oriented architecture,SOA)和Web 2.0 應用程序。
Java ME
       Java ME(Java Platform,Micro Edition)。這個版本以前稱為J2ME,也叫K-JAVA。Java ME 為在移動設備和嵌入式設備(比如手機、PDA、電視機頂盒和打印機)上運行的應用程序提供一個健壯且靈活的環境。Java ME 包括靈活的用戶界面、健壯的安全模型、許多內置的網絡協議以及對可以動態下載的連網和離線應用程序的豐富支持。基於Java ME 規范的應用程序只需編寫一次,就可以用於許多設備,而且可以利用每個設備的本機功能。

1.6 環境的搭建

  JDK簡介:
    JDK(Java Development Kit)是Sun Microsystems針對Java開發員的產品。自從Java推出以來,JDK已經成為使用最廣泛的Java SDK。JDK 是整個Java的核心,包括了Java運行環境、Java工具和Java基礎類庫。JDK是學好Java的第一步。從SUN的JDK5.0開始,提供了泛型等非常實用的功能,其版本也不斷更新,運行效率得到了非常大的提高。
  JDK的安裝網址:(http://www.oracle.com
  JDK目錄介紹
    1. bin目錄:存放Java的編譯器、解釋器等工具(可執行文件)。
    2. db目錄:JDK7附帶的一個輕量級的數據庫,名字叫做Derby。
    3. include目錄:存放的調用系統資源的接口文件。
    4. jre目錄:存放Java運行環境文件。
    5. lib目錄:存放Java的類庫文件。
    6. src.zip文件:JDK提供的類的源代碼。
  安裝JDK需要注意的事項:
    1. 安裝路徑中不要包含中文。
    2. 安裝路徑中不要包含空格。
  jdk
    Jdk(java development kit) java 開發工具包,Jre只是運行java程序,那么我們要做開發,就需要相關的開發工具。
    Jdk提供給java開發人員使用的,我們使用jdk開發程序,開發完成后交給jre去運行
  注意:實際上,jdk也包含了jre
  Jdk = 開發工具包 +jre(jvm+核心類庫)
  結論:所以安裝完idk后我們就不用再安裝jre
  jre
    Jre全英文名是: java runtime Environment java運行環境
    Jvm全英文名是:java Virtual Machine java虛擬機,它是java的核心,但是要運行一個java程序,核心有可能不夠,它還需要一些相關的輔助工具,這個輔助工具我們把他們叫做核心類庫。這里存放的是程序所需要的最笨的的和核心的內容。
    所以jvm和核心類庫就組成了jre
    Jre = jvm +核心類庫
    現在有了jre,我們就可以在計算機上運行java程序了,但是我們學習java不是要運行,我們是要做開發;
  總結:jre只是負責運行java程序

1.7配置path環境變量

  問題:目前在控制台窗口下只能在jdk安裝目錄的bin目錄下才能使用jdk的開發工具在控,如果想制台窗口下想要在任意目錄下都可以使用javac與java或者jdk其他的開發工具那應該怎么做呢?
  1.在dos窗口敲上javac

 

  我們在隨意的一個目錄敲javac或者java命令時候,發現dos窗口顯示這個不是內部命令,然后我們在上面敲上notepad命令時,打開了一個記事本的程序,但是在當前目錄下頁沒有存在notepad.exe的可執行文件,那么為什么能啟動呢?

  錯誤原因:原來在dos窗口上寫上一個命令時候,如果在當前目錄下找不到指定的可執行文件,那么它會根據path環境變量保存的路徑去搜索是否存在這個可執行文件,如果存在則啟動該程序,否則就沒有這個命令。

  2.解決方法:

    1、進入jdk的安裝目錄的bin目錄。

    2、在dos命令上敲javac。(如果出現了以上的圖信息則配置成功)

  3.為什么要配置path環境變量

因為在jdk下bin文件夾中有很多我們在開發中要使用的工具,如java.exe,javac.exe,jar.ex等,那么我們在使用時,想要在電腦的任意位置下使用這些java開發工具,那么我們就需有把這些工具所在的路徑配置到系統的環境變量中,當我們使用時,系統可以幫且我們找到這些命令。

  4.如何配置path環境變量
    打開環境變量

      配置java_home

      配置PATH

      配置classpath

      測試是否安裝成功:-version

 

1.8程序入門:hello Word

  Hello Word程序入門

    1.打開一個記事本在記事本里面寫上class  類名{}

    2.一個類缺少主函數不能獨立運行。

    3.可以獨立運行了,但是沒有效果。輸出語句。

  HelloWord 例子剖析:

class java關鍵字,用於什么一個類、

{} : 花括號表示范圍。

main : 是主函數的如果(固定寫法)。

1.9 了解塊(感興趣的自己可查閱相關知識點

  Java 9 的新特征:模塊化、支持HTTP2.0、改進的javadoc、接口的私有方法、集合工廠方法、代碼分段緩存、貨幣API、簡化進程API;

  Java程序類型:Java應用程序、Applet小程序、Servlet程序

  Java技術體系:Java編程語言、Java類文件、Java API、JVM

  Java JVM的生命周期:簡單可以理解為2個線程,一個守護:負責垃圾處理;一個普通(一普通為核心),對程序繼續開始和結束;

  垃圾收集器:避免內存泄露,相對於監視Java程序的運行

 2、Java語言基礎

 2.1、開發工具

  前期主要以簡單的Eclipse為主,Eclipse 是一個開放源代碼的、基於Java的可擴展開發平台。就其本身而言,它只是一個框架和一組服務,用於通過插件組件構建開發環境。幸運的是,Eclipse 附帶了一個標准的插件集,包括Java開發工具(Java Development Kit,JDK)。

2.1.1插件安裝方法

  Eclipse插件的安裝方法介紹以下2種

  第一種:直接復制法

  假設Eclipse的安裝目錄在C:\eclipse,解壓下載的eclipse 插件或者安裝eclipse 插件到指定目錄AA(如:c:\AA)文件夾,打開AA 文件夾,在AA文件夾里分別包含兩個文件夾features和plugins ,然后把兩個文件夾里的文件分別復制到C:\eclipse下所對應的文件夾下的features 和plugins 下,一般的把插件文件直接復制到eclipse目錄里是最直接也是最愚蠢的一種方法!因為日后想要刪除這些插件會非常的困難,不推薦使用。

  注意:直接將插件包解壓到plugins文件夾下之后,重啟eclipse,可能不會加載新的插件。

  解決方法是:

    1、打開命令行,到當前eclipse的目錄下,輸入eclipse -clean,重新啟動eclipse,這樣eclipse就會加上新的插件了。

    2、如果插件不能生效,則請將eclipse\configuration\org.eclipse.update目錄刪除后再啟動eclipse;

       你可以在eclipse的菜單"Help"-->"About Eclipse SDK"-->"Feature Details" 和"Plug-in Details"中看到新安裝的插件。

  第二種:使用link文件法

    a.假設Eclipse的安裝目錄在C:\eclipse,在該文件夾下,新建這樣的目錄結構C:\eclipse\PluginsEclipse\jode\eclipse;

    b.解壓下載的eclipse 插件或者安裝eclipse 插件到指定目錄BB(如:C:\BB)文件夾,打開BB文件夾,然后把 BB文件夾里的兩個文件夾features和plugins復制到剛剛新建好C:\eclipse\PluginsEclipse\jode\eclipse,這樣eclipse中就有了兩個插件目錄features and plugins下。

    c.在C:\eclipse目錄中新建links(C:\eclipse\links)目錄,在links目錄中建立一個以link為擴展名的文本文件如jode.link,內容如下path=C:/eclipse/PluginsEclipse/jode 或者path=C:\\eclipse\\PluginsEclipse\\jode(插件的目錄),保存后重啟eclipse插件就會安裝完成。

2.1.2 具體使用

  第一步:首先,電腦要安裝配置好eclipse的環境,這個步驟就不在這贅述了。打開eclipse軟件。

  第二步:點擊file--new--java project,即新建java項目

  第三步:為這個項目命名,點擊finish,在左邊的面板上就出現了test的項目

  第四步:展開test項目,對着里面的src點擊右鍵--new--class,即新建一個類

  第五步:為類命名,注意,首字母必須是大寫,點擊finish,這時候,就可以在主窗體編寫代碼了;

 2.1.3 快捷鍵

  1)單詞聯想 Alt + /
  2)刪除一行  Ctr + d
  3)向上復制一行 Ctrl + Alt + 向上鍵
  3)向下復制一行 Ctrl + Alt + 向下鍵
  4)向下移動一行 Alt + 向下鍵
  5)向下移動一行 Alt + 向上鍵
  6)換行    shift + Enter 的的的的
  7)美觀代碼 Ctrl + shift + F (該輸入法跟所有的中文輸入工具沖突)
  8)解決小紅叉錯誤 Ctrl + 1
  9)將字母轉換成小寫 Ctrl + shift + y
  10)將字母轉換成大寫 Ctrl + shift + x
  11)想要打印某個變量連續按Alt + / 兩次
  12)添加單行注釋: Ctrl + / 想要取消,再一次Ctrl + /
  13)添加多行注釋 Ctrl + shift + / 取消多行注釋 Ctrl + shift + \

2、Java語言基礎

  Java基礎主要的核心就是從學會Java規則到簡單的運用;

2.1標識符

  就是程序員在定義java程序時,自定義的一些名字,例如helloworld 程序里關鍵字class 后跟的Demo,就是我們定義的類名。類名就屬於標識符的一種。

標識符除了應用在類名上,還可以用在變量、函數名、包名上。

  2.1.1標識符必須遵循以下規則

    1.標識符由26個英文字符大小寫(a~zA~Z)、數字(0~9)、下划線(_)和美元符號($)組成。

    2.不能以數字開頭,不能是關鍵字

    3.嚴格區分大小寫

    4.標識符的可以為任意長度

     標識符的例子,合法的標識符

      ComputeArea,radius,area $itcast   _itcast  gz_itcast

    注意:由於Java嚴格區分大小寫,ITCAST 和itcast是完全不同的標識符

    非法標識符

      1.class (關鍵字)

      2.100java(不能以數字開頭)

      3.Hello java (空格不是組成標識符的元素)

  2.1.2Java中的標識符命名規范

    1.包名

      多個單詞組成時所有字母小寫(例:package  com.itcast) 

    2.類名和接口

      多個單詞組成時所有單詞的首字母大寫(例:HelloWorld)

    3.變量名和函數名

      多個單詞組成時第一個單詞首字母小寫,其他單詞首字母大寫(例:lastAccessTime、getTime)。

    4.常量名

      多個單詞組成時,字母全部大寫,多個單詞之間使用_分隔(例:INTEGER_CACHE)

    注意:只是為了增加規范性、可讀性而做的一種約定,標識符在定義的時候最好見名知意,提高代碼閱讀性。

 

我們在隨意的一個目錄敲javac或者java命令時候,發現dos窗口顯示這個不是內部命令,然后我們在上面敲上notepad命令時,打開了一個記事本的程序,但是在當前目錄下頁沒有存在notepad.exe的可執行文件,那么為什么能啟動呢?

錯誤原因:原來在dos窗口上寫上一個命令時候,如果在當前目錄下找不到指定的可執行文件,那么它會根據path環境變量保存的路徑去搜索是否存在這個可執行文件,如果存在則啟動該程序,否則就沒有這個命令。

2.解決方法:

1、  進入jdk的安裝目錄的bin目錄。

2、  dos命令上敲javac(如果出現了以上的圖信息則配置成功。 

2.2Java中的關鍵字

(看看就好,用戶碰見多了,自然就記住了)
其中:

        byte short int long float double char boolean String …
        用於定義數據類型

 


        true false
        判斷真假

 

        If else switch case default while do for break continue return
        用於定義流程控制的關鍵字

 

2.3 注釋

  單行注釋
    單行注釋的表現很簡單,只需要在開頭添加兩個斜線就可以了.
    用法: // 后面寫書的內容就是注釋
    注意: 單行注釋里可以有單行注釋
  多行注釋
    有開發和結束的注釋,中間的部分全部都是被注釋的內容
    用法: /*
        注釋內容
        */
    注意:單行和多行注釋,很多的語言都是支持的,而接下來文檔注釋是java特有的多行注釋中,不能有多行注釋
  文檔注釋
    文檔注釋稍微特殊,在文檔注釋里面可以寫程序的作者,程序的版本,同時在文檔注釋里面可以有注釋的文字信息
    用法:
      /**
      @author 作者
      @version 版本
      其他的注釋內容
      */
  說明:前面加個@符號,這個單詞是可以被解析的;

  :文檔注釋用/** */表示,是java特有的注釋,其中注釋內容可以被JDK提供的工具 javadoc 所解析,生成一套以網頁文件形式體現的該程序的說明文檔。

 1 public static void main(String[] args) {
 2             // 第一步: 獲取半徑?並將半徑保存在程序中
 3             double radius = 5;
 4             // 第二步:計算面積,並將面積保存在程序中
 5             /*
 6             double area = radius * radius * 3.1415;
 7             // 第三步:在控制台現實面積
 8             System.out.println("半徑為" + radius + "的圓的面積為:" + area);
 9             */
10             
11         }

  注釋的使用細節:
    三種注釋可以出現在程序的任何地方,但是不推薦找任意位置。
    1. 編程習慣:
    1. 給那條語句進行說明,注釋應該寫在該語句的旁邊。
    2. 單行注釋一般寫在語句的后面多行注釋和文檔注釋一般寫在語句的上面
  注意:文檔注釋只能出現在類、屬性、方法的上面。

2.4 數據類型

2.4.1 常量的概述

  常量是指在程序運行過程中其值不能改變的量。

2.4.2常量類型

  Java中常量的分類:
  整數常量 : 所有整數
  小數常量 : 所有小數
  布爾常量 : 只有true和false
  字符常量 :使用’’引起來的單個字符
  字符串常量 :使用“”引起來的字符序列,“” 、“a” 、” ”
  null常量 : 只有一個值null

2.4.3 char 類型

  char類型表示的是單個字符類型,任何數據使用單引號括起來的都是表示字符。字符只能有一個字符,比如:普通的老百姓穿上軍裝就是軍人。
  注意:特殊字符的轉義序列:轉義字符
  轉義字符的概述:
  特殊字符使用”\”把其轉化成字符的本身輸出,那么使用”\”的字符稱作為轉移字符。
  需求:使用輸出語句,打印出帶引號的信息例如輸出。
  System.out.println("teacher said"java is fun"");編譯是無法正常通過的。語法有錯誤,編譯器讀到第二個引號就認為是字符串的結束,剩余的不知道怎么處理。如何解決這個問題:java中使用轉義字符來表示特殊的字符。一個轉義字符以反斜杠(\)開始。
  問題:想要打印帶引號的字符串怎么辦,就可以使用反斜杠(\)后跟字符,這個反斜杠就是轉義字符。
  轉義  字符       名稱       Unicode
  \b   Backspace      (退格鍵)      \u0008
  \t   Tab           (Tab鍵盤)      \u0009
    \n Linefeed       (換行)          \u000A
  \r Carriage Return   (回車)        \u000D
  \\ Backslash          (反斜杠)         \u005C
  \' Single Quote      (單引號)      \u0027
  \" Double Quote    (雙引號)      \u0022

  其中

    \r 表示接受鍵盤輸入,相當於按下回車。
    \n 表示換行。
    \t 制表符,相當於Table鍵
    \b 退格鍵,相當於Back Space
    \’ 單引號
    \’’ 雙引號
    \\ 表示一個斜跨
  上述問問題解決:System.out.println("teacher said\"java is fun\"");
  注意:換行符就是另起一行,回車符就是回到一行的開頭,所以我們平時編寫文件的回車符應該確切來說叫做回車換行符

2.4.4. boolean 類型

  boolean由數學家Geogore Boole 發明
  boolean 類型用來存儲布爾值,在java中布爾值只有2個,true和false。
  boolean flag=true;
  flag=false;

2.4.5常見的數據類型

  為什么有數據類型?
    Java語言是一個強類型語言,對於每一種數據都定義了明確的絕體數據類型,在內存中分配了不同大小的內存空間。

  Java中數據類型分類
    Java中數據共計划分為2大類型
      2-1 引用數據類型 如:數組、類、接口等等’
      2-2 基本數據類型:
  對基本的數據進行類型划分:

  整數:由於整數有非常大的數據,也有非常小的數據,於是把證書類型又區分成4中
  byte   short   int    long
  4個類型的區別:
    Byte開發的空間占用內存1個字節。范圍 -128 ~ 127
    Short開辟的空間占內存2個字節
    Int開辟空間占內存4個字節
    Long開辟空間占內存8個字節 long x =123456789031L;

  小數:
    float(單精度)
    double(雙精度)
    float 開辟的空間是4個字節 int
    double 開辟的空間是8個字節 long
  字符:
    Char 占兩個字節

  布爾:
    boolean true:真 0 false:假 1
    boolean占一個字節

2.5 進制的轉換

  進制:進制是一種記數方式 ,可以用有限的數字符號代表所有的數值。由特定的數值組成。
  整型的表現形式
    1. 十進制: 都是以0-9這九個數字組成,不能以0開頭。
    2. 二進制: 由0和1兩個數字組成。
    3. 八進制: 由0-7數字組成,為了區分與其他進制的數字區別,開頭都是以0開始。
    4. 十六進制:由0-9和A-F組成。為了區分於其他數字的區別,開頭都是以ox開始。
  進制的由來
    幾乎每個民族最早都使用都十進制計數法,這是因為人類計數時自然而然地首先使用的是十個手指。 但是這不等於說只有十進制計數法一種計數方法。例如,世界各國在計算年月日時不約而同地使用“十二進制”12個月為一年又如:我國過去16兩才算為一斤,這就是“十六進計數法”,一個星期七天,這個就是”七進制計算法”。 計算機是由邏輯電路組成,邏輯電路通常只有兩個狀態,開關的接通與斷開,這兩種狀態正好可以用“1”和“0”表示。

  例如:十進制轉二進制的轉換原理:除以2,反向取余數,直到商為0終止。(其他的自行擴展)

2.6 Java數據類型的轉換

  Java中可以進行不同數據類型的加減乘除運算嗎?是可以的。在算術運算符中已經體驗過如果兩個整數(int)相除會去掉小數部分。如果需要保留小數部分,可以讓除數或者被除數變為double類型的(5變為5.0)。其實Java是自動的將int的那個數變為了double類型了也就是Java自動的將整數變為了浮點數。例如5/2.0 其實是5.0/2.0;

2.6.1、 自動類型轉換(也叫隱式類型轉換)

  可以將一個數賦值給更大數值范圍的變量,例如可以經byte 變量賦值給short變量可以將short變量賦值給int變量可以將int變量賦值給long變量。
Java內部其實做了工作就是自動將數值進行了類型提升,就叫做自動類型轉換(也叫隱式類型轉換)

1 byte b = 1; //00000001
2 short s = b; //00000000 00000001
3 int i = s;
4 long lon = i;
5 double d = lon; //1.0

  要實現自動類型的轉換,需要滿足兩個條件,第一兩種類型彼此兼容,第二目標類型取
值范圍必須大於源類型。所有的數字類型,包括整形和浮點型彼此都可以進行轉換。

  例如:

1 byte b=100;
2 int x=b;
3 System.out.println(x);//程序把b結果自動轉換為int類型。

 

2.6.2、 強制類型轉換(也叫顯式類型轉換)

  不可以將一個數值賦給范圍更小數值范圍的變量,除非進行類型轉換。

1 byte b = 100;
2 b = b + 2;
3 System.out.println(b);

  上述例子發生了什么,發生了類型轉換。
    b+2 遇到了加法運算,2默認是int類型,byte類型b變量存儲的值自動類型提升為了int類型。執行完加法運算后的結果就是int類型,想要將int的類型值放入到byte類型變量b中,無法放入,編譯報錯。

1 byte b=1;
2 b=(byte)(b+2);

  當兩種類型彼此不兼容,或者目標類型取值范圍小於源類型(目標是byte源是int)無法自動轉換,此時就需要進行強制類型轉換。

  強制類型轉換需要注意:
    損失精度!!!

1 int a=128;
2 byte b=(byte)a;
3 System.out.println(b);//-128
4 /*
5 * 此時的強轉已經造成了數值的不准確
6 */

  再次分析代碼

1 byte b = 100;
2 b = b + 2; 
3 System.out.println(b);

  編譯:提示如下錯誤。

      

  什么時候要用強制類型轉換???
    比如小數部分只想保留整數部分.
    一定要清楚要轉換的數據在轉換后數據的范圍內否則會損失精度.

  表達式的數據類型自動提升
    算術表達式,邏輯表達式
    所有的byte型、short型和char的值將被提升到int型。
    如果一個操作數是long型,計算結果就是long型;
    如果一個操作數是float型,計算結果就是float型;
    如果一個操作數是double型,計算結果就是double型。
  分析 System.out.println(‘a’+1)結果?
  自動類型提升

1 byte b = 3;
2 int x = 4;
3 x = x + b;// b會自動提升為int 類型參與運算。
4 System.out.println(x);// 7

  強制類型轉換

1                 byte b = 2;
2         /*
3          * 強制類型轉換,強制將b+2強制轉換為byte類型,再賦值給b
4          */
5         b = (byte) (b + 2); 
6         System.out.println(b);// 4
7         

  小結如下:

  思考1

    byte  b=126;

  問:既然數據默認的有數據類型,那么126 默認是int類型的,為什么存儲到byte類型時不會報錯呢。

  126 是常量java在編譯時期會檢查該常量(每個常量)是否超出byte類型的范圍。如果沒有可以賦值。

  思考2:byte b=128;能否正常的編譯和運行。

    該語句會出現編譯錯誤,128超出了byte變量的存儲范圍,所以出現編譯錯誤。

  思考3

1 byte b1=3,b2=4,b;
2 
3 b=b1+b2;
4 
5 b=3+4;

  哪一句編譯失敗?為什么?

    b =3+4, 3和4都是常量,所以java在編譯時期會檢查該常量(每個常量)是否超出byte類型的范圍。如果沒有可以賦值。例如b=128+1 就無法編譯通過。b=127+1;也是無法通過。

    b =b1+b2 不可以,因為b1 和b2 是變量,表達式求值時,變量值會自動提升為int型,表達式結果也就成了int型,這是要賦值給byte型的b,必須進行強制類型轉換了。

  System.out.println(‘a’+1)結果

  為了讓計算機識別他們生活中的文字,讓二進制表示生活中的文字.所以一個字母代表了一個二進制.,二進制也有十進制的表現形式.,把生活中的字母都用數字來標識,例如97 代表a ,98 代表 b。打印’a’就把a作為輸出顯示,沒有疑問。但是 ‘a’+1  有加號涉及到了運算。根據java自動類型提升規則,同樣道理 char 提升為int 。就把’a’代表的數字體現了出來。a 表示的是97  97+1就是98; 那么 想要查看98 表示的char 是什么 怎么實現呢 ?就要用到剛才介紹的強制類型轉換了 System.out.println(char(‘a’+1));就取到了98 在ASCII碼表中表示的字符。大寫A 和小寫a 在 ASCII有不同的表現。還有一個概念字符’1’ 在ASCII中 不是數字 1,可以運行代碼查看,到此就可以明白了char 類型,char類型也是可以參與運算的,為什么可以參與運算呢。因為字符在ASCII表中都有對應的數字體現。所有的計算機兼容ASCII。

1 System.out.println('a'+1); //98
2 System.out.println((char)('a'+1));  //b

  即:所有數值運算符都可以用在char型數據上,如果另一個操作數是一個數字或者字符,那么char會自動提升為int型,如果另一個操作數是字符串,那么字符就會和字符串相連。

2.7 運算符

2.7.1 算術運算符

  正負號

除法

取模:求余數

取模的正負取決與被除數

(++)前自增:先自增完畢,再運算整個表達式,語句分號前面的都是運算表達式;

后自增,先運算完整個表達式(分號前面的都是表達式),再進行自增;

  小結:如果運算符在變量的前面,則該變量自增1或者自減1,然后返回的是變量的新值,如

果運算符在變量的后面,則變量也會自增或者自減1,但是返回的是變量原來的值。++在前就是先運算,再取值,++在后就是先取值,再運算。

2.7.2 賦值運算符

  a+=b 可以想象成 a=a+b;

  變量聲明完了之后,可以使用賦值語句(assignment statement)給變量賦一個值,Java中使用等號(=)作為基本的賦值運算符(assignment operator);格式如下:

    variable = expression;

    變量       =     表達式;

2.7.3 比較運算符

 

  注意的細節:

        使用比較運算符的時候,要求兩種數據類型必須一致。

2.7.4 邏輯運算符

  什么是邏輯運算符?連接比較運算符的符號稱之為邏輯運算符。邏輯運算符用於對boolean型結果的表達式進行運算,運算的結果都是boolean型。我們的比較運算符只能進行一次判斷,對於對此判斷無能為力,那么邏輯運算符就可以經將較運算符連接起來;

邏輯運算符

  邏輯運算符用於連接布爾型表達式,在Java中不可以寫成3<x<6,應該寫成x>3 & x<6 。

  “&”和“&&”的區別:單與時,左邊無論真假,右邊都進行運算;雙與時,如果左邊為真,右邊參與運算,如果左邊為假,那么右邊不參與運算。

  “|”和“||”的區別同理,雙或時,左邊為真右邊不參與運算。

  “ ^ ”異或與“|”或的不同之處是:當左右都為true時,結果為false。

  & 與   | 或   ^ 異或 ! 非

2.7.5 位運算符

  按位操作符用來操作整數基本數據類型中的單個比特(bit),就是二進制,按位操作符會對兩個參數中對應的位(bit)執行布爾運算,最終生成一個結果。按位操作符來源於C語言面向底層的操作,Java設計的初衷是嵌入式電視機機頂盒,所以面向底層的操作也保留了下來。

  任何信息在計算機中都是以二進制的形式保存的,”&”、“|”、“^”除了可以作為邏輯運算符也可以作為位運算符。位運算是直接對二進制進行運算。他們對兩個操作數中的每一個二進制位都進行運算。例如int是由32個二進制數組成,因此使用位運算符可以對整數值的二進制數進行運算。

位(bit)運算符:

位運算符

 

運算符含義

 

&

與(AND)

|

或(OR)

^

異或

~

取反

  規則:

  可以把1當做true 0當做false

  只有參與運算的兩位都為1,&運算的結果才為1,否則就為0。

  只有參加運算的兩位都是0,| 運算的結果才是0,否則都是1。

  只有參加運算的兩位不同,^ 運算的結果才為1,否則就為0。

2.7.6 移位操作符

  << 左移

  >> 右移

  >>> 無符號右移

位運算符

運算符

運算

范例

<< 

左移

3 << 2 = 12 --> 3*2*2=12

>> 

右移

3 >> 1 = 1  --> 3/2=1

>>> 

無符號右移

3 >>> 1 = 1 --> 3/2=1

&

與運算

6 & 3 = 2

|

或運算

6 | 3 = 7

^

異或運算

6 ^ 3 = 5

~

反碼

~6 = -7

 

位運算符的細節

<< 

空位補0,被移除的高位丟棄,空缺位補0。

>> 

被移位的二進制最高位是0,右移后,空缺位補0;

最高位是1,空缺位補1。

>>> 

被移位二進制最高位無論是0或者是1,空缺位都用0補。

&

二進制位進行&運算,只有1&1時結果是1,否則是0;

|

二進制位進行 | 運算,只有0 | 0時結果是0,否則是1;

^

任何相同二進制位進行 ^ 運算,結果是0;1^1=0 , 0^0=0

 

不相同二進制位 ^ 運算結果是1。1^0=1 , 0^1=1

2.7.7 三元運算符

  格式

    (條件表達式)?表達式1:表達式2;

    如果條件為true,運算后的結果是表達式1;

    如果條件為false,運算后的結果是表達式2;

2.7.8 運算符的優先級與結合性

理解例子

 

 

2.7.9 案例(部分輔助理解)

  案例:類型簡單例子

 1 public static void main(String[] args) {
 2         //定義兩個變量(語法:數據類型   變量名  = 常量值;)
 3         int a = 3;
 4         int b = 4;
 5         
 6         System.out.println(a + b);
 7         System.out.println(a - b);
 8         System.out.println(a * b);
 9         System.out.println(a / b);    //整數和證書相除,我們只要整數部分(取商)
10         
11         System.out.println(a % b);  //取模實際上就是取余數
12         
13         System.out.println(4223 / 1000 * 1000);    //整數和整數加減乘除的結果只要整數
14         //當算術運算兩側的類型不一致的時候,結果向大的類型保持。
15         System.out.println(4223 / 1000.0 * 1000);    
16     }

 

  自增自減運算符案例

 1      //
 2                 int i = 10; 
 3         int newNum = 10 * i++;
 4         System.out.println(newNum);//?
 5      //
 6                 int i = 10; 
 7         int newNum = 10 * ++i;//?
 8         System.out.println(newNum); //?
 9      //一可以理解為
10                 int i = 10;
11         int newNum = 10 * i;
12         i = i + 1;
13     //二可以理解為
14                 int i = 10;
15         i = i + 1;
16         int newNum = 10 * i;
17            

  案例

 1 public static void main(String[] args) {
 2         // 判斷一個整數一奇數還是偶數
 3         int x = -100;
 4         // 奇數是,1,3,5...偶數是2,4,6...顯然整數除2能整除,也就%(取模)結果為0就是偶數。        int result = x % 2;
 5         System.out.println(result);
 6         // 使用判斷語句進行判斷。
 7         if (result == 0) {
 8             System.out.println(x + "是偶數");
 9         } else {
10             System.out.println(x + "是奇數");
11         }
12     }

  案例

 1 public static void main(String[] args) {
 2         // 判斷一個整數一奇數還是偶數
 3         int x = 1;
 4         // 奇數是,1,3,5...偶數是2,4,6...顯然奇數%的結果為1.
 5         int result = x % 2;
 6         System.out.println(result);
 7         // 使用判斷語句進行判斷。
 8         if (result == 1) {
 9             System.out.println(x + "是奇數");
10         } else {
11             System.out.println(x + "是偶數");
12         }
13     }

  改進

 1 public static void main(String[] args) {
 2         // 判斷一個整數一奇數還是偶數
 3         int x = -1;
 4         // 奇數是,1,3,5...偶數是2,4,6...顯然奇數%的結果為1.
 5         int result = x % 2;
 6         System.out.println(result);
 7         // 使用判斷語句進行判斷。
 8         if (result != 0) {
 9             System.out.println(x + "是奇數");
10         } else {
11             System.out.println(x + "是偶數");
12         }
13     }

  案例:判斷星期

 1 public static void main(String[] args) {
 2         // 設定今天是星期1,用int 1表示星期一,0表示星期天
 3         int today = 1;
 4         // 十天后是星期幾?,一個星期是7天,7天之后又是星期1,可以用?
 5         int future = (today+10) % 7;
 6         if (future == 0) {
 7             System.out.println("10天后是星期天");
 8         } else {
 9             System.out.println("10天后是星期:" + future);
10         }
11 
12     }

  案例:運算符

1 public static void main(String[] args) {
2         int x = 1; // 聲明int變量x, 賦值1給變量x
3         int y = 0; // 聲明int變量y, 賦值0給變量y
4         double area; // 聲明double變量area
5         double radius = 1.0; // 聲明double變量radius,並賦值1.0給變量radius
6         x = 5 * (3 / 2) + 3 * 2; // 將=右半部分表達式的計算結果賦值給變量x
7         x = y + 1; // 將變量y和1的求和的值賦值給變量x
8         area = radius * radius * 3.14159; // 將計算面積的值賦值給變量area
9     }

  賦值小問題:

  問題1:

1 int x;
2 Syst2intln(x = 1);

  如何理解?

    答:等價於

1 x=1;
2 System.out.println(x);
3 //注意:不能 1=x,變量名必須在賦值運算符的左邊。

  案例:位運算符

& 與運算

00000000

00000000

00000000

00000110

6

00000000

00000000

00000000

00000011

3

00000000

00000000

00000000

00000010

&  =2

| 或運算

00000000

00000000

00000000

00000110

6

00000000

00000000

00000000

00000011

3

00000000

00000000

00000000

00000111

|  =7

 

 

 

 

 

^ 異或運算

00000000

00000000

00000000

00000110

6

00000000

00000000

00000000

00000011

3

00000000

00000000

00000000

00000101

^  =5

~ 反碼

0000-0000

0000-0000

0000-0000

0000-0110

6

1111-1111

1111-1111

1111-1111

1111-1001

取反 -7

負數表示

0000-0000

0000-0000

0000-0000

0000-0110

6

1111-1111

1111-1111

1111-1111

1111-1001

取反

1111-1111

1111-1111

1111-1111

1111-1010

加1

異或特點

0000-0000

0000-0000

0000-0000

0000-0110

6

0000-0000

0000-0000

0000-0000

0000-0011

^3

0000-0000

0000-0000

0000-0000

0000-0101

 

0000-0000

0000-0000

0000-0000

0000-0011

^3

0000-0000

0000-0000

0000-0000

0000-0110

結果是6

   案例:位運算

左移 (算術移位)3<< 2

00000000

00000000

00000000

00000011

3 的二進制

00000000

00000000

00000000

000011

左移2位,砍掉高位

0000 0000

0000 0000

0000 0000

0000 1100

低位補0

右移6>>2

00000000

00000000

00000000

00000110

6的二進制

000000

00000000

00000000

00000001

右移10被砍掉

00000000

00000000

00000000

00000001

高位補0

 

  推論

    3<<2=12;  3<<1=6 ;  3<<3=24;

    3*4=12 ;  3*2=6;    3*8=24;

    3*22=12;   3*21=6    3*23 =24;

  結論往左移幾位就是乘以2的幾次冪。

  右移規律

    6>>2=1  ;6>>1=3 ;

    6/4=1   ; 6/2=3 ;

  右移兩位就是除以 2的2次方,右移一位就是除以 2的一次方。

  總結 :>> 是除以2的移動位數次冪

         << 是乘以2的移動位數次冪

  案例:三元

    獲取兩個數中大數

1 int x = 1;
2 int y = 2;
3 int z;
4 z = x > y ? x : y;
5 System.out.println(z); //2

    判斷一個數是奇數還是偶數

1 int x=5;
2 System.out.println((x%2==0?"偶數":"奇數"))

 3 、流程控制

3.1順序語句

  使用分號分隔的代碼稱作為一個語句。順序語句就是按照從上往下的順序執行的語句。

  注意:沒有寫任何代碼只是一個分號的時候,也是一條語句,稱作空語句。

3.2 條件語句

  條件語句可根據不同的條件執行不同的語句。包括if條件語句與switch多分支語句。

3.2.1 if   、if..else

  if條件語句
    使用if條件語句,可選擇是否要執行緊跟在條件之后的那個語句。關鍵字if之后是作為條件的“布爾表達式”,如果該表達式返回true,則執行其后的語句;若為false,則不執行if后的語句。可分為簡單的if條件語句、if···else語句和if···else if多分支語句。

  if(判斷條件){

         如果符合條件執行的代碼;

         執行的代碼塊1;

         執行的代碼塊2;

         ……………….;

         執行的代碼塊n;

  }

1 int a = 100;
2 if(a == 100) {
3     System.out.println(a);
4 }

  如上方代碼,{}之間為復合語句,if為條件語句,翻譯過來就是如果a等於100,則輸出a的值,否則不執行。
  如果if后只有一條語句,比如上述代碼只有一條輸出,可以不加{},但為了代碼的可讀性,以及防止代碼過多出現不必要的錯誤,建議所有的if、else后都加上相應的{}.

  if···else語句是條件語句中最常用的一種形式,它會針對某種條件有選擇的作出處理。通常表現為“如果滿足某種條件,就進行某種處理,否則就進行另一種處理”。

  if后的()內的表達式必須是boolean型的。如果為true,則執行if后的復合語句;如果為false,則執行else后的復合語句。

  if(判斷條件){

      執行的代碼塊1;

      執行的代碼塊2;

      ……………….; 

      執行的代碼塊n;

  }else{

      執行的代碼塊1;

      執行的代碼塊2;

      ……………….;

      執行的代碼塊n;

  }

  簡單案例理解:

 1 import java.util.Scanner;
 2 public class Demo {
 3     public static void main(String[] args) {
 4         Scanner sc=new Scanner(System.in);
 5         int nextInt = sc.nextInt();
 6         if(nextInt%5==0){
 7             System.out.println("是5的倍數");
 8         }
 9         if(nextInt%2==0){
10             System.out.println("是2的倍數");
11         }
12     }
13 }

  或者另外一種方式

 1 public static void main(String[] args) {
 2         int x = 8;
 3         if (x == 1) {
 4             System.out.println("星期一");
 5         } else if (x == 2) {
 6             System.out.println("星期二");
 7         } else if (x == 3) {
 8             System.out.println("星期三");
 9         } else if (x == 4) {
10             System.out.println("星期四");
11         } else if (x == 5) {
12             System.out.println("星期五");
13         } else if (x == 6) {
14             System.out.println("星期六");
15         } else if (x == 7) {
16             System.out.println("星期日");
17         } else {
18             System.out.println("請輸入數字1-7");
19         }
20 }

  案例:

 1 public static void main(String[] args) {
 2         Scanner sc = new Scanner(System.in);
 3         System.out.println("請輸入一個整數:");
 4         int nextInt = sc.nextInt();
 5         if (nextInt % 2 == 0) {
 6             System.out.println("是偶數");
 7         } else {
 8             System.out.println("是奇數");
 9         }
10         System.out.println("over");
11     }

  同樣道理如果花括號中只有一條語句,那么花括號可以省略不寫;

 1 public static void main(String[] args) {
 2         Scanner sc = new Scanner(System.in);
 3         System.out.println("請輸入一個整數:");
 4         int nextInt = sc.nextInt();
 5         if (nextInt % 2 == 0)
 6             System.out.println("是偶數");
 7         else
 8             System.out.println("是奇數");
 9 
10         System.out.println("over");
11     }

  其中發現if else語句有點類似於三元運算符

 1 Public static void main(String[] args) {
 2         int x = 0, y = 1, b;
 3         // if else 語句
 4         if (x > y) {
 5             b = x;
 6         } else {
 7             b = y;
 8         }
 9         System.out.println(b);// 1
10         // 3元運算
11         b = x > y ? x : y;
12         System.out.println(b); // 1
13 }

  例子:判斷閏年;可以被4整除不能被100整除,或者可以被400整除,那么這一年就是閏年

 1 public static void main(String[] args) {
 2         Scanner sc = new Scanner(System.in);
 3         System.out.println("請輸入年份:");
 4 
 5         int year = sc.nextInt();
 6         // 判斷年份能否被4整除
 7         boolean isLeapYear = (year % 4 == 0);
 8         // 年份能被4整除,並且不能被100整除並且使用&&(and)
 9         isLeapYear = isLeapYear && (year % 100 != 0);
10         // 年份或者能夠被400整除
11         isLeapYear = isLeapYear || (year % 400 == 0);
12         if (isLeapYear) {
13             System.out.println(year + "是閏年!");
14         }
15         // 簡寫格式;
16         if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
17             System.out.println(year + "是閏年!");
18         }
19     }

 

  三元運算符:

    好處:可以簡化if else代碼。

    弊端:因為是一個運算符,所以運算完必須要有一個結果。

  if語句特點

  1. 與三元運算符的區別:三元運算符運算完要有值出現。好處是:可以寫在其他表達式中。
  2. 條件表達式無論寫成什么樣子,只看最終的結構是否是true 或者 false。

3.2.2 switch

  switch語句中表達式的值必須是整型或字符型,常量值1~n必須也是整型或字符型。

  在Java的1.7之后的JDK版本,java中的switch里面表達式的類型可以是string類型。(Jdk版本一定要1.7之后,1.5可能只能是int或者char類型;怎么執行?

首先switch語句先計算表達式的值,如果表達式的值與case后的常量值相同,則執行該case后的若干個語句,直到遇到break語句為止。

如果沒有break,則繼續執行下一case中的若干語句,直到遇到break為止。

若沒有一個常量的值與表達式的值相同,則執行default后面的語句。default語句可選,如果不存在default語句,而且switch語句中的表達式的值與任何case的常量值都不相同,則switch不做任何處理。並且,同一個switch語句,case的常量值必須互不相同

  switch語句

    格式

switch(表達式)

{

    case 取值1:

       執行語句;

       break;

    case 取值2:

       執行語句;

       break;

    …...

    default:

       執行語句;

       break;

}

  switch語句特點:

      1,switch語句選擇的類型只有四種:byte,short,int , char。

    2,case之間與default沒有順序。先判斷所有的case,沒有匹配的case執行

default。

      3,switch語句停止的條件是遇到了break關鍵字或者結束switch語句的大括號。

      4,如果匹配的case或者default沒有對應的break,那么程序會繼續向下執行,運

行可以執行的語句,直到遇到break或者switch結尾結束。

      5,switch case中的值必須要與switch表達式的值具有相同的數據類型。而且case后跟的值必須是常量,不能跟變量。

  例子

 1 public static void main(String[] args) {
 2         int x = 3;
 3         switch (x) {
 4         case 1:
 5             System.out.println("1");
 6             break;
 7         case 2:
 8             System.out.println("2");
 9             break;
10         case 3:
11             System.out.println("3");
12             break;
13         default:
14             System.out.println("ok");
15             break;
16         }
17 }

  case 就像選擇題的答案之一。 break 就是如果該答案正確那么就可以跳出switch 了,意思就是說 已經找出了正確的答案了。那么這道題也就做完了。如果 case 沒有匹配接着進行下一個case 匹配,直到匹配為止。 最后如果都沒有匹配上,那么 switch 給提供了一個默認的答案,就是 default。

  注意: case后跟的是冒號:

  每個case中的執行語句一定要加break;

  例子:根據用於指定的月份,打印該月份所屬的季節;

 1 public static void main(String[] args) {
 2         int x = 3;
 3         switch (x) {
 4         case 3:
 5         case 4:
 6         case 5:
 7             System.out.println("spring");
 8             break;
 9         case 6:
10         case 7:
11         case 8:
12             System.out.println("sunmer");
13             break;
14         case 9:
15         case 10:
16         case 11:
17             System.out.println("autumn");
18             break;
19         case 12:
20         case 0:
21         case 1:
22             System.out.println("winter");
23         default:
24             System.out.println("ok");
25             break;
26         }
27     }

  

  案例:char 類型在switch 中的使用

 1 public static void main(String[] args) {
 2         int x = 1, y = 2;
 3         char ch = '*';
 4         switch (ch) {
 5         case '+':
 6             System.out.println("x*y=" + (x + y));
 7             break;
 8         case '-':
 9             System.out.println("x-y="+(x-y));
10             break;
11         case '*':
12             System.out.println("x*y="+(x*y));
13             break;
14         case '/':
15             System.out.println("x/y="+(x/y));
16             break;
17         default:
18             System.out.println("沒有");        
19 }
20 }

  if switch 語句很像,具體什么場景下,應用哪個語句呢?

    如果判斷的具體數值不多,而是符號byte,short int char 四種類型.

    雖然2個語句都可以使用,建議使用switch語句.因為效率稍高.

  其他情況:

    對區間判斷,對結果為boolean 類型判斷,使用if if的使用范圍更廣。

    if 除了能判斷具體數值還能判斷區間。switch 判斷區間會很費勁的。要寫好多case 對於運算結果是boolean型的 if 能判斷 switch 是不能實現的。例如:根據學生考試成績划分ABCD;

3.3 循環語句

  Java提供了三種類型的循環語句:while循環,do-while循環和for循環。

3.3.1while循環

  while語句格式:

  while(條件表達式)

  {

      執行語句;

  }

  while是用來解決重復操作執行,提供的方式叫做循環;下面一例子為輔助去理解;

  例子:想要打印出1-100之間的奇數

1 public static void main(String[] args) {
2         int x = 1;
3         while (x < 100) {
4             System.out.println(x);
5             x = x + 2;
6         }
7     }
 1 public static void main(String[] args){
 2         int x=1;
 3         while(x<100){
 4             
 5             if(x%2!=0){
 6                 System.out.print(x);
 7             }
 8             x++;
 9         }
10         System.out.println();

  例子:計算1+2+3+4+5+6+7+8+9 的值

1         int sum = 0;
2         int i = 1;
3         while (i < 10) {
4             sum = sum + i;
5             i++;
6         }
7         System.out.println(sum)

  注意:要精確控制循環的次數。常犯錯誤是是循環多執行一次或者少執行一次。

  例如會執行101次,想要執行100次,要么是count初始值為1,然后count<=100

  要么是count初始值為0,coung<100

1         int count = 0;
2         while (count <=100) {
3             System.out.println("hello ");
4             count++;
5         }
6         System.out.println("over");

3.3.2 do-while循環

  do while語句格式:

do

{

    執行語句;

}while(條件表達式);

do while特點是條件無論是否滿足,

循環體至少被執行一次。

   簡單例子

 1 public static void main(String[] args) {
 2         int x = 0, y = 0;
 3         do {
 4             System.out.println(x);
 5             x++;
 6         } while (x < 0);
 7         // do while do會先執行一次,不管是否滿足循環條件。
 8         while (y < 0) {
 9             System.out.println(y);
10             y++;
11         }
12     }

  while:先判斷條件,只有條件滿足才執行循環體。    

  do while: 先執行循環體,再判斷條件,條件滿足,再繼續執行循環體。

  簡單一句話:do while:無論條件是否滿足,循環體至少執行一次。

  注意一個細節do  while 后面的分號; 

 

  例子:猜數字游戲

 1 public static void main(String[] args) {
 2         // 記錄用戶輸入的數字
 3         int guess = -1;
 4         // 記錄用戶輸入次數
 5         int count = 0;
 6         // 生成1-100之間隨機數
 7         int num = (int) (int)(Math.random()*100)+1;
 8 Scanner sc = new Scanner(System.in);
 9 
10         // 循環猜數字
11         do {
12             System.out.println("請輸入1-100之間的數字");
13             guess = sc.nextInt();
14             if (guess > num) {
15 
16                 System.out.println("太大了");
17             } else if (guess < num) {
18 
19                 System.out.println("太小了");
20             } else {
21 
22                 System.out.println("中啦");
23             }
24             count++;
25 
26         } while (num != guess);
27         System.out.println("你猜測的數字是:" + num + "猜測了" + count + "次");
28     }

 

  例子:計算器
    系統自動生成2個隨機數用於參與運算。
    系統生成0-4之間的隨機數,表示加減乘除取模運算。
    使用switch 進行匹配

 1 class TestCouter {
 2     public static void main(String[] args) throws InterruptedException {
 3         // 生成隨機數Math.random()生成0-1值,不包含0和1,
 4          //乘以10得到0和10之間的數(double類型),不包含0和10
 5          //強轉為int,並加1得到1和10之間的數,包含1和10
 6          int x = (int)(Math.random()*10)+1;        
 7 int y = (int)(Math.random()*10)+1;            
 8 System.out.println(x);
 9         System.out.println(y);
10         // 創建0-4隨機數 0 1 2 3 4 各表示加減乘除取模
11         int z = (int) (int)(Math.random()*5);
12         System.out.println(z);
13 
14         switch (z) {
15         case 0:
16             System.out.println(x + "+" + y + "=?");
17             System.out.println("哥們快猜。。。。");
18             Thread.sleep(2000);
19             System.out.println(x + "+" + y + "=" + (x + y));
20             break;
21         case 1:
22             System.out.println(x + "-" + y + "=?");
23             System.out.println("哥們快猜。。。。");
24             Thread.sleep(2000);
25             System.out.println(x + "-" + y + "=" + (x - y));
26             break;
27         case 2:
28             System.out.println(x + "*" + y + "=?");
29             System.out.println("哥們快猜。。。。");
30             Thread.sleep(2000);
31             System.out.println(x + "*" + y + "=" + (x * y));
32             break;
33         case 3:
34             System.out.println(x + "/" + y + "=?");
35             System.out.println("哥們快猜。。。。");
36             Thread.sleep(2000);
37             System.out.println(x + "/" + y + "=" + (x / y));
38             break;
39         case 4:
40             System.out.println(x + "%" + y + "=?");
41             System.out.println("哥們快猜。。。。");
42             Thread.sleep(2000);
43             System.out.println(x + "%" + y + "=" + (x % y));
44             break;
45         }
46 
47     }
48 }

3.3.3 for循環

  格式:for(初始化表達式;循環條件表達式;循環后的操作表達式)

  {

         執行語句;

  }

  舉個例子說明:打印5次helloworld

1 public static void main(String[] args) {
2         for (int x = 0; x < 5; x++) {
3             System.out.println("hello java");
4         }
5     }

  for的執行流程
    for 知道要進行循環,讀到x=0 的時候,在內存中開辟了空間,定義變量x 賦值為0。接着進行條件判斷 x<5,為真,這個時候對滿足條件后執行了循環體的內容System.out.println("hello java");當循環體執行完畢之后,執行x < 5;后的表達式即 x++ 。x自增后變為了1 ,再次進行判斷 x<5 (int x=0 只執行一次),如果為真就再次運行System.out.println("hello java");如果為假,for循環結束。

  for 和while的區別

 1 public static void main(String[] args) {
 2         for (int x = 0; x < 5; x++) {
 3             System.out.println("hello java");
 4         }
 5         System.out.println(x); 
 6         //x cannot be resolved to a variable
 7 
 8         int y = 0;
 9         while (y < 5) {
10             System.out.println("hello world");
11             y++;
12         }
13         System.out.println(y);
14 }

  錯誤原因?

     x 為什么會找不到,注意了變量的作用域,也就是變量的作用范圍。x 只在 for 循環的大括號內有效,出了這個區域,就無效了.在內存中就消失了。x消失后,仍要訪問它,肯定會報錯的。

y 就不一樣了,y 是定義在while 外的。while循環完畢仍有效  while的初始化 動作在外邊,循環結束后y 仍然存在。

當定義的y 只作為循環增量存在的話的,循環完畢后y就沒有用了,但是y還是占着一塊內存。所以,如果定義的變量只作為循環增量存在的話,就用for 循環可以節約內存。

其實for 和while 是可以互換的。

  最后總結

  1、for里面的兩個表達式運行的順序,初始化表達式只讀一次,判斷循環條件,為真就執行循環體,然后再執行循環后的操作表達式,接着繼續判斷循環條件,重復找個過程,直到條件不滿足為止。

  2、while與for可以互換,區別在於for為了循環而定義的變量在for循環結束時就在內存中釋放。而while循環使用的變量在循環結束后還可以繼續使用。

  3、最簡單無限循環格式:while(true) , for(;;),無限循環存在的原因是並不知道循環多少次,而是根據某些條件,來控制循環。推薦使用while(true)

 

  例子:獲取1-10的和,並打印(for)

1 public static void main(String[] args) {
2         // 獲取1到10的和1+2+3+4+5+6+7+8+9+10
3         int sum = 0;
4         for (int x = 1; x <= 10; x++) {
5             System.out.println((sum + x) + "=" + sum + "+" + x);
6             sum = sum + x;
7         }
8         System.out.println(sum);// 55
9     }

  累加思想:通過變量記錄住循環操作后的結果;通過循環的形式.進行累加的動作。

  計數器思想:通過一個變量記錄住數據的狀態變化,也是通過循環完成。

 

  語句的嵌套應用,什么是嵌套形式,其實就是語句中還有語句。

  例子:打印*號

1 public static void main(String[] args) {
2         for (int x = 0; x < 5; x++) {
3             System.out.println("*");
4         }
5     }

    或者

1 public static void main(String[] args) {
2         for (int x = 0; x < 5; x++) {
3             for(int y=0;y<6;y++){
4                 System.out.print("*");
5             }
6             System.out.println();
7         }
8 }

    再或者

1 public static void main(String[] args) {
2         for (int x = 5; x > 0; x--) {
3             for(int y=x;y>0;y--){
4                 System.out.print("*");
5             }
6             System.out.println("");
7         }
8     }

    和

1 public static void main(String[] args) {
2         for (int x = 0; x < 5; x++) {
3             for (int y = 0; y <= x; y++) {
4                 System.out.print("*");
5             }
6             System.out.println("");
7         }
8 
9 }

  例子:9*9 乘法表

1 public static void main(String[] args) {
2         for (int x = 1; x <= 9; x++) {
3             for (int y = 1; y <= x; y++) {
4                 System.out.print(y + "*" + x + "=" + x * y + '\t');
5             }
6             System.out.println(" ");
7         }
8 }

3.4 轉向語句

  break、continue關鍵字;

  break關鍵字:break 語句用於終止最近的封閉循環或它所在的 switch 語句。控制傳遞給終止語句后面的語句(如果有的話)。

  適用:for循環 、 switch兩種循環語句。

  break的用法:

  1. 單獨使用。
  2. 與標簽一起使用。(標簽:即一個名字,滿足標識符的條件即可)。

使用細節: 不要再break語句之后,編寫其他語句,永遠都執行不到,編譯報錯。

  continue關鍵字:語句將控制權傳遞給它所在的封閉迭代語句的下一次迭代。(跳出本循環,執行下一次循環)。

  適用於:while 、 do while 、 for循環語句

  使用細節:

     1. 如果continue出現在循環的末尾(最后一條語句),那么可以省略。

     2. 如果continue出現在循環的第一條語句,那么后面的語句都無法執行,所以編譯報錯。

     3. 可以結合標記使用。

3.5 返回語句

  1、語法格式
    return 符合返回值類型的表達式
  2、含義:將表達式的值作為該函數運行的結果反饋給調用函數的地方;結束該函數的運行,返回到調用該函數的地方,繼續執行后面的語句。如果返回值類型不是空類型,必須保證函數一定會返回一個值。
  3、返回值和運行結果區別:
    返回值:它是函數反饋給調用函數處的信息。
    運行結果:是程序通過屏幕反饋給用戶的信息。

  return語句終止當前正在執行的函數並將控制權返回到調用該函數的地方。

    return語句有兩種形式:
      return;
      return expression;

  無返回值函數

  沒有返回值的return語句只能用在返回類型是void的函數中。返回void的函數不要求非得有return語句,因為在這類函數的最后一句后面會隱含地執行return。

  通常情況下,void函數如果想在它的中間位置提前退出,可以使用return語句。return的這種用法有點類似於我們用break語句退出循環。

  一個返回類型是void的函數也能使用return語句的第二種形式,不過此時return語句的expression必須是另一個返回void的函數。強行令void函數返回其他類型的表達式將產生編譯錯誤。

  有返回值的函數

  return語句的第二種形式提供了函數的結果。只要函數的返回類型不是void,則該函數內的每天return語句必須返回一個值。return語句返回值的類型必須與函數的返回類型相同,或者能隱式地轉換成函數的返回類型。

  盡管C++無法確保結果的正確性,但是可以保證每個return語句的結果類型正確。也許無法顧及所有情況,但是編譯器仍然盡量確保具有返回值的函數只能通過一條有效的return語句退出。

  在含有return語句的循環后面應該也有一條return語句,如果沒有的話該程序就是錯誤的。

  

  end... 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM