开始java学习之路

Posted by LuckXiang on March 22, 2018

计划在公司产品线中引入安卓,后悔大学没有选一下java这门课,工作之后主要和c,python,JavaScript打交道,没有积累java相关的知识,需要重头来过。这几天刷了一下java编程思想和安卓开发的相关书籍,又对项目技术做了一下评估和测试,感觉问题不大。现在需要做的就是把java基础知识过一遍,到时候开发效率会高一些。由于安卓开发环境已经决定采用Android Studio,没必要再去搞eclipse,所以直接用熟悉的vim来写代码吧,编译用javac,调试用jdb。 这样也能加深对java的理解。

安装java

java开发环境安装真的太容易了,生态好就是爽,考虑稳定性,从官网下载java8压缩包, 直接解压到相关目录,配置一下~/.profile

#java
export JAVA_HOME=/opt/java/jdk1.8.0_162
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt,jar:$JAVA_HOME/lib/tools.jar
export PATH=/opt/android/android-studio/bin:$PATH

开发

先去github开个项目存一下学习代码,传送门,编码风格按驼峰编码,先写一个HelloWorld

/*************************************************************************
	> File Name: HelloWorld.java
	> Author: 
	> Mail: 
	> Created Time: 2018年03月22日 星期四 15时05分56秒
 ************************************************************************/

import java.util.*;

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

编译

编译用javac, 编译完了生成了一个HelloWorld.class字节码文件。

javac HelloWorld.java

运行

java HelloWorld 

调试

调试需要重新编译代码成调试模式,输入help查看调试命令,感觉和gdb比起来,jdb差了很多,可能是大家都用ide来调试的原因吧,工具没有进一步优化。

➜  HelloWorld git:(master) ✗ javac -g HelloWorld.java 
➜  HelloWorld git:(master) ✗ jdb HelloWorld 
正在初始化jdb...
> help
** 命令列表 **
connectors                -- 列出此 VM 中可用的连接器和传输

run [class [args]]        -- 开始执行应用程序的主类

threads [threadgroup]     -- 列出线程
thread <thread id>        -- 设置默认线程
suspend [thread id(s)]    -- 挂起线程 (默认值: all)
resume [thread id(s)]     -- 恢复线程 (默认值: all)
where [<thread id> | all] -- 转储线程的堆栈
wherei [<thread id> | all]-- 转储线程的堆栈, 以及 pc 信息
up [n frames]             -- 上移线程的堆栈
down [n frames]           -- 下移线程的堆栈
kill <thread id> <expr>   -- 终止具有给定的异常错误对象的线程
interrupt <thread id>     -- 中断线程

print <expr>              -- 输出表达式的值
dump <expr>               -- 输出所有对象信息
eval <expr>               -- 对表达式求值 (与 print 相同)
set <lvalue> = <expr>     -- 向字段/变量/数组元素分配新值
locals                    -- 输出当前堆栈帧中的所有本地变量

classes                   -- 列出当前已知的类
class <class id>          -- 显示已命名类的详细资料
methods <class id>        -- 列出类的方法
fields <class id>         -- 列出类的字段

threadgroups              -- 列出线程组
threadgroup <name>        -- 设置当前线程组

stop in <class id>.<method>[(argument_type,...)]
                          -- 在方法中设置断点
stop at <class id>:<line> -- 在行中设置断点
clear <class id>.<method>[(argument_type,...)]
                          -- 清除方法中的断点
clear <class id>:<line>   -- 清除行中的断点
clear                     -- 列出断点
catch [uncaught|caught|all] <class id>|<class pattern>
                          -- 出现指定的异常错误时中断
ignore [uncaught|caught|all] <class id>|<class pattern>
                          -- 对于指定的异常错误, 取消 'catch'
watch [access|all] <class id>.<field name>
                          -- 监视对字段的访问/修改
unwatch [access|all] <class id>.<field name>
                          -- 停止监视对字段的访问/修改
trace [go] methods [thread]
                          -- 跟踪方法进入和退出。
                          -- 除非指定 'go', 否则挂起所有线程
trace [go] method exit | exits [thread]
                          -- 跟踪当前方法的退出, 或者所有方法的退出
                          -- 除非指定 'go', 否则挂起所有线程
untrace [methods]         -- 停止跟踪方法进入和/或退出
step                      -- 执行当前行
step up                   -- 一直执行, 直到当前方法返回到其调用方
stepi                     -- 执行当前指令
下一步                      -- 步进一行 (步过调用)
cont                      -- 从断点处继续执行

list [line number|method] -- 输出源代码
use (或 sourcepath) [source file path]
                          -- 显示或更改源路径
exclude [<class pattern>, ... | "none"]
                          -- 对于指定的类, 不报告步骤或方法事件
classpath                 -- 从目标 VM 输出类路径信息

monitor <command>         -- 每次程序停止时执行命令
monitor                   -- 列出监视器
unmonitor <monitor#>      -- 删除监视器
read <filename>           -- 读取并执行命令文件

lock <expr>               -- 输出对象的锁信息
threadlocks [thread id]   -- 输出线程的锁信息

pop                       -- 通过当前帧出栈, 且包含当前帧
reenter                   -- 与 pop 相同, 但重新进入当前帧
redefine <class id> <class file name>
                          -- 重新定义类的代码

disablegc <expr>          -- 禁止对象的垃圾收集
enablegc <expr>           -- 允许对象的垃圾收集

!!                        -- 重复执行最后一个命令
<n> <command>             -- 将命令重复执行 n 次
# <command>               -- 放弃 (无操作)
help (或 ?)               -- 列出命令
version                   -- 输出版本信息
exit (或 quit)            -- 退出调试器

<class id>: 带有程序包限定符的完整类名
<class pattern>: 带有前导或尾随通配符 ('*') 的类名
<thread id>: 'threads' 命令中报告的线程编号
<expr>: Java(TM) 编程语言表达式。
支持大多数常见语法。

可以将启动命令置于 "jdb.ini" 或 ".jdbrc" 中
位于 user.home 或 user.dir 中
> stop in HelloWorld.main
正在延迟断点HelloWorld.main。
将在加载类后设置。
> r
无法识别的命令: 'r'。请尝试获得帮助...
> run
运行HelloWorld
设置未捕获的java.lang.Throwable
设置延迟的未捕获的java.lang.Throwable
> 
VM 已启动: 设置延迟的断点HelloWorld.main

断点命中: "线程=main", HelloWorld.main(), 行=13 bci=0
13            System.out.println("Hello World\n");

main[1] next
> Hello World


已完成的步骤: "线程=main", HelloWorld.main(), 行=14 bci=8
14        }