Java學(xué)習(xí)(一)

Java 教程

  • Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高級程序設(shè)計語言。
  • Java 可運行于多個平臺,如 Windows, Mac OS 及其他多種 UNIX 版本的系統(tǒng)。

我的第一個 JAVA 程序

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

Java 簡介

Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向?qū)ο蟪绦蛟O(shè)計語言和 Java 平臺的總稱。由 James Gosling和同事們共同研發(fā),并在 1995 年正式推出。

后來 Sun 公司被 Oracle (甲骨文)公司收購,Java 也隨之成為 Oracle 公司的產(chǎn)品。

Java分為三個體系:

  • JavaSE(J2SE)(Java2 Platform Standard Edition,java平臺標準版)
  • JavaEE(J2EE)(Java 2 Platform,Enterprise Edition,java平臺企業(yè)版)
  • JavaME(J2ME)(Java 2 Platform Micro Edition,java平臺微型版)。

2005 年 6 月,JavaOne 大會召開,SUN 公司公開 Java SE 6。此時,Java 的各種版本已經(jīng)更名,以取消其中的數(shù)字 "2":J2EE 更名為 Java EE,J2SE 更名為Java SE,J2ME 更名為 Java ME。

主要特性

  • Java 語言是簡單的:
    Java 語言的語法與 C 語言和 C++ 語言很接近,使得大多數(shù)程序員很容易學(xué)習(xí)和使用。另一方面,Java 丟棄了 C++ 中很少使用的、很難理解的、令人迷惑的那些特性,如操作符重載、多繼承、自動的強制類型轉(zhuǎn)換。特別地,Java 語言不使用指針,而是引用。并提供了自動分配和回收內(nèi)存空間,使得程序員不必為內(nèi)存管理而擔(dān)憂。

  • Java 語言是面向?qū)ο蟮模?br> Java 語言提供類、接口和繼承等面向?qū)ο蟮奶匦裕瑸榱撕唵纹鹨?,只支持類之間的單繼承,但支持接口之間的多繼承,并支持類與接口之間的實現(xiàn)機制(關(guān)鍵字為 implements)。Java 語言全面支持動態(tài)綁定,而 C++語言只對虛函數(shù)使用動態(tài)綁定??傊?,Java語言是一個純的面向?qū)ο蟪绦蛟O(shè)計語言。

  • Java語言是分布式的:
    Java 語言支持 Internet 應(yīng)用的開發(fā),在基本的 Java 應(yīng)用編程接口中有一個網(wǎng)絡(luò)應(yīng)用編程接口(java net),它提供了用于網(wǎng)絡(luò)應(yīng)用編程的類庫,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(遠程方法激活)機制也是開發(fā)分布式應(yīng)用的重要手段。

  • Java 語言是健壯的:
    Java 的強類型機制、異常處理、垃圾的自動收集等是 Java 程序健壯性的重要保證。對指針的丟棄是 Java 的明智選擇。Java 的安全檢查機制使得 Java 更具健壯性。

  • Java語言是安全的:
    Java通常被用在網(wǎng)絡(luò)環(huán)境中,為此,Java 提供了一個安全機制以防惡意代碼的攻擊。除了Java 語言具有的許多安全特性以外,Java 對通過網(wǎng)絡(luò)下載的類具有一個安全防范機制(類 ClassLoader),如分配不同的名字空間以防替代本地的同名類、字節(jié)代碼檢查,并提供安全管理機制(類 SecurityManager)讓 Java 應(yīng)用設(shè)置安全哨兵。

  • Java 語言是體系結(jié)構(gòu)中立的:
    Java 程序(后綴為 java 的文件)在 Java 平臺上被編譯為體系結(jié)構(gòu)中立的字節(jié)碼格式(后綴為 class 的文件),然后可以在實現(xiàn)這個 Java 平臺的任何系統(tǒng)中運行。這種途徑適合于異構(gòu)的網(wǎng)絡(luò)環(huán)境和軟件的分發(fā)。

  • Java 語言是可移植的:
    這種可移植性來源于體系結(jié)構(gòu)中立性,另外,Java 還嚴格規(guī)定了各個基本數(shù)據(jù)類型的長度。Java 系統(tǒng)本身也具有很強的可移植性,Java 編譯器是用 Java 實現(xiàn)的,Java 的運行環(huán)境是用 ANSI C 實現(xiàn)的。

  • Java 語言是解釋型的:
    如前所述,Java 程序在 Java 平臺上被編譯為字節(jié)碼格式,然后可以在實現(xiàn)這個 Java 平臺的任何系統(tǒng)中運行。在運行時,Java 平臺中的 Java 解釋器對這些字節(jié)碼進行解釋執(zhí)行,執(zhí)行過程中需要的類在聯(lián)接階段被載入到運行環(huán)境中。

  • Java 是高性能的:
    與那些解釋型的高級腳本語言相比,Java 的確是高性能的。事實上,Java 的運行速度隨著 JIT(Just-In-Time)編譯器技術(shù)的發(fā)展越來越接近于 C++。

  • Java 語言是多線程的:
    在 Java 語言中,線程是一種特殊的對象,它必須由 Thread 類或其子(孫)類來創(chuàng)建。通常有兩種方法來創(chuàng)建線程:其一,使用型構(gòu)為 Thread(Runnable) 的構(gòu)造子類將一個實現(xiàn)了 Runnable 接口的對象包裝成一個線程,其二,從 Thread 類派生出子類并重寫 run 方法,使用該子類創(chuàng)建的對象即為線程。值得注意的是 Thread 類已經(jīng)實現(xiàn)了 Runnable 接口,因此,任何一個線程均有它的 run 方法,而 run 方法中包含了線程所要運行的代碼。線程的活動由一組方法來控制。Java 語言支持多個線程的同時執(zhí)行,并提供多線程之間的同步機制(關(guān)鍵字為 synchronized)。

  • Java 語言是動態(tài)的:
    Java 語言的設(shè)計目標之一是適應(yīng)于動態(tài)變化的環(huán)境。Java 程序需要的類能夠動態(tài)地被載入到運行環(huán)境,也可以通過網(wǎng)絡(luò)來載入所需要的類。這也有利于軟件的升級。另外,Java 中的類有一個運行時刻的表示,能進行運行時刻的類型檢查。

Java 開發(fā)工具

Java 語言盡量保證系統(tǒng)內(nèi)存在 1G 以上,其他工具如下所示:

Java 開發(fā)環(huán)境配置

搭建Java開發(fā)環(huán)境

Java 基礎(chǔ)語法

一個 Java 程序可以認為是一系列對象的集合,而這些對象通過調(diào)用彼此的方法來協(xié)同工作。下面簡要介紹下類、對象、方法和實例變量的概念。

  • 對象:對象是類的一個實例,有狀態(tài)和行為。例如,一條狗是一個對象,它的狀態(tài)有:顏色、名字、品種;行為有:搖尾巴、叫、吃等。
  • 類:類是一個模板,它描述一類對象的行為和狀態(tài)。
  • 方法:方法就是行為,一個類可以有很多方法。邏輯運算、數(shù)據(jù)修改以及所有動作都是在方法中完成的。
  • 實例變量:每個對象都有獨特的實例變量,對象的狀態(tài)由這些實例變量的值決定。

基本語法

編寫 Java 程序時,應(yīng)注意以下幾點:

  • 大小寫敏感:Java 是大小寫敏感的,這就意味著標識符 Hello 與 hello 是不同的。
  • 類名:對于所有的類來說,類名的首字母應(yīng)該大寫。如果類名由若干單詞組成,那么每個單詞的首字母應(yīng)該大寫,例如 MyFirstJavaClass 。
  • 方法名:所有的方法名都應(yīng)該以小寫字母開頭。如果方法名含有若干單詞,則后面的每個單詞首字母大寫。
  • 源文件名:源文件名必須和類名相同。當(dāng)保存文件的時候,你應(yīng)該使用類名作為文件名保存(切記 Java 是大小寫敏感的),文件名的后綴為 .java。(如果文件名和類名不相同則會導(dǎo)致編譯錯誤)。
  • 主方法入口:所有的 Java 程序由 public static void main(String[] args) 方法開始執(zhí)行。

Java 標識符

Java 所有的組成部分都需要名字。類名、變量名以及方法名都被稱為標識符。
關(guān)于 Java 標識符,有以下幾點需要注意:

  • 所有的標識符都應(yīng)該以字母(A-Z 或者 a-z),美元符($)、或者下劃線(_)開始
  • 首字符之后可以是字母(A-Z 或者 a-z),美元符($)、下劃線(_)或數(shù)字的任何字符組合
  • 關(guān)鍵字不能用作標識符
  • 標識符是大小寫敏感的
  • 合法標識符舉例:age、$salary、_value、__1_value
  • 非法標識符舉例:123abc、-salary

Java修飾符

像其他語言一樣,Java可以使用修飾符來修飾類中方法和屬性。主要有兩類修飾符:

  • 訪問控制修飾符 : default, public , protected, private
  • 非訪問控制修飾符 : final, abstract, static, synchronized

Java 變量

Java 中主要有如下幾種類型的變量

  • 局部變量
  • 類變量(靜態(tài)變量)
  • 成員變量(非靜態(tài)變量)

Java 數(shù)組

數(shù)組是儲存在堆上的對象,可以保存多個同類型變量。

Java 枚舉

Java 5.0引入了枚舉,枚舉限制變量只能是預(yù)先設(shè)定好的值。使用枚舉可以減少代碼中的 bug。
例如,我們?yōu)楣暝O(shè)計一個程序,它將限制果汁為小杯、中杯、大杯。這就意味著它不允許顧客點除了這三種尺寸外的果汁。

實例

class FreshJuice {
   enum FreshJuiceSize{ SMALL, MEDIUM , LARGE }
   FreshJuiceSize size;
}
 
public class FreshJuiceTest {
   public static void main(String[] args){
      FreshJuice juice = new FreshJuice();
      juice.size = FreshJuice.FreshJuiceSize.MEDIUM  ;
   }
}

注意:枚舉可以單獨聲明或者聲明在類里面。方法、變量、構(gòu)造函數(shù)也可以在枚舉中定義。

Java 關(guān)鍵字

下面列出了 Java 關(guān)鍵字。這些保留字不能用于常量、變量、和任何標識符的名稱。

類別 關(guān)鍵字 說明
訪問控制 private 私有的
訪問控制 protected 受保護的
訪問控制 public 公共的
訪問控制 default 默認
類、方法和變量修飾符 abstract 聲明抽象
類、方法和變量修飾符 class
類、方法和變量修飾符 extends 擴充,繼承
類、方法和變量修飾符 final 最終值,不可改變的
類、方法和變量修飾符 implements 實現(xiàn)(接口)
類、方法和變量修飾符 interface 接口
類、方法和變量修飾符 native 本地,原生方法(非 Java 實現(xiàn))
類、方法和變量修飾符 new 新,創(chuàng)建
類、方法和變量修飾符 static 靜態(tài)
類、方法和變量修飾符 strictfp 嚴格,精準
類、方法和變量修飾符 synchronized 線程,同步
類、方法和變量修飾符 transient 短暫
類、方法和變量修飾符 volatile 易失

注意:Java 的 null 不是關(guān)鍵字,類似于 true 和 false,它是一個字面常量,不允許作為標識符使用。

繼承

在 Java 中,一個類可以由其他類派生。如果你要創(chuàng)建一個類,而且已經(jīng)存在一個類具有你所需要的屬性或方法,那么你可以將新創(chuàng)建的類繼承該類。
利用繼承的方法,可以重用已存在類的方法和屬性,而不用重寫這些代碼。被繼承的類稱為超類(super class),派生類稱為子類(subclass)。

接口

在 Java 中,接口可理解為對象間相互通信的協(xié)議。接口在繼承中扮演著很重要的角色。
接口只定義派生要用到的方法,但是方法的具體實現(xiàn)完全取決于派生類。

Java 對象和類

Java作為一種面向?qū)ο笳Z言。支持以下基本概念:

多態(tài)
繼承
封裝
抽象
類
對象
實例
方法
重載
  • 對象:對象是類的一個實例,有狀態(tài)和行為。例如,一條狗是一個對象,它的狀態(tài)有:顏色、名字、品種;行為有:搖尾巴、叫、吃等。
  • 類:類是一個模板,它描述一類對象的行為和狀態(tài)。

男孩(boy)、女孩(girl)為類(class),而具體的每個人為該類的對象(object)。
汽車為類(class),而具體的每輛車為該汽車類的對象(object),對象包含了汽車的顏色、品牌、名稱等。

Java中的對象

現(xiàn)在讓我們深入了解什么是對象??纯粗車鎸嵉氖澜?,會發(fā)現(xiàn)身邊有很多對象,車,狗,人等等。所有這些對象都有自己的狀態(tài)和行為。
拿一條狗來舉例,它的狀態(tài)有:名字、品種、顏色,行為有:叫、搖尾巴和跑。
對比現(xiàn)實對象和軟件對象,它們之間十分相似。
軟件對象也有狀態(tài)和行為。軟件對象的狀態(tài)就是屬性,行為通過方法體現(xiàn)。
在軟件開發(fā)中,方法操作對象內(nèi)部狀態(tài)的改變,對象的相互調(diào)用也是通過方法來完成。

Java 中的類

類可以看成是創(chuàng)建 Java 對象的模板。


WX20211004-170822

通過上圖創(chuàng)建一個簡單的類來理解下 Java 中類的定義:

public class Dog {
    String breed;
    int size;
    String colour;
    int age;
 
    void eat() {
    }
 
    void run() {
    }
 
    void sleep(){
    }
 
    void name(){
    }
}

一個類可以包含以下類型變量:

局部變量:在方法、構(gòu)造方法或者語句塊中定義的變量被稱為局部變量。變量聲明和初始化都是在方法中,方法結(jié)束后,變量就會自動銷毀。
成員變量:成員變量是定義在類中,方法體之外的變量。這種變量在創(chuàng)建對象的時候?qū)嵗?。成員變量可以被類中方法、構(gòu)造方法和特定類的語句塊訪問。
類變量:類變量也聲明在類中,方法體之外,但必須聲明為 static 類型。

構(gòu)造方法

每個類都有構(gòu)造方法。如果沒有顯式地為類定義構(gòu)造方法,Java 編譯器將會為該類提供一個默認構(gòu)造方法。
在創(chuàng)建一個對象的時候,至少要調(diào)用一個構(gòu)造方法。構(gòu)造方法的名稱必須與類同名,一個類可以有多個構(gòu)造方法。
下面是一個構(gòu)造方法示例:

public class Puppy{
    public Puppy(){
    }
 
    public Puppy(String name){
        // 這個構(gòu)造器僅有一個參數(shù):name
    }
}

創(chuàng)建對象

對象是根據(jù)類創(chuàng)建的。在Java中,使用關(guān)鍵字 new 來創(chuàng)建一個新的對象。創(chuàng)建對象需要以下三步:
聲明:聲明一個對象,包括對象名稱和對象類型。
實例化:使用關(guān)鍵字 new 來創(chuàng)建一個對象。
初始化:使用 new 創(chuàng)建對象時,會調(diào)用構(gòu)造方法初始化對象。
下面是一個創(chuàng)建對象的例子:

public class Puppy {
   public Puppy(String name) {
      // 這個構(gòu)造器僅有一個參數(shù):name
      System.out.println("小狗的名字是 : " + name ); 
   }
   public static void main(String[] args) {
      // 下面的語句將創(chuàng)建一個Puppy對象
      Puppy myPuppy = new Puppy( "tommy" );
   }
}

編譯并運行上面的程序,會打印出下面的結(jié)果:

小狗的名字是 : tommy

訪問實例變量和方法

通過已創(chuàng)建的對象來訪問成員變量和成員方法,如下所示:

/* 實例化對象 */
Object referenceVariable = new Constructor();
/* 訪問類中的變量 */
referenceVariable.variableName;
/* 訪問類中的方法 */
referenceVariable.methodName();

實例

下面的例子展示如何訪問實例變量和調(diào)用成員方法:

public class Puppy {
   int puppyAge;
   public Puppy(String name) {
      // 這個構(gòu)造器僅有一個參數(shù):name
      System.out.println("小狗的名字是 : " + name ); 
   }
 
   public void setAge( int age ) {
       puppyAge = age;
   }
 
   public int getAge( ) {
       System.out.println("小狗的年齡為 : " + puppyAge ); 
       return puppyAge;
   }
 
   public static void main(String[] args) {
      /* 創(chuàng)建對象 */
      Puppy myPuppy = new Puppy( "tommy" );
      /* 通過方法來設(shè)定age */
      myPuppy.setAge( 2 );
      /* 調(diào)用另一個方法獲取age */
      myPuppy.getAge( );
      /*你也可以像下面這樣訪問成員變量 */
      System.out.println("變量值 : " + myPuppy.puppyAge ); 
   }
}

編譯并運行上面的程序,產(chǎn)生如下結(jié)果:

小狗的名字是 : tommy
小狗的年齡為 : 2
變量值 : 2

源文件聲明規(guī)則

源文件的聲明規(guī)則。當(dāng)在一個源文件中定義多個類,并且還有import語句和package語句時,要特別注意這些規(guī)則。

  • 一個源文件中只能有一個 public 類
  • 一個源文件可以有多個非 public 類
  • 源文件的名稱應(yīng)該和 public 類的類名保持一致。例如:源文件中 public 類的類名是 Employee,那么源文件應(yīng)該命名為Employee.java。
  • 如果一個類定義在某個包中,那么 package 語句應(yīng)該在源文件的首行。
  • 如果源文件包含 import 語句,那么應(yīng)該放在 package 語句和類定義之間。如果沒有 package 語句,那么 import 語句應(yīng)該在源文件中最前面。
  • import 語句和 package 語句對源文件中定義的所有類都有效。在同一源文件中,不能給不同的類不同的包聲明。

類有若干種訪問級別,并且類也分不同的類型:抽象類和 final 類等。
除了上面提到的幾種類型,Java 還有一些特殊的類,如:內(nèi)部類、匿名類

Java 包

包主要用來對類和接口進行分類。當(dāng)開發(fā) Java 程序時,可能編寫成百上千的類,因此很有必要對類和接口進行分類。

import 語句

在 Java 中,如果給出一個完整的限定名,包括包名、類名,那么 Java 編譯器就可以很容易地定位到源代碼或者類。import 語句就是用來提供一個合理的路徑,使得編譯器可以找到某個類。
例如,下面的命令行將會命令編譯器載入 java_installation/java/io 路徑下的所有類

import java.io.*;

一個簡單的例子

在該例子中,我們創(chuàng)建兩個類:Employee 和 EmployeeTest。
Employee 類有四個成員變量:name、age、designation 和 salary。該類顯式聲明了一個構(gòu)造方法,該方法只有一個參數(shù)。

Employee.java 文件代碼:

import java.io.*;
 
public class Employee {
   String name;
   int age;
   String designation;
   double salary;
   // Employee 類的構(gòu)造器
   public Employee(String name) {
      this.name = name;
   }
   // 設(shè)置age的值
   public void empAge(int empAge) {
      age =  empAge;
   }
   /* 設(shè)置designation的值*/
   public void empDesignation(String empDesig) {
      designation = empDesig;
   }
   /* 設(shè)置salary的值*/
   public void empSalary(double empSalary) { 
      salary = empSalary;
   }
   /* 打印信息 */
   public void printEmployee() {
      System.out.println("名字:"+ name );
      System.out.println("年齡:" + age );
      System.out.println("職位:" + designation );
      System.out.println("薪水:" + salary);
   }
}

程序都是從main方法開始執(zhí)行。為了能運行這個程序,必須包含main方法并且創(chuàng)建一個實例對象。
下面給出EmployeeTest類,該類實例化2個 Employee 類的實例,并調(diào)用方法設(shè)置變量的值。
將下面的代碼保存在 EmployeeTest.java文件中。

EmployeeTest.java 文件代碼:

import java.io.*;

public class EmployeeTest {
 
   public static void main(String[] args) {
      /* 使用構(gòu)造器創(chuàng)建兩個對象 */
      Employee empOne = new Employee("RUNOOB1");
      Employee empTwo = new Employee("RUNOOB2");
 
      // 調(diào)用這兩個對象的成員方法
      empOne.empAge(26);
      empOne.empDesignation("高級程序員");
      empOne.empSalary(1000);
      empOne.printEmployee();
 
      empTwo.empAge(21);
      empTwo.empDesignation("菜鳥程序員");
      empTwo.empSalary(500);
      empTwo.printEmployee();
   }
}

編譯這兩個文件并且運行 EmployeeTest 類,可以看到如下結(jié)果:

名字:RUNOOB1
年齡:26
職位:高級程序員
薪水:1000.0
名字:RUNOOB2
年齡:21
職位:菜鳥程序員
薪水:500.0
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容