学习Java基础语法的Python工程师~ Java入门~
让我们学习Java吧
由于工作的需要,我不得不开始学习Java,尽管平常主要使用Python进行开发(偶尔使用GAS)。
自从我是学生以来,已经有近20年没有碰过Java了。
甚至连IF和FOR这样的基本语法都想不起来,真是糟糕……。
我想把我作为Java菜鸟学习的记录放在Qiita上,作为代替笔记的地方。
环境建立
据说Java不同于Python,它不是一种脚本语言。
因此,好像Python工程师们都无法使用喜爱的JupyterNoteBook。
不能以交互形式进行开发吗…突然感到有些不安。
首先,安装Java开发工具包(类似于用于开发Java的引擎)和一个名为Eclipse的集成开发环境(包含了开发编辑器和调试等各种功能)。


基本语法
将输出显示在控制台上。
嗯。光是輸出幾個字就需要打這麼多字實在是有點麻煩啊…… 如果用Python的話,只要一行就搞定了……。
然而,我对利用”+”操作符将数字与字符串连接感到惊讶。
在Python中,如果不将数字转换为str类型,应该会报错。
据说,在Java中,System.out.println会在内部进行字符串转换。
public class Main {
public static void main(String[] args){
System.out.println("ABC");
System.out.println("数値を出力" + 123); //123は数値だが、自動的にStringに変換される
}
}
>>>ABC
>>>数値を出力123
声明变量
在声明变量时需要指定数据的类型。如果忘记了,就会出错。
当然,Python并不需要这样的操作。
这个真是有点麻烦,直到慢慢熟悉了才好。
public class Main {
public static void main(String[] args){
String mystr = "hello";
System.out.println(mystr);
}
}
>>>hello
顺便说一句,如果只声明变量而没有进行初始化,那么会导致编译错误。(虽然可以通过方法获取其他类的未初始化字段值,但获取时字符串类型为Null,整数类型为0,不知道为什么会被初始化。为什么呢?)
public class Main {
public static void main(String[] args){
//変数を初期化しないで使おうとするとエラー。
String mystr;
System.out.println(mystr);
}
}
改变形状
哇,好难懂。而且文字太多了。
据说,像(int)这样用括号括起来的类型转换方法被称为强制转换。
然而,使用这种方法进行类型转换可能会导致数据丢失(在下面的例子中,4.5会被表示为4,0.5会丢失)。
据说最好避免使用这种方法。
public class Main {
public static void main(String[] args) {
String s1, s2, s3;
int a1;
//文字列
s1 = "a";
s2 = s1 + "ddd";
//数値を文字列に変換
s3 = String.valueOf(10);
//4.5をinteger型にキャスト変換(キャストはデータの欠落を招くので良い記載とは言えない)
a1 = (int)4.5;
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(a1);
}
}
>>>a
>>>addd
>>>10
>>>4
如果
这并没有那么奇怪。
public class Main {
public static void main(String[] args){
int flg = 10;
if(flg > 0){
System.out.println("flg:" + flg);
}
}
}
>>>flg:10
遍历循环
这明显比Python的字符数量多。
public class Main {
public static void main(String[] args) {
for(int i=1; i<=3; i=i++) {
System.out.println(i);
}
}
}
>>>1
>>>2
>>>3
扩展的FOR循环
据说用这种方法,不会发生索引溢出和引用错误等问题,所以很好。
这种写法很像Python风格,对于有接触过Python的人来说,可能更容易处理。
public class Main {
public static void main(String[] args) {
int myarray[] = {1,2,3};
for(int a : myarray) {
System.out.println(a);
}
}
}
>>>1
>>>2
>>>3
排列
在Python中,数组和列表是类似的,但在Java中,它们被明确地区分开来。在Java中,需要提前确定数据类型,所以相比于Python,感觉会更加拘束。
public class Main {
public static void main(String[] args) {
int n[] = {3,4,5,6};
String s[] = {"ABC", "EFG"};
for (int i=0; i<n.length; i++) {
System.out.println("n[" + i +"]は" + n[i]);
}
for (int i=0; i<s.length; i++) {
System.out.println("s[" + i +"]は" + s[i]);
}
System.out.println("終了");
}
}
>>>n[0]は3
>>>n[1]は4
>>>n[2]は5
>>>n[3]は6
>>>s[0]はABC
>>>s[1]はEFG
列表
当使用列表时,需要导入一个库。(希望这类库在标准库里面。)
可以预先声明并导入带有<>的数据类型。(这可能是Python中缺少的一个有用功能)
import java.util.*;
public class Main {
public static void main(String[] args) {
//文字列のリストを作成
ArrayList<String> sl = new ArrayList<String>();
sl.add("1");
sl.add("2");
sl.add("3");
//数値のリストを作成
ArrayList<Integer> il = new ArrayList<Integer>();
il.add(4);
il.add(5);
il.add(6);
for (String s : sl) {
System.out.println(s);
}
for (Integer i : il) {
System.out.println(i);
}
}
}
>>>1
>>>2
>>>3
>>>4
>>>5
>>>6
字典
这也需要像列表一样进行导入。
import java.util.*;
public class Main {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<String, Integer>();
String nengo[] = {"A","B","C","D"};
map.put(nengo[0], 1000);
map.put(nengo[1], 1001);
map.put(nengo[2], 1002);
map.put(nengo[3], 1003);
for (String s : nengo) {
System.out.println(s+"は、"+map.get(s));
}
}
}
>>>Aは、1000
>>>Bは、1001
>>>Cは、1002
>>>Dは、1003
异常处理
异常处理。这个在Python中的写法几乎一样,所以完全不会感到不适。
public class Main {
public static void main(String[] args) {
try{
int n[] = {1,2,3};
System.out.println(5 / 0); //ArithmeticException eに飛ばされる
System.out.print(n[4]); //Exception eに飛ばされる
}
catch(ArithmeticException e){
System.out.println();
System.out.println("0による割り算発生");
}
catch(Exception e){
System.out.println("0除算以外のエラー");
}
finally{
System.out.println("終了");
}
}
}
调用方法
惊讶的是,在Java中,只要参数的类型不同,方法名的重复是允许的。
据说这种重复定义的情况被称为重载。
根据调用处使用的参数类型,自动切换要调用的方法。
这个功能在Python中是没有的,让我吃惊。
public class Main {
// メソッド
public static int add(int a, int b) {
return a + b;
}
// メソッド(オーバーロード)
public static String add(String s1, String s2) {
return s1 + s2;
}
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(add(a,b));
String s1 = "aaa";
String s2 = "123";
System.out.println(add(s1,s2));
}
}
>>>3
>>>aaa123
班级
使用一个简单的类的方法
下一个话题是关于课堂。
对于Python来说,它可以选择使用面向对象编程方式来构建,也可以选择不使用。但是Java则要求进行严格的面向对象编程构建。
此外,据说可以严格设置静态、公共以及其他类文件的访问权限控制。同时,还有一个叫做“包(package)”的概念,如果处于同一个包内,就可以无需导入便能够访问其他类文件。
下面的例子中,Calc和CalcLogic被放置在同一个包中,并且通过Calc调用了CalcLogic。
Calc成为了所谓的主函数,但其他人不知道这一点,因此在传递时需要告知哪个是主要的。
package class_book_01;
public class CalcLogic {
public static int tasu(int a, int b) {
return (a + b);
}
public static int hiku(int a, int b) {
return (a-b);
}
}
package class_book_01;
public class Calc {
public static void main(String[] args) {
//staticメソッドは、クラス名.メソッド名で呼び出し可能
System.out.println(CalcLogic.tasu(1,3));
System.out.println(CalcLogic.hiku(10,5));
//インスンスを作成したうえでメソッドを呼び出す
CalcLogic c = new CalcLogic();
System.out.println(c.tasu(1,3));
System.out.println(c.hiku(10,5));
}
}
在编译时,新建一个名为class_book_01的文件夹,并将已创建的Calc.java和CalcLogic.java文件复制到class_book_01中。



虽然我觉得他们是为了将每个功能拆分成组件而设计了这样的系统,但与Python相比,它复杂得太过离谱了…。
如果有多个层级的包的话
如果要编译这个东西,需要将”work”文件夹及其内容复制到任意文件夹中,
然后进入”work”文件夹的上一级文件夹,进行编译和执行就可以了。
暂时来说,基础语法大概就是这样了。
(如果有不足的地方,我们再适时补充)
下次我们将深入学习课程的详细功能和面向对象的内容。

如果要编译这个东西,需要将”work”文件夹及其内容复制到任意文件夹中,
然后进入”work”文件夹的上一级文件夹,进行编译和执行就可以了。

暂时来说,基础语法大概就是这样了。
(如果有不足的地方,我们再适时补充)
下次我们将深入学习课程的详细功能和面向对象的内容。