Java突击学习 Day2 Part1

只睡了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();
        }
    }
原文地址:https://www.cnblogs.com/liuyouying/p/5079468.html