美其名曰软构笔记4?!最近课翘得厉害。。。别问我怎么跑到Java这儿来了,既然写了那就希望能和C/C++联系着写。分方向可能要挑软工,因为我相中它大四没课了,想想就开心,没有课程的压力,我就可以四处流浪了~ 当然了我还是主攻cpp
正文开始@一个人的乐队
1. 初识Java中的main函数Java是一门半编译型、半解释型语言。
- 先通过Javac(Java Compiler)把源文件进行编译,编译后生成的**.class文件是由字节码组成的与平台无关、面向JVM的文件(“一次编译,到处运行”**,是一门跨平台语言)。
- 最后启动Java虚拟机来运行.class文件,此时JVM会将字节码转换成平台能够理解的形式来运行。
public class Test {
public static void main(String[] args) {
System.out.println("hello Java");
}
}
-
若这个类是public修饰的,类名要与文件名儿一致。
-
不是一个文件对应一个字节码.class文件,而是一个类对应一个字节码文件(我们一般一个文件放一个类)。好处是用到哪个类就去加载哪个类,而不是一股脑都加载。
-
关于JDK、JRE、JVM
-
注:javac 编译时默认是以GBK格式编译的,但是文件是以utf-8编辑的。因此含中文时编译时要带上
javac -encoding utf-8 文件名.java
关于Java中main函数本身:
- 在C语言中我们就知道main函数是可以带参数的(其实我也是在Linux的学习中才深刻认识到),传入的是命令行参数。那这儿的String[] args也一样,就是存放运行时命令行参数的数组。
- 关于类,方法,访问修饰限定符,没啥好说的~
和C/C++有很多相似之处,又有很多区别,看着Java这些看似琐碎又严密的东西,我时而懒得写了,时而又发现它们很有意义,到底还是都写了。
类型的意义之一在于所占空间大小。
2.1 整型 2.1.1 int类型-
Java中的int 一个变量占4byte,与操作系统无关,可移植性强。
-
Java中的int都是有符号的,没有所谓的无符号类型。
-
取值范围:[-231,231-1] = [-2,147,483,648,2,147,483,647]
System.out.println(Integer.MAX_VALUE); System.out.println(Integer.MIN_VALUE); //执行结果 2147483647 -2147483648
Integer:包装类
- Java比较安全,如果不初始化就使用会报错。
如果运算的结果超出了 int 的最大范围,,就会出现溢出的情况。21亿这样的数字对于当前的大数据时代来说,是很容易超出的。针对这种情况,Java 中提供了long类型。
System.out.println(Long.MAX_VALUE); System.out.println(Long.MIN_VALUE); //执行结果 9223372036854775807 -9223372036854775808
- 初始化设定的值为10L,表示一个长整型的数字。10l也可以,但容易误解不推荐。
- 使用10初始化long类型也可以,但10的类型是int,使用10L/10l更好一些。
long num = 10L; // 定义一个长整型变量 System.out.println(num);2.2 浮点型 2.2.1 double类型
神奇代码
double num = 1.1;
System.out.println(num * num)
// 执行结果
1.2100000000000002
因为Java的double类型的内存布局遵守IEEE 754标准(和C语言一样),尝试使用有限的内存空间表示可能无限的小数,向偶数舍入势必会存在一定的精度损失。
2.2.2 float类型错误示范,请勿模仿 ——
C语言是弱类型语言,把double给float只会报一个警报;而Java是强类型语言,2.5默认是double类型,类型不匹配一定会报错。
因此,定义float类型给它赋值时要加f
float num = 1.0f; // 写作1.0F也可以 System.out.println(num);2.3 字符类型
计算机中的字符本质上是一个整数:在 C 语言中使用 ASCII 表示字符;而 Java 中使用 Unicode 表示字符,因此一个字符占用两个字节,表示的字符种类更多,包括中文。
char ch = '呵'; //两个字节 System.out.println(ch);
注:编译时要带选项
javac -encoding UTF-8 Test.java2.4 byte类型
字节类型表示的也是整型,只占一个字节,表示范围[-128,127]。字节类型和字符类型互不相干。
byte b = 10; System.out.println(b); //10
注意:在Java中这些数值类型,都是有表示范围的,若存储数据超过表示范围,会直接报错。在C/C++中,并不会报错,而是悄默声儿的发生溢出。在Java中没有sizeof计算类型大小,因为就是这样儿的。
2.5 short类型短整型,short占用2个字节,表示范围是[-32768,32767],这个表示范围比较小,一般不推荐使用。
2.5 boolean-
boolean类型的变量只有两种取值:true表示真,false表示假。
-
Java不存在1表示true,0表示false这样的用法。boolean 类型和 int 不能相互转换。
-
boolean类型的大小:有些 JVM的规范中并没有规定,有些占1 个字节,有些是占1个比特位。
众所周知,C语言没有字符串类型,C++的STL中提供了string类。在Java中,String也不是基本类型,而是引用类型(后面重点解释,像是C++中的基本类型和自定义类型)。
Java中分为 ——
- 数值类型(基本数据类型8种)
- 整数:byte, short, int, long
- 浮点数:double, float
- 字符:char
- 布尔:boolean
- 引用类型
- String,数组,类,接口,枚举…
关于字符串+拼接,学过C++的宝子们都明白为什么后两行相似而不相同的,尤其在我们模拟实现了string类的运算符重载。
System.out.println("hey! "+"have a nice day!");//hey! have a nice day!
System.out.println("add"+10+20); //add1020
System.out.println(10+20+"add"); //30add
字符串中的一些特定的不太方便直接表示的字符需要进行转义
System.out.println(""shit."she said"); //"shit."she said
| 转义字符 | |
|---|---|
| n | 换行 |
| t | 水平制表符 |
| ’ | 单引号 |
| " | 双引号 |
| \ | 反斜杠 |
-
变量:程序运行时可以改变的量
-
常量:程序运行时不可修改,在程序编译时就已经确定其值了。
-
字面值常量
-
final关键字修饰的常量
-
4. 理解类型转化-
Java 作为一个强类型编程语言,当不同类型之间的变量相互赋值的时候,会有教严格的校验:不同数字类型的变量之间赋值,表示范围较小的类型能隐式转换成范围较大的类型。而在C语言,就会悄悄地发生截断精度损失了。
-
当然了,你可以强转,但是有风险的,可能损失精度。当然了,强转只能发生在相似类型之间,对于int和boolen这种毫不搭嘎的类型不可以。
-
将一个字面值常量进行赋值的时候,Java 会自动针对数字范围进行检查。而C/C++可能就不报错,悄悄的溢出惊艳所有人。
byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c);
// 编译报错
Test.java:5: 错误: 不兼容的类型: 从int转换到byte可能会有损失
byte c = a + b;
^
为了高效率,计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据,为了硬件上实现方便 ——
- 对于小于4byte的类型(byte/short),会先提升为int类型再运算。
- 不同类型的数据混合运算,范围小的会提升成范围大的。
其实这么简单的地方我还写这么细,我都觉得太花我时间了,因为我还是主攻cpp,但是没办法,性格使然,“你见到istj时从来都是稳扎稳打”,唉,我再悄默声儿的说一句Java课件做的真棒!对我这个高Si的人很友好,当然了cpp的也越写越棒了~



