欢迎来到CloudService文涵的博客

人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

Java:基础语法

注释

平时我们编写代码,在代码量比较少的时候,我们还可以看懂自己写的,但是当项目结构一旦复杂起来,我们就需要用到一个注释了,注释就类似于我们上学时候写的笔记,我们看着笔记就知道自己写的什么东西了!在程序中也是如此。我们来看一下Java中的注释怎么写,看以下代码:

/*
* @Description HelloWorld类
* @Author Diamond 
**/
public class HelloWorld {
  /*
    这是我们Java程序的主入口,
    main方法也是程序的主线程。
  */
  public static void main(String[] args) {
    //输出HelloWorld!
    System.out.println("Hello,World!");
 }
}

注释并不会被执行,是给我们写代码的人看的,书写注释是一个非常好的习惯,在很多大公司都是强制要求各位去进行编写注释!比如,我们的BAT三大巨头等等。。。

Java中的注释有三种:
单行注释:只能注释当前行,以//开始,直到行结束

//输出HelloWorld!

多行注释:注释一段文字,以/开始, /结束!

/*
  这是我们Java程序的主入口,
  main方法也是程序的主线程。
*/

文档注释:用于生产API文档,配合JavaDoc。
【注】文档注释我们现在只作为了解,在学习JavaDoc时候我们会详细给大家说,目前知道有这样的注释就好。

/*
 * @Description HelloWorld类
 * @Author Diamond 
 **/

【建议】平时写代码一定要注意注释的规范性,一个好的程序员,一定是有非常良好的编码习惯的,我希望大家能够从小事开始锻炼自己的行为习惯!

标识符

每个人从出生开始就有一个名字,咋们生活中的所有事物也都有名字,这名字是谁规定呢?回答是:造物主,谁生产出来的谁规定名字,在我们的程序中也不例外。

我们作为造物主,需要给所有的东西给上一个名字,比如我们的HelloWorld程序:

HelloWorld是类名,也是我们的文件名。它前面的 public class是关键字,不过是搞Java那群人已经定义好的有特殊作用的,下面的每一个代码都有自己的意思和名字对吧,就是用来作区分!和我们的名字一样,拿来被叫或者称呼的,程序一切都源自于生活,一定要把学程序和生活中的一切联系起来,你会发现这一切都是息息相关的。

image

我们来看看有哪些是Java自己定义好的关键字呢?

image

这些看起来非常的多,但是随着我们以后的学习我们都会用到,所以完全不用担心自己 看不懂,这些被Java已经规定的关键字,我们自己就不能拿它当做名字了!

Java 所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。

我们自己起名字有哪些要求呢?

表示类名的标识符用大写字母开始。

如:Man, GoodMan

表示方法和变量的标识符用小写字母开始,后面的描述性词以大写开始。

如:eat(),eatFood()
//驼峰命名法

关于Java标识符,有以下几点需要注意:

  • 所有的标识符都应该以字母(A-Z 或者 a-z),美元符($)、或者下划线(_)开始

  • 首字符之后可以是字母(A-Z 或者 a-z),美元符($)、下划线(_)或数字的任何字符组合

  • 不能使用关键字作为变量名或方法名。

  • 标识符是大小写敏感的

  • 合法标识符举例:age、$salary、_value、__1_value

  • 非法标识符举例:123abc、-salary、#abc

【JAVA不采用通常语言使用的ASCII字符集,而是采用unicode这样的标准的国际字符集。因此,这里的字母的含义:可以表示英文、汉字等等。】

【可以使用中文命名,但是一般不建议这样去使用,也不建议使用拼音,很Low】

public static void main(String[] args) {
  String 王者荣耀 = "最强王者";
  System.out.println(王者荣耀);
}

课外扩展:各种字符集和编码详解

数据类型

Java是一种强类型语言,每个变量都必须声明其类型。

1、强弱类型语言

说到强类型语言,那什么是强类型语言呢?

强类型语言也称为强类型定义语言。要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用。

Java、.NET、C++等都是强制类型定义的。也就是说,一旦一个变量被指定了某个数据类型,如果
不经过转换,那么它就永远是这个数据类型了。

安全性高,运行效率相对较慢,鱼和熊掌不可兼得!强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。

与其相对应的是弱类型语言。

弱类型语言也称为弱类型定义语言。与强类型定义相反。像vb,php等就属于弱类型语言·

在VBScript中,可以将字符串‘12’和整数3进行连接得到字符串‘123’,也可以把它看成整数123,而不需要显示转换。是不是十分的随便,我们Java就不是这样的。

但其实它们的类型没有改变,VB只是在判断出一个表达式含有不同类型的变量之后,自动在这些变
量前加了一个clong()或(int)()这样的转换函数而已。能做到这一点其实是归功于VB的编译器的智能化而已,这并非是VB语言本身的长处或短处。

好了,到这里,我们应该对强弱类型语言有了一定的了解!我们继续回到数据类型这个话题.

2、数据类型

Java的数据类型分为两大类:基本类型(primitive type)和引用类型 (reference type)

image

【注:引用数据类型的大小统一为4个字节,记录的是其引用对象的地址!】

image

如果你看到这一堆头疼的话,没关系,不用记,JDK中类型对应的包装类都帮忙写好了,我们需要时候可以直接看到!可以把以下代码拷贝进行查看结果:

public static void main(String[] args) { 
  // byte 
  System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE); 
  System.out.println("包装类:java.lang.Byte"); 
  System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE); 
  System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE); 
  System.out.println(); 
  // short 
  System.out.println("基本类型:short 二进制位数:" + Short.SIZE); 
  System.out.println("包装类:java.lang.Short"); 
  System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE); 
  System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE); 
  System.out.println(); 
  // int 
  System.out.println("基本类型:int 二进制位数:" + Integer.SIZE); 
  System.out.println("包装类:java.lang.Integer"); 
  System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE); 
  System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE); 
  System.out.println(); 
  // long 
  System.out.println("基本类型:long 二进制位数:" + Long.SIZE); 
  System.out.println("包装类:java.lang.Long"); 
  System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE); 
  System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE); 
  System.out.println(); 
  // float 
  System.out.println("基本类型:float 二进制位数:" + Float.SIZE); 
  System.out.println("包装类:java.lang.Float"); 
  System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE); 
  System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE); 
  System.out.println(); 
  // double 
  System.out.println("基本类型:double 二进制位数:" + Double.SIZE); 
  System.out.println("包装类:java.lang.Double"); 
  System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE); 
  System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE); 
  System.out.println(); 
  // char 
  System.out.println("基本类型:char 二进制位数:" + Character.SIZE); 
  System.out.println("包装类:java.lang.Character"); 
  // 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台 
  System.out.println("最小值:Character.MIN_VALUE=" 
           + (int) Character.MIN_VALUE); 
  // 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台 
  System.out.println("最大值:Character.MAX_VALUE=" 
           + (int) Character.MAX_VALUE); 
} 

如果你是热爱学习的人,你现在应该非常想知道这字节到底是什么东西,所以我给大家科普一下相关知识:

/*
  位(bit):是计算机 内部数据 储存的最小单位,11001100是一个八位二进制数。
  字节(byte):是计算机中 数据处理 的基本单位,习惯上用大写 B 来表示,
    1B(byte,字节)= 8bit(位)
  字符:是指计算机中使用的字母、数字、字和符号
 
  ASCIIS码:
    1个英文字母(不分大小写)= 1个字节的空间
    1个中文汉字 = 2个字节的空间
    1个ASCII码 = 一个字节
  UTF-8编码:
    1个英文字符 = 1个字节
    英文标点 = 1个字节
    1个中文(含繁体) = 3个字节
    中文标点 = 3个字节
  Unicode编码:
    1个英文字符 = 2个字节
    英文标点 = 2个字节
    1个中文(含繁体) = 2个字节
    中文标点 = 2个字节
   
  1bit表示1位,
  1Byte表示一个字节 1B=8b。
  1024B=1KB
  1024KB=1M
  1024M=1G.
*/

那有人会问:电脑的32位和64位的区别是什么呢?

/*
  32位操作系统只可以使用32位的cpu,而64位的CPU既可以安装32位操作系统也可以安装64位操作
系统。
  寻址能力简单点说就是支持的内存大小能力,64位系统最多可以支达128 GB的内存,而32位系统最
多只可以支持4G内存。
  32位操作系统只可以安装使用32位架构设计的软件,而64位的CPU既可以安装使用32位软件也可以
安装使用64位软件。
  现在的电脑都是64位了!
*/

【好了,回到正题,我们了解了这些知识后,我们自己定义一些变量来看!】

public static void main(String[] args) {
  //整型
  int i1=100;
  //长整型
  long i2=998877665544332211L;
  //短整型
  short i3=235;
  //浮点型
  double d1=3.5;  //双精度
  double d2=3;
  float f1=(float)3.5;  //单精度
  float f2=3.5f;  //单精度
  //布尔类型 boolean true真/false假
  boolean isPass=true;
  boolean isOk=false;
  boolean isBig=5>8;
  if(isPass){
    System.out.println("通过了");
 }else{
    System.out.println("未通过");
 }
  //单字符
  char f='女';
  char m='男';
}

【Java语言的整型常数默认为int型,浮点数默认是Double】

3、整型拓展

在我们计算机中存在很多进制问题,十进制,八进制,十六进制等等的问题,他们怎么表示呢?

十进制整数,如:99, -500, 0。

八进制整数,要求以 0 开头,如:015。

十六进制数,要求 0x 或 0X 开头,如:0x15 。

演示:

//整型
int i=10;
int i2=010;
int i3=0x10;
System.out.println(i); //10
System.out.println(i2); //8
System.out.println(i3); //16

4、浮点型拓展

【金融面试问:银行金融业务用什么类型表示?】

浮点类型float, double的数据不适合在不容许舍入误差的金融计算领域。
如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类。

public static void main(String[] args) {
  float f = 0.1f;
  double d = 1.0/10;
  System.out.println(f==d);  //false
  float d1 = 2131231231f;
  float d2 = d1+1;
  if(d1==d2){
    System.out.println("d1==d2");
 }else{
    System.out.println("d1!=d2");
 }
}

主要理由:

由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。浮点数一般都存在舍入误差,很多数字无法精确表示,其结果只能是接近,但不等于;二进制浮点数不能精确的0.1,0.01,0.001这样10的负次幂。并不是所有的小数都能可以精确的用二进制浮点数表示。

最好完全避免使用浮点数比较!

大数值:Java.math下面的两个有用的类:BigInteger和BigDecimal,这两个类可以处理任意长度的数值。BigInteger实现了任意精度的整数运算。BigDecimal实现了任意精度的浮点运算。

浮点数使用总结:

  1. 默认是double
  2. 浮点数存在舍入误差,很多数字不能精确表示。如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类。
  3. 避免比较中使用浮点数

5、字符型拓展

单引号用来表示字符常量。例如‘A’是一个字符,它与“A”是不同的,“A”表示一个字符串。

char 类型用来表示在Unicode编码表中的字符。.

Unicode编码被设计用来处理各种语言的所有文字,它占2个字节,可允许有65536个字符;

【科普:2字节=16位 2的16次方=65536,我们用的Excel原来就只有这么多行,并不是无限的】

【代码演示:字符转int看结果】

public static void main(String[] args) {
  char c1 = 'a';
  char c2 = '中';
  System.out.println(c1);
  System.out.println((int) c1);  //97
  System.out.println(c2);
  System.out.println((int) c2);  //20013
}

Unicode具有从0到65535之间的编码,他们通常用从’u0000’到’uFFFF’之间的十六进制值来表示(前缀为u表示Unicode)

char c3 = '\u0061';
System.out.println(c3);  //a

Java 语言中还允许使用转义字符 ‘’ 来将其后的字符转变为其它的含义,有如下常用转义字符:

image

【以后我们学的String类,其实是字符序列(char sequence)。在这里给大家一个思考题】

//代码1
String sa=new String("Hello world");      
String sb=new String("Hello world");   
System.out.println(sa==sb);  // false  
//代码2
String sc="Hello world";  
String sd="Hello world"; 
System.out.println(sc==sd);  // true

大家可以先思考下为什么,之后我们学到对象的时候,会给大家进行内存级别的分析,那时候你会恍然大悟!

6、布尔型拓展

boolean类型(一位,不是一个字节),就是0|1

boolean类型有两个值,true和false,不可以 0 或非 0 的整数替代 true 和 false ,这点和C语言不同。

boolean 类型用来判断逻辑条件,一般用于程序流程控制。

boolean flag = false;
if(flag){
 // true分支
}else{
 // false分支
}

【编码规范:很多新手程序员喜欢这样写】

if (is == true && un == false ) {...}

只有新手才那么写。对于一个熟练的人来说,应该用如下方式来表示:

if ( is && !un ) {....} 

这点都不难理解吧。所以要习惯去掉所有的==fasle 和 ==true。Less is More!! 代码要精简易读!

类型转换

由于Java是强类型语言,所以要进行有些运算的时候的,需要用到类型转换。

整型、实型(常量)、字符型数据可以混合运算。

运算中,不同类型的数据先转化为同一类型,然后进行运算。

转换从低级到高级(根据容量来看)。

低  ------------------------------------>  高
byte,short,char—> int —> long—> float —> double

数据类型转换必须满足如下规则:

  • 不能对boolean类型进行类型转换。
  • 不能把对象类型转换成不相关类的对象。
  • 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
  • 转换过程中可能导致溢出或损失精度,例如:
int i =128; 
byte b = (byte)i;

因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。

  • 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:
(int)23.7 == 23;    
(int)-45.89f == -45

1、自动类型转换

自动类型转换:容量小的数据类型可以自动转换为容量大的数据类型。

例如: short数据类型的位数为16位,就可以自动转换位数为32的int类型,同样float数据类型的位数为32,可以自动转换为64位的double类型。
【演示】

public class ZiDongLeiZhuan{
  public static void main(String[] args){
    char c1='a';//定义一个char类型
    int i1 = c1;//char自动类型转换为int
    System.out.println("char自动类型转换为int后的值等于"+i1);
    char c2 = 'A';//定义一个char类型
    int i2 = c2+1;//char 类型和 int 类型计算
    System.out.println("char类型和int计算后的值等于"+i2);
 }
}

【解析:c1 的值为字符 a ,查 ASCII 码表可知对应的 int 类型值为 97, A 对应值为 65,所以i2=65+1=66。】

2、强制类型转换

强制类型转换,又被称为造型,用于显式的转换一个数值的类型.

在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。

强制类型转换的语法格式: (type)var,运算符“()”中的type表示将值var想要转换成的目标数据类型。 条件是转换的数据类型必须是兼容的。

【演示】

public static void main(String[] args) {
  double x  = 3.14;
  int nx = (int)x;  //值为3
  char c = 'a';
  int d = c+1;
  System.out.println(d); //98
  System.out.println((char)d);  //b
}
public static void main(String[] args) {
  int x = 300;
  byte bx = (byte)x;   //值为44
  System.out.println(bx);
}

3、常见错误和问题

1.操作比较大的数时,要留意是否溢出,尤其是整数操作时;

public static void main(String[] args) {
  int money = 1000000000;  //10亿
  int years = 20;
  int total = money*years;  //返回的是负数
  long total1 = money*years;  //返回的仍然是负数。默认是int,因此结果会转成int值,再转成long。但是已经发生了数据丢失
  long total2 = money*((long)years);  //先将一个因子变成long,整个表达式发生提升。全部用long来计算。
  System.out.println(total);
  System.out.println(total1);
  System.out.println(total2);
}

2.L和l 的问题:

  • 不要命名名字为l的变量

  • long类型使用大写L不要用小写。

public static void main(String[] args) {
  int l = 2;
  long a = 23451l;
  System.out.println(l+1); //3
  System.out.println(a);  //23451
}

4、JDK7扩展

JDK7新特性: 二进制整数

由于我们在开发中也经常使用二进制整数,因此JDK7为我们直接提供了二进制整数的类型。

我们只要以:0b开头即可。

int a = 0b0101:

JDK7新特性:下划线分隔符

在实际开发和学习中,如果遇到特别长的数字,读懂它令人头疼!JDK7为我们提供了下划线分隔符,可以按照自己的习惯进行分割。

int b = 1_2234_5678;

我们很容易就知道这是1亿2234万5678啦! 非常符合国人的习惯!

public static void main(String[] args) {
  int a = 0b0101;
  int b = 1_2345_7893;
  System.out.println(a);  //5
  System.out.println(b);  //123457893
}
posted on 2024-03-03 20:12  Cloudservice  阅读(41)  评论(0编辑  收藏  举报