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.7.0_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事件的监听器对象实现的。当单击按钮、在文本区域中按回车键】选择菜单项、双击列表项都会触发监听器。
  • 随着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 = 2;
    public static final int FIVE = 5;
    public static final int THREE = 3;
    public static final int FOUR = 4;
    public static final int ZERO = 0;
    public static final int ONE = 1;
    public static final int A = 400;
    public static final int B = 180;
    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(1.0*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:207)
    at java.awt.Window.<init>(Window.java:535)
    at java.awt.Frame.<init>(Frame.java:420)
    at javax.swing.JFrame.<init>(JFrame.java:218)
    at weka.gui.LogWindow.<init>(LogWindow.java:252)
    at weka.gui.GUIChooser.<clinit>(GUIChooser.java:215)

解决方法是:

sudo apt-get install openjdk-7-jre

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 = 1.0
sonar.sourceEncoding = UTF-8
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的配置

详见本地教程。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值