随心所欲不逾矩
1. 第一个 Java 程序
简略的 Java 程序,它将输出字符串 Hello World
public class HelloWorld {
/* 第一个Java程序
* 它将输出字符串 Hello World
*/
public static void main(String[] args) {
// 输出 Hello World
System.out.println("Hello World");
}
}
2. Java 关键字与保留字
界说:被 Java 言语赋予了特别含义,用做专门用途的字符串。
特点:关键字中一切字母都是小写,Java 关键字,这些关键字不能用于常量,变量,和任何标识符称号。官网地址
下面列出了 Java 关键字。这些保留字不能用于常量、变量、和任何标识符的称号。摘自菜鸟教程
类别 | 关键字 | 阐明 |
---|---|---|
访问操控 | private | 私有的 |
protected | 受维护的 | |
public | 公共的 | |
default | 默许 | |
类、办法和变量润饰符 | abstract | 声明抽象 |
class | 类 | |
extends | 扩大,承继 | |
final | 最终值,不行改变的 | |
implements | 完成(接口) | |
interface | 接口 | |
native | 本地,原生办法(非 Java 完成) | |
new | 新,创建 | |
static | 静态 | |
strictfp | 严格,精准 | |
synchronized | 线程,同步 | |
transient | 短暂 | |
volatile | 易失 | |
程序操控句子 | break | 跳出循环 |
case | 界说一个值以供 switch 挑选 | |
continue | 持续 | |
default | 默许 | |
do | 运转 | |
else | 不然 | |
for | 循环 | |
if | 假如 | |
instanceof | 实例 | |
return | 返回 | |
switch | 依据值挑选履行 | |
while | 循环 | |
过错处理 | assert | 断语表达式是否为真 |
catch | 捕捉反常 | |
finally | 有没有反常都履行 | |
throw | 抛出一个反常目标 | |
throws | 声明一个反常可能被抛出 | |
try | 捕获反常 | |
包相关 | import | 引入 |
package | 包 | |
根本类型 | boolean | 布尔型 |
byte | 字节型 | |
char | 字符型 | |
double | 双精度浮点 | |
float | 单精度浮点 | |
int | 整型 | |
long | 长整型 | |
short | 短整型 | |
变量引证 | super | 父类,超类 |
this | 本类 | |
void | 无返回值 | |
保留关键字 | goto | 是关键字,但不能运用 |
const | 是关键字,但不能运用 |
注:Java 的 null
不是关键字,相似于 true
和 false
,它是一个字面常量,不答应作为标识符运用。
3. Java 标识符
3.1 标识符阐明
Java 一切的组成部分都需求姓名。类名,变量名以及办法名都被称为标识符 (自己能够起姓名的地方都叫标识符)
3.2 标识符命名规矩
关于 Java 标识符,有以下几点需求注意
- 一切的标识符都应该以字母(A-Z 或许 a-z),美元符($)、或许下划线(_)开端
- 首字符之后能够是字母(A-Z 或许 a-z),美元符($)、下划线(_)或数字的任何字符组合
- 关键字不能用作标识符
- 标识符是巨细写灵敏的
- 合法标识符举例:age、$salary、_value、__1_value
- 不合法标识符举例:123abc、-salary
3.3 Java 中的称号命名规范
- 巨细写灵敏
- 包名:多单词组成时一切字母都小写:xxxyyyzzz
- 类名、接口名:多单词组成时,一切单词的首字母大写:MyFirstJavaClass 大驼峰
- 变量名、办法名:多单词组成时,第一个单词首字母小写,第二个单词开端每个单词首字母大写:xxxYyyZzz
- 常量名:一切字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
注:
- 源文件称号有必要和类名相同。当保存文件的时分,应该运用类名作为文件名保存,假如文件名和类名不相同则会编译过错。
- 在起姓名时,为了提高阅读性,要尽量有意义,“见名知意”。
- Java 选用 unicode 字符集,因而标识符也能够运用汉字声明,可是不建议运用。
4. Java 变量
4.1 变量
变量的概念:
- 内存中的一个存储区域
- 该区域有自己的称号(变量名)和类型(数据类型)和值
- Java 中的每个变量有必要先声名,再赋值,然后才能运用
- 该区域的数据能够再同一类型规模内不断改变
- Java 中的变量有四种根本特点:变量名,数据类型,存储单元跟变量值
Java 言语支持的变量类型:
- 类变量:独立于办法之外的变量,用 static 润饰
- 实例变量:独立与办法之外的变量,不必 static 润饰
- 局部变量:类的办法中的变量
注:这儿后期具体弥补
5. 数据类型
5.1 整数类型
byte、short、int、long
类型 | 占用存储空间 | 表数规模 |
---|---|---|
byte | 1字节=8bit位 | -128 ~ 127 |
short | 2字节 | -2^15~ 2^15-1 |
int | 4字节 | -2^31~ 2^31-1 (约21亿) |
long | 8字节 | -2^63~ 2^63-1 |
注:声明 long 类型常量需求再后边加 “L” / “l”
5.2 浮点类型
float、double
类型 | 占用存储空间 | 表数规模 |
---|---|---|
单精度float | 4字节 | -3.403E38 ~ 3.403E38 |
双精度double | 8字节 | -1.798E308 ~ 1.798E308 |
注:Java 的浮点型常量默许为 double 类型,声明 float 类型常量需求在后边加”F” / “f”
事例:圆的面积
界说圆周率并赋值为3.14,现有3个圆的半径别离为1.2、2.5、6,求它们的面积
/**
* 圆的面积
*
* @Author myf15609
* @Date 2023/4/2
*/
public class Exercise1 {
public static void main(String[] args) {
double PI = 3.14;
double radius1 = 1.2;
double radius2 = 2.5;
int radius3 = 6;
System.out.println("第一个圆的面积:" + PI * radius1 * radius1);
System.out.println("第二个圆的面积:" + PI * radius2 * radius2);
System.out.println("第三个圆的面积:" + PI * radius3 * radius3);
}
}
/*
第一个圆的面积:4.521599999999999
第二个圆的面积:19.625
第三个圆的面积:113.03999999999999
*/
事例:温度转化
小明要到美国旅行,可是那里的温度是以华氏度为单位记载的。 它需求一个程序将华氏温度(80度)转化为摄氏度,并以华氏度和摄氏度为单位别离显示该温度
/**
* 温度转化
*
* @Author myf15609
* @Date 2023/4/2
*/
public class Exercise2 {
public static void main(String[] args) {
double hua = 80;
double she = (hua - 32) / 1.8;
System.out.println("华氏度" + hua + "℉转为摄氏度是" + she + "℃"); // 华氏度80.0℉转为摄氏度是26.666666666666664℃
}
}
5.3 字符型
char 2个字节
- char 类型是一个单一的 16 位 Unicode 字符
- 最大值是 u0000(十进制等效值为 0)、最大值是 uffff(即为 65535)
- char 数据类型能够存储任何字符,char 类型是能够进行运算的,因为都是对应的 Unicode 码
- 能够运用转义字符 ” 来将这以后的字符转变为特别字符型常量
- 例如:char c1 = ‘1’、char c2 = ‘中’、char c3 = ‘u0234’;
class VariableTest3 {
public static void main(String[] args) {
double d1 = 12.3;
System.out.println(d1 + 1);
float f1 = 12.5F;
System.out.println(f1);
char c1 = 'a';
System.out.println(c1);
char c2 = 'n';
System.out.println("hello" + c2);
char c3 = 't';
System.out.println(c3 + "world");
char c4 = 'u0043';
System.out.println(c4);
}
}
5.4 布尔类型
Boolean
- Boolean 类型用来判别逻辑条件,一般用于程序流程操控
- Boolean 类型数据值答应:true、false、不行运用 0 或非0的整数代替 false 或 true ,这点和 C 言语不同
- Java 虚拟机中没有使命供 Boolean 值专用的字节码指令,Java 言语表达式所操作的 Boolean 值,在编译之后都运用 Java 虚拟机中的 int 数据类型来代替,true 用 1 表明,false 用 0 表明
class VariableTest2 {
public static void main(String[] args) {
boolean isb1 = true;
if(isb1) {
System.out.println("制止入内");
}else{
System.out.println("能够观赏");
}
}
}
5.5 Java 常量
常量在程序运转时是不能被修改的
在 Java 中运用 final 关键字来润饰常量,声明方法和变量相似,尽管常量名也也能够用小写,可是为了便于设别,通常运用大写字母表明常量。
final double PI = 3.1415926;
Java 言语支持一些特别的转义字符序列
符号 | 字符含义 |
---|---|
n | 换行 (0x0a) |
r | 回车 (0x0d) |
f | 换页符(0x0c) |
b | 退格 (0x08) |
空字符 (0x0) | |
s | 空格 (0x20) |
t | 制表符 |
“ | 双引号 |
‘ | 单引号 |
\ | 反斜杠 |
ddd | 八进制字符 (ddd) |
uxxxx | 16进制Unicode字符 (xxxx) |
5.6 主动类型转化
- 主动类型转化:容量小的类型主动转为容量大的数据类型。数据类型按容量巨细排序如下
- 此刻的容量大或小,并非指占用内存空间的巨细,而是指表明数据的规模的巨细
- 有多种类型的数据混合运算时,体系首先主动将一切数据类型转为容量最大的那种数据类型,然后再进行核算
- byte,short,char 之间不会彼此转化,三者的核算首先转为 int 类型
- Boolean 类型不能和其它数据类型运算
- 当把任何根本数据类型的值和字符串(String)进行链接运算时(+),根本数据类型的值都将主动转化为字符串(String)类型
菜鸟教程说到的数据类型转化规矩
- 不能对 boolean 类型进行类型转化
- 不能把目标类型转化成不相关类的目标
- 在把容量大的类型转化为容量小的类型时有必要运用强制类型转化
- 转化过程中可能导致溢出或丢失精度
- 浮点数到整数的转化是经过舍弃小数得到,而不是四舍五入
class VariableTest4 {
public static void main(String[] args) {
byte b1 = 2;
int i1 = 129;
// byte b2 = b1 + i1;
int i2 = b1 + i1;
long l1 = b1 + i1;
float f1 = b1 + i1;
System.out.println(i2); //131
System.out.println(l1); //131
System.out.println(f1); //131.0
char c1 = 'a'; //97
int i4 = c1;
System.out.println(i4);//97
int i3 = 10;
int i5 = c1 + i3;
System.out.println(i5); // 107
}
}
注:c1 的值为字符a,查 ASCII 码表可知对应的 int 类型值为 97,所以 i5 = 97 + 10
一些特别情况
- 当把存储规模小的值(常量值、变量的值、表达式核算的成果值)赋值给了存储规模大的变量时
int i = 'A';//char主动晋级为int,其实便是把字符的编码值赋值给i变量了
double d = 10;//int主动晋级为double
long num = 1234567; //右边的整数常量值假如在int规模呢,编译和运转都能够经过,这儿涉及到数据类型转化
//byte bigB = 130;//过错,右边的整数常量值超过byte规模
long bigNum = 12345678912L;//右边的整数常量值假如超过int规模,有必要加L,显式表明long类型。不然编译不经过
- 当存储规模小的数据类型与存储规模大的数据类型变量一同混合运算时,会按照其间最大的类型运算
int i = 1;
byte b = 1;
double d = 1.0;
double sum = i + b + d;//混合运算,晋级为double
- 当byte、short、char数据类型的变量进行算术运算时,按照 int 类型处理
byte b1 = 1;
byte b2 = 2;
byte b3 = b1 + b2;// 编译报错,b1 + b2主动晋级为int
char c1 = '0';
char c2 = 'A';
int i = c1 + c2;// 至少需求运用int类型来接收
System.out.println(c1 + c2);// 113
5.7 强制类型转化
class VariableTest5 {
public static void main(String[] args) {
int i1 = 123;
byte b = (byte)i1;
System.out.println(b); // 123
}
}
5.8 隐含强制类型转化
- 整数的默许类型是 int
- 小数默许是 double 类型浮点型,在界说 float 类型时有必要在数字后边跟上 F 或许 f
5.9 字符串 String
/*
1. String 属于引证数据类型
2. 声明 String 类型变量时,运用一对 ""
3. String 能够和8种根本数据类型变量做运算,且运算只能是链接运算 +
4. 运算的成果仍然是 String 类型
*/
class VariableTest6 {
public static void main(String[] args) {
String s1 = "Hello Bike";
System.out.println(s1); // Hello Bike
int number = 1001;
String numberStr = "学号";
String info = numberStr + number;
System.out.println(info);
boolean b1 = true;
String info1 = info + b1;
System.out.println(info1); // 学号1001true
// String info2 = number + b1 + numberStr; // 编译不经过,因为 int 类型不能和 boolean 运算
}
}
事例:身份挂号
要求填写自己的姓名、年纪、性别、体重、婚姻状况(已婚用true表明,独身用false表明)、联系方法等等
/**
* @Author myf15609
* @Date 2023/6/19
*/
public class Info2 {
public static void main(String[] args) {
String name = "lanyecheng";
int age = 30;
char gender = '男';
double weight = 135.5;
boolean isMarried = true;
String phoneNumber = "177****0143";
System.out.println("name = " + name + ",age = " + age + ",gender = " + gender + ",weight = " +
weight + ",isMarried = " + isMarried + ",phoneNumber = " + phoneNumber);
}
}
5.10 引证数据类型
注:这儿后期具体弥补
6. ASCII 码、Unicode 编码、UTF-8
了解:ASCII 码
-
在核算机内部,一切数据都运用二进制表明。每一个二进制位(bit)有0 和1 两种状况,因而8个二进制位就能够组合出256 种状况,这被称为一个字节(byte)。一个字节总共能够用来表明256 种不同的状况,每一个状况对应一个符号,便是256 个符号,从0000000 到11111111。
-
ASCII码:上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了一致规矩。这被称为ASCII码。ASCII码总共规矩了128个字符的编码,比方空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的操控符号),只占用了一个字节的后边7位,最前面的1位一致规矩为0。
-
缺陷:
- 不能表明一切字符。
- 相同的编码表明的字符不一样:比方,130 在法语编码中代表了,在希伯来语编码中却代表了字母Gimel()。
了解:Unicode 编码
-
乱码:世界上存在着多种编码方法,同一个二进制数字能够被解释成不同的符号。因而,要想打开一个文本文件,就有必要知道它的编码方法,不然用过错的编码方法解读,就会呈现乱码。
-
Unicode:一种编码,将世界上一切的符号都归入其间。每一个符号都给予一个绝无仅有的编码,运用Unicode 没有乱码的问题。
-
Unicode 的缺陷:Unicode 只规矩了符号的二进制代码,却没有规矩这个二进制代码应该怎么存储:无法区别Unicode 和ASCII:核算机无法区分三个字节表明一个符号还是别离表明三个符号。别的,我们知道,英文字母只用一个字节表明就够了,假如unicode一致规矩,每个符号用三个或四个字节表明,那么每个英文字母前都必然有二到三个字节是0,这关于存储空间来说是极大的糟蹋
了解:UTF-8
- UTF-8 是在互联网上运用最广的一种 Unicode 的完成方法。
- UTF-8 是一种变长的编码方法。它能够运用 1-6 个字节表明一个符号,依据不同的符号而改变字节长度。
- UTF-8的编码规矩:
- 关于单字节的UTF-8编码,该字节的最高位为0,其他7位用来对字符进行编码(等同于ASCII码)。
- 关于多字节的UTF-8编码,假如编码包含n 个字节,那么第一个字节的前n位为1,第一个字节的第n+1 位为0,该字节的剩余各位用来对字符进行编码。在第一个字节之后的一切的字节,都是最高两位为”10″,其他6位用来对字符进行编码。
7. 进制之间的转化
-
Java整数常量默许是int类型,当用二进制界说整数时,其第32位是符号位;当是long类型时,二进制默许占64位,第64位是符号位
-
二进制的整数有如下三种方式:
- 原码:直接将一个数值换成二进制数。最高位是符号位
- 负数的反码:是对原码按位取反,只是最高位(符号位)确定为1。
- 负数的补码:其反码加1。核算机以二进制补码的方式保存一切的整数。
- 正数的原码、反码、补码都相同,负数的补码是其反码+1
为什么要运用原码、反码、补码表明方式呢?
核算机辨别“符号位”显然会让核算机的根底电路设计变得十分复杂! 所以人们想出了将符号位也参与运算的办法.
我们知道, 依据运算规律减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器能够只有加法而没有减法, 这样核算机运算的设计就更简略了
- 关于正数来讲:原码、反码、补码是相同的:三码合一。
- 核算机底层都是运用二进制表明的数值。
- 核算机底层都是运用的数值的 补码 保存数据的。
进制转化
- 二进制转成十进制乘以2的幂数
- 十进制转成二进制除以2取余数