只睡了6小时,能自然醒并且不困,是个好兆头,继续研究Java吧
一、基本结构
1、8种基本数据类型
整数:byte、short、int、long
浮点数:float、double
其它:char、boolean
首字母小写的是基本类型,大写的是类(对象封装器)
可以看到,没有string。。。所以平时要弄个字符串要用String的类
2、常量
Java使用final(一般static final),C#是const或readonly(一般static readonly)
3、控制台输出
Java: System.out.print("Output") / System.out.println("Output");
C#: Console.Write("Output") / Console.Writeline("Output");
不过C#还要Console.Readkey(),不然看不到结果
4、数字字面量
后面加L表示long,前面加0表示8进制,0x表示16进制
float a = (float) 3.14; //默认是double,要显式转换 double b = 3.14; float c = 3.14F; //要使用F表示是float
这C#也一样(平时怎么没注意到。。。)
Java 7还可以 int x = 1_234,相当于int x = 1234
关于Integer,还有个坑,默认“==”是用于-127~128的,
>=128的就没办法直接用==比较了,因为这是JAVA底层设计的,超过128的整型包装类是不使用对象池的,那你只好显示的intValue()一下再用==比较了
int a=200; int b=200; System.out.println(a==b); //true Integer c=200; Integer d=200; System.out.println(c==d); //false
5、表达式、运算符、赋值、自增/减(++x 或 x++)、比较运算符、逻辑运算符、运算符优先级、字符串运算
和C#基本一致,要注意如果右边是复杂表达式,用 *= 和 /= 时会先计算右侧表达式值(C#也一样)
int a = 12; int b = 2; a = a/b + 1; //7 System.out.println(a); a /= b+1; //2 System.out.println(a);
二、对象
和C#基本一致,连GC都一样。。。
1、类变量/方法,对应C#的静态
2、字符串方法: length() charAt() substring() indexOf()
String a="abcde"; System.out.println(a.substring(2,3)); //java得到的是c //string a = "abcde"; //Console.WriteLine(a.Substring(2, 3)); //C#得到的是cde //Console.ReadKey();
length()和indexOf()是一样的(C#对应的首字母要大写,包括Substring),C#没有charAt()
3、System.out.format(),和C#的Console.Write()差不多,参数不大一样
4、类型转换:一样
5、装箱拆箱:一样
6、对象比较:一样
7、getClass()、instanceof:像C#的反射一样
三、数组、逻辑、循环
1、数组:Java可以string a[]; C#不能这样
2、块语句,可以定义一个作用域
int x = 1; { int y = x+2; } System.out.println(y); //找不到y //Console.WriteLine(y); C#也一样
3、if/else:一样,在if中定义的变量,外层是访问不到的,C#也一样,但js是可以的
if(true){ var x=1; } console.log(x)
4、switch:一样
5、三目运算符:一样
6、for:一样。 for里面的int i,在外面是访问不到的,C#也一样,但是js是可以的,且i是变成跳出循环时那个自增到最大的值
7、while/do while:一样
8、continue/break:
int x = 0; out: for (int i = 0; i < 10; i++) { while (x < 50) { x++; // break; //x为10 break out; //x为1 } } System.out.println(x);
C#没有out:这种用法,可以使用goto,可加个bool flag,在循环中赋值和判断
四、创建类和方法
1、定义类
一个文件中只能有一个public类,并且此public类必须与文件名相同(C#无此限制)
private,私有的访问权限,也是最严格的访问权限,仅只能在设置了该权限的类中访问,利用这个访问权限,表现出封装思想。 default,默认的访问权限,也是可以省略的访问权限,它不仅能在设置了该权限的类中访问,也可以在同一包中的类或子类中访问。 protected,受保护的访问权限,它除了具有default的访问权限外,还可以在不同包中所继承的子类访问。 public,公有的访问权限,也是最宽松的访问权限,不仅可以是同一个类或子类,还是同一个包中的类或子类,又还是不同包中的类或子类,都可以访问。
其它差不多,就是default默认权限,什么都不加就是default,但不能显式地加上default,没这个关键字
2、类继承 java使用extends,C#使用冒号
3、方法:一样
4、this:一样,类方法(相当于C#的静态方法)不能使用this
5、变量作用域:一样
6、参数传递方法:一样,如果是传递对象引用的话,会修改原对象
7、类方法:一样,不能实例化,不能继承
8、控制台main方法
public static void main(String[] args) {} //Java不能省
static void Main(){} //C#可以省略一些
9、方法重载:一样
10、构造函数:看上去差不多
11、覆盖方法:使用super.来调用超类里的方法(对应C#是使用base.)
void checkTemperature(int x) { super.checkTemperature("abc"); }
12、覆盖构造函数
对于super()的用法,Java指定了特殊的规则:它必须是构造函数定义中的第一条语句。如果构造函数没有显式地调用super(),Java将自动调用:使用不带参数的super()
五、包、接口、其它类对象
1、限定符:多个使用时顺序无所谓,有个final,和C#的const(或readonly)差不多,指只读
2、默认变量/方法:试了一下,Java是默认default(但没有这种关键字),C#是默认private
3、 继承:没有显式声明的(default),子类可以更严格,有显式声明的,子类只能更宽松
4、属性存取器:和C#有所区别(C#经过简化了,原始写法也差不多)
private int a; //public int A { get; set; } //C# public void setA(int a) { this.a = a; }
5、抽象类:和C#一样,一个方法抽象了,整个类必须抽象。如果抽象类中只有抽象方法,相当于接口
6、包:import(对应C#的using),和C/C++的#include不同,Java和C#只是告诉编译器引用地址,像语法糖一样
还可以import static,C#直到5.0还是6.0才有这特性,不知Java是从哪个版本开始支持的
类名冲突后要显示引用全,C#也是这样
一般包名是把域名反过来
Java的包和C#的程序集很像
7、接口
使用extends继承(C#是冒号),使用implements实现(C#不用)
接口里面方法,如果没有显式声明,会自动转成公共、抽象。方法没有方法体(没有一对大括号)
接口本身必须公有或包保护,但如果没有显式声明,不会自动转换
继承多个接口时,如果参数相同返回值不同也会编译错误
8、内部类:差不多
六、异常和线程
1、异常:一样
2、在方法中显式提醒throws,但只是提示,实际并不抛出指定异常,而是根据实际情况抛出。
而且一旦在方法声明中显式指明throws,就必须在调用时try/catch,但实际发生的异常可能不是声明的异常。
public static void main(String[] args) { VolcanoRobot vol = new VolcanoRobot(); try { vol.method(); } catch (IOException e) { e.printStackTrace(); //java.lang.NumberFormatException } } public void method() throws IOException { throw new NumberFormatException(); }
public class VolcanoRobot { public static void main(String[] args) { VolcanoRobot vol = new VolcanoRobot(); vol.method(); } public void method() throws NumberFormatException { try { String a = null; String b = a.toString(); } catch (Exception e) { System.out.println(e); //java.lang.NullPointerException } } }
public static void main(String[] args) { VolcanoRobot vol = new VolcanoRobot(); vol.method(); // java.lang.NumberFormatException } public void method() { throw new NumberFormatException(); } //try{ // String a=null; // String b=a.ToString(); //} //catch(Exception e){ // throw new IOException(); //“System.IO.IOException”类型的未经处理的异常在 ConsoleApplication.exe 中发生 //}
都可以手动抛出异常
3、异常继承(但子类不能引发其超类方法未引发的checked异常)
class RadioPlayer { public void startPlaying() throws IOException { } } class StereoPlayer extends RadioPlayer { public void startPlaying() { } }
4、线程:start() / stop() ,和C#差不多,但要增加一个异常判断,
public static void main(String[] args) throws InterruptedException { Thread.sleep(1000); System.out.println("test"); } void test(){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }