学习Java基础语法的Python工程师~ Java入门~

让我们学习Java吧

由于工作的需要,我不得不开始学习Java,尽管平常主要使用Python进行开发(偶尔使用GAS)。

自从我是学生以来,已经有近20年没有碰过Java了。
甚至连IF和FOR这样的基本语法都想不起来,真是糟糕……。

我想把我作为Java菜鸟学习的记录放在Qiita上,作为代替笔记的地方。

环境建立

据说Java不同于Python,它不是一种脚本语言。
因此,好像Python工程师们都无法使用喜爱的JupyterNoteBook。
不能以交互形式进行开发吗…突然感到有些不安。

首先,安装Java开发工具包(类似于用于开发Java的引擎)和一个名为Eclipse的集成开发环境(包含了开发编辑器和调试等各种功能)。

image.png

image.png

基本语法

将输出显示在控制台上。

嗯。光是輸出幾個字就需要打這麼多字實在是有點麻煩啊…… 如果用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中。

image.png

image.png

image.png

虽然我觉得他们是为了将每个功能拆分成组件而设计了这样的系统,但与Python相比,它复杂得太过离谱了…。

如果有多个层级的包的话

image.png

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

image.png

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

bannerAds