天天看點

JAVA:入門筆記(2017.3.29 更新)

1.JDK的安裝以及環境的配置

連結:JDK 7的安裝

Installation of the 64-bit JDK on Linux Platforms
  • This procedure installs the Java Development Kit (JDK) for 64-bit

    Linux, using an archive binary file

    (.tar.gz)

    . These instructions

    use the following file:

    jdk-7u<version>-linux-x64.tar.gz

    • Download the file. Before the file can be downloaded, you must accept the license agreement. The archive binary can be installed by

      anyone (not only root users), in any location that you can write to.

      However, only the root user can install the JDK into the system

      location.

    • Change directory to the location where you would like the JDK to be installed. Move the

      .tar.gz

      archive binary to the current

      directory.

    • Unpack the tarball and install the JDK.

      % tar zxvf

      jdk-7u<version>-linux-x64.tar.gz

      The Java Development Kit files are

      installed in a directory called

      jdk1.7.0_<version>

      in the current

      directory.

    • Delete the

      .tar.gz

      file if you want to save disk space.

連結:環境的配置

全局的環境變量配置:

指令#:

vi /etc/profile

shift+g定位到檔案末尾,添加一下代碼:

export JAVA_HOME=/home/software/jdk1.7.0_10 (自己電腦jdk的安裝路徑) export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

讓環境變量生效,執行配置檔案令其立刻生效指令#:

source /etc/profile

局部環境變量配置:

指令#:

vi ~/.bashrc

定位到檔案末尾,添加一下代碼:

export JAVA_HOME=/home/common/software/jdk1._45
 export PATH=$PATH:$JAVA_HOME/bin
 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
           

讓環境變量生效,執行配置檔案令其立刻生效指令#:

source ~/.bashrc

2. Ant

(1)安裝

在終端中輸入指令

sudo apt-get install ant

(2)ant的使用

連結:ant使用指南

  • ant是一個将軟體編譯、測試、部署等步驟聯系在一起加以自動化的一個工具,大多用在Java環境中的軟體開發。
  • <?xml version="1.0" ?>

    說明版本号為1.0的xml文檔
  • <project></project>

    ant的根元素
    • name屬性:用于指定project元素的名稱
    • default:用于指定project預設執行時所執行的target的名稱
    • basedir屬性:用于指定基路徑的位置。該屬性沒有指定時,使用
  • <target></target>

    為ant的基本執行單元或是任務,它可以包含一個或多個具體的單元/任務。多個target 可以存在互相依賴關系
    • name 屬性:指定 target 元素的名稱,這個屬性在一個 project 元素中是唯一的。我們可以通過指定 target 元素的名稱來指定某個 target 。
    • depends 屬性:用于描述 target 之間的依賴關系,若與多個 target 存在依賴關系時,需要以“,”間隔。 Ant 會依照 depends 屬性中 target 出現的順序依次執行每個 target ,被依賴的target 會先執行。
    • if 屬性:用于驗證指定的屬性是存在,若不存在,所在 target 将不會被執行。
    • unless 屬性:該屬性的功能與 if 屬性的功能正好相反,它也用于驗證指定的屬性是否存在,若不存在,所在 target 将會被執行。
    • description 屬性:該屬性是關于 target 功能的簡短描述和說明。
  • <property />

    property元素可看作參量或者參數的定義,project 的屬性可以通過 property 元素來設定,也可在 Ant 之外設定。
  • <copy />

    主要用來對檔案和目錄的複制功能
  • <delete />

    對檔案或目錄進行删除
  • <move />

    移動檔案或目錄
  • <echo>

    該任務的作用是根據日志或監控器的級别輸出資訊。
    • message
    • file
    • append
    • level
  • <jar>

    • destfile表示JAR檔案名。
    • basedir表示被歸檔的檔案名。
    • includes表示别歸檔的檔案模式。
    • exchudes表示被排除的檔案模式。
    • compress表示是否壓縮。
  • <javac />

    該标簽用于編譯一個或一組java檔案
    • srcdir表示源程式的目錄。
    • destdir表示class檔案的輸出目錄。
    • include表示被編譯的檔案的模式。
    • excludes表示被排除的檔案的模式。
    • classpath表示所使用的類路徑。
    • debug表示包含的調試資訊。
    • optimize表示是否使用優化。
    • verbose 表示提供詳細的輸出資訊
    • fileonerror表示當碰到錯誤就自動停止。
  • <java />

    該标簽用來執行編譯生成的.class檔案,其屬性如下。
    • classname 表示将執行的類名。
    • jar表示包含該類的JAR檔案名。
    • classpath所表示用到的類路徑。
    • fork表示在一個新的虛拟機中運作該類。
    • failonerror表示當出現錯誤時自動停止。
    • output 表示輸出檔案。
    • append表示追加或者覆寫預設檔案。

下面是ant自動編譯Helloworld:

<?xml version="1.0" encoding="UTF-8"?>
<project name="HelloWorld" default="run" basedir=".">
    <property name="src" value="src" />
    <property name="dest" value="class" />

    <target name="init" >
        <mkdir dir="${src}" />
    <mkdir dir="${dest}" />
    </target>

    <target name="compile" depends="init">
        <javac srcdir="${src}" destdir="${dest}" />  
    </target>

    <target name="run" depends="clean,compile,test">

    </target>

    <target name="clean">
    <delete dir="${dest}" />
    </target>

    <target name="test" depends="compile" >
        <junit printsummary="yes">
            <formatter type="plain" />
            <classpath path="${dest}" />
            <test name="HelloWorldTest" />
        </junit>
    </target>
</project>
           

3.vim/vi 的使用

  • 詳見wiki文檔
    • Vim主要分為兩種狀态:一種是指令模式(command mode),另外一種是插入模式(Insert mode
      • 在指令模式,可以控制光标移動、字元、字或行的删除,移動複制某區段及進入Insert mode下等操作
      • 在插入模式,我們可以進行文字的輸入
    • 指令行:

      vi 文檔名

    • 指令模式與插入模式的切換
      • 指令模式->插入模式:i(還有其他指令)
      • 插入模式->指令模式:ESC
    • 退出vi需要在指令模式中操作
      • w filename
      • wq
      • q!
      • q
    • 常用指令(詳見文檔)
    • 心得
      • 剛上手時缺失有點困難,比如我在打代碼時習慣将左右括号同時打出來,然後再将光标移動到括号内再輸入然後再把光标移出去:打完左右括号後,按ESC,再按i,輸入文本後,再按L将光标移動至右括号,再按a繼續我的輸入等等
      • 但是有幾個很大的優點就是:裝逼!裝逼!還是裝逼!首先你可以在終端視窗完成文檔編輯,其次你的手完全不需要觸碰滑鼠,甚至都不要觸碰到鍵盤的方向鍵,特别友善
      • 仍然需要長期聯系才能達到熟練的程度,是以這次實訓的所有代碼我都會用vi來完成

4.JAVA

(1)jdk環境的配置

  • 首先安裝

    jdk-7u<version>-linux-x64.tar.gz

    • 我在官網下載下傳了最新的jdk-8但是解壓一直出現問題,即使我使用了sudo。後經過上網查詢發現應該是壓縮包的問題,是以從第三方下載下傳了jdk-7(官網已不提供這個版本的jdk下載下傳了)
    • 我是将壓縮包cp到

      /usr/jva

      檔案夾中進行解壓

      tar zxvf 檔案名

  • 其次就是環境的配置
    • 環境配置需要配置全局環境變量與局部環境變量,兩者缺一不可。
    • 全局環境配置主要在

      /etc/profile

    • 局部環境配置主要在

      ~/.bashrc

    • 根據教程并結合自己實際的存儲地點對環境進行配置

(2)編寫HelloWorld

  • 在終端輸入

    vi HelloWorld.java

    編輯:
public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("HelloWorld!");
    }
}
           
  • 在終端輸入

    javac HelloWorld.java

    生成

    HelloWorld.class

    檔案,然後接着輸入

    java HelloWorld

    運作程式
  • 注意:
    • 檔案名必須與類名相同;
    • println而不是printIn,是小寫的‘l’而不是大寫的‘i’。

(3)基礎文法

大緻掃了一遍教程,感覺文法方面與C++還是挺類似的,是以很穩,但在接口調用這方面還是較為薄弱:如GUI,是以主要是對GUI進行學習。

  • String 與 int 的互相轉化
    • 判斷字元串相等
    • 關鍵字extends的用法
    • super()的用法
    • 圖形化界面設計GUI
    • import java.awt.*

    • import javax.swing.*

    • import java.event.*

    • JFrame
      • getContentPane().add()
      • setVisible()
      • setSize
      • setDefaultCloseOperation()
      • setLocationRelativeTo()
    • JPanel
      • GridLayout
      • FlowLayout
      • BorderLayout
      • CardLayout
    • JTextField
    • JButton
    • addActionListener
  • AWT是抽象視窗工具箱的縮寫,他為編寫圖形使用者界面提供了使用者接口,通過這個接口就可以繼承很多方法,省去很多工作。AWT還能使應用程式更好地同使用者進行互動。
  • 布局管理器:JAVA中的圖形界面在布局管理上采用容器和布局管理相分離大的方案,也就是說容器隻是把元件放進來,但它不管怎麼放置。至于如何放置需要用到布局管理器。布局管理器分為以下四種:FlowLayout、BorderLayout、GridLayout、CardLayout。
  • 元件與監聽接口:ActionListener是由處理ActionEvent事件的監聽器對象實作的。當單擊按鈕、在文本區域中按Enter鍵】選擇菜單項、輕按兩下清單項都會觸發監聽器。
  • 随着JAVA的發展,AWT已經逐漸被淘汰,它已經不能适應發展的需要,不能滿足開發功能強大的使用者界面的需要。這是就出現了Swing,它是建立在AWT之上的組建集,在不同的平台上都能保持組建的界面樣式,是以得到了非常廣泛的應用。
  • 圖形化界面設計的思路便是:設定一個頂層的JFrame容器,然後建立一個JPanel的面闆,将空間放到該面闆上,同時設定該面闆的布局風格,最後将這個面闆插回JFrame容器中

簡單的電腦實作:

// MyCalculator.java

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class MyCalculator extends JFrame {
    public static final int TWO = ;
    public static final int FIVE = ;
    public static final int THREE = ;
    public static final int FOUR = ;
    public static final int ZERO = ;
    public static final int ONE = ;
    public static final int A = ;
    public static final int B = ;
    private static JPanel p = new JPanel(new GridLayout(TWO,FIVE,THREE,THREE));
    private static String str[] = {"+", "-", "*", "/", "OK"};    
    private static JTextField t[];
    private static JButton btn[];
    private static String[] getstr() {
        return str;
    }
    private static JTextField[] gett() {
        return t;
    }
    private static JButton[] getbtn() {
        return btn;
    }
    private static JPanel getJpanel() {
        return p;
    }
    public MyCalculator(String s) {
        super(s);
    t = new JTextField[FIVE];
        btn = new JButton[FIVE];
        for (int j = ZERO; j < FIVE; j++) {
        if (j == ZERO) {
                t[j] = new JTextField("12");
            } else if (j == TWO) {
                t[j] = new JTextField("2");
            } else if (j == THREE) {
        t[j] = new JTextField("=");
            } else {
                t[j] = new JTextField("");
            }
            if (j == ONE || j == THREE || j == FOUR) {
                t[j].setEditable(false);   
            }
            p.add(t[j]);
        t[j].setHorizontalAlignment(JTextField.CENTER);
        }
    for (int i = ZERO; i < FIVE; i++) {
            btn[i] = new JButton(str[i]);
            p.add(btn[i]);
    }
        getContentPane().add(p);
        setVisible(true);
        setSize(A,B);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        btn[ONE].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                t[ONE].setText("+");
            }
        });
        btn[ONE].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                t[ONE].setText("-");
            }
        });
        btn[TWO].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                t[ONE].setText("*");
            }
        });
        btn[THREE].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                t[ONE].setText("/");
            }
        });
        btn[FOUR].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                int n1 = Integer.valueOf(t[ZERO].getText()).intValue();
                int n2 = Integer.valueOf(t[TWO].getText()).intValue();
                if (t[ONE].getText().equals("+")) {
                    t[FOUR].setText(String.valueOf(n1+n2));
                } else if (t[ONE].getText().equals("-")) {
                    t[FOUR].setText(String.valueOf(n1-n2));
                } else if (t[ONE].getText().equals("*")) {
                    t[FOUR].setText(String.valueOf(n1*n2));
                } else {
                    t[FOUR].setText(String.valueOf(*n1/n2));
                }
            }
        });
    }

    public static void main(String[] args) {
        new MyCalculator("Easy Calculator");
    }
}
           

但是在編譯後執行的過程中會報錯:

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.awt.HeadlessException
    at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:)
    at java.awt.Window.<init>(Window.java:)
    at java.awt.Frame.<init>(Frame.java:)
    at javax.swing.JFrame.<init>(JFrame.java:)
    at weka.gui.LogWindow.<init>(LogWindow.java:)
    at weka.gui.GUIChooser.<clinit>(GUIChooser.java:)
           

解決方法是:

5.Junit的配置

  • 配置
    • 從官網下載下傳Junit-4.9.jar放到

      ${JAVA_HOME}/lib

    • 配置

      ~/.bashrc

      檔案中CLASSPATH
  • Junit測試有點類似于字元串的比對
  • 運作指令
javac HelloWorldTest.java
java -ea org.junit.runner.JUnitCore HelloWorldTest
           
  • 實作ant運作JUnit:在build.xml檔案中加入一個

    <target name="test" 即可>

    代碼如下:
<target name="test" depends="compile" >
        <junit printsummary="yes">
            <formatter type="plain" />
            <classpath path="${dest}" />
            <test name="HelloWorldTest" />
        </junit>
</target>
           

6.SonarQube

  • Sonar 是一個用于代碼品質管理的開源平台,用于管理源代碼的品質,可以從七個次元檢測代碼品質。
    • 糟糕的複雜度分布:檔案、類、方法等,如果複雜度過高将難以改變,這會使得開發人員難以了解它們,且如果沒有自動化的單元測試,對于程式中的任何元件的改變都将可能導緻需要全面的回歸測試。
    • 重複:顯然程式中包含大量複制粘貼的代碼是品質低下的,sonar可以展示源碼中重複嚴重的地方
    • 缺乏單元測試:sonar可以很友善地統計并展示單元測試的覆寫率
    • 沒有代碼标準:sonar 可以通過 PMD,CheckStyle,Findbugs 等等代碼規則檢測工具規範代碼編寫。
    • 沒有足夠的或者過多的注釋:沒有注釋将使代碼可讀性變差,特别是當不可避免地出現人員變動時,程式的可讀性将大幅下降。而過多的注釋又會使得開發人員将精力過多地花費在閱讀注釋上,亦違背初衷。
    • 潛在的bug:sonar可以通過PMD,CheckStyle,Findbugs等等代碼規則檢測工具檢測出潛在的bug
    • 糟糕的設計:通過sonar可以找出循環,展示包與包、類與類之間的互相依賴關系; 可以檢測自定義的架構規則;通過sonar可以管理第三方的jar包;可以利用LCOM4檢測單個任務規則的應用情況;檢測耦合。
  • 安裝
      1. 已安裝 Java 環境
      1. 安裝 sonar 與 sonar-runner
        • 2.1 将下載下傳的 sonar-3.7.4.zip 包解壓至 Linux 某路徑如/usr/local,
        • 2.2 将下載下傳的 sonar-runner-dist-2.4.zip 包解壓某路徑/usr/local;
        • 2.3 添加 SONAR_HOME、SONAR_RUNNER_HOME 環境變量,并将SONAR_RUNNER_HOME 加入 PATH(這步主要是友善大家在 shell 友善進入 sonar 檔案夾和進行編譯):
        • 2.3.1 在 shell 裡面用 vi 或者 gedit 打開 /etc/profile
        • 2.3.2 在檔案末端添加你解壓縮的 sonar 檔案夾的路徑
        • 2.3.3 最後儲存退出,在 shell 裡面鍵入

          source /etc/profile

          ,重新開機系統。
      1. 添加資料庫:如果使用 Sonar 預設的資料庫 H2,則無需配置
      1. 啟動服務:在

        shell

        裡面鍵入

        cd $SONAR_HOME

        ,可以直接進入啟動目錄。在 shell 裡面鍵入

        通路

        http:\\localhost:9000

        ,如果顯示 SonarQube 的項目管理界面,表示安裝成功。
./sonar.sh start 啟動服務
./sonar.sh stop 停止服務
./sonar.sh restart 重新開機服務
           
  • 使用

定義

sonar-project.properties

檔案

#required metadata

sonar.projectKey = src // 輸入存放.java檔案的檔案夾
sonar.projectName = src // 輸入存放.java檔案的檔案夾
sonar.projectVersion = 
sonar.sourceEncoding = UTF-
sonar.modules = java-module

java-module.sonar.projectName = Java Module
java-module.sonar.language = java
java-module.sonar.sources = .
java-module.sonar.projectBaseDir = src // 輸入存放.java檔案的檔案夾
           

在該檔案的目前目錄下使用指令

sonar-runner

,然後打開

http:\\localhost:9000

檢視對應項目的情況即可

注意:每次使用完Sonar後記得關閉。

9.extends與implement的差別

  • 繼承一個類用extends,後面跟着父類的名字
  • 實作一個接口用implement,後面跟接口的名字
  • extend後面隻能跟一個類
  • impletement後面能跟多個接口,且用逗号隔開
  • 接口就是類似于C++中的純虛函數
  • 由于Java不支援多重繼承,是以可以通過接口實作多重繼承
  • 舉個最近實訓用的栗子:

    Grid是一個接口,AbstractGrid是這個接口的一個實作,而BoundedGrid與UnboundedGrid繼承了AbstractGrid。我個人的了解就是,BoundedGrid與Unbounded grid 有共同的方法,是以泛化一個父類來實作這些方法,同時包含它們不同實作的方法接口。但是一個類不能既存在實作又存在接口,為了解決這個問題,便定義了一個接口grid,使得AbstractGrid implement于它,這樣也就繼承了接口。自己實作共同的方法,而不同的方法在其子類中對應實作。

10.Eclipsed的配置

詳見本地教程。