Java学习-2.简介、关键字、标识符、变量、数据类型、运算符

发布时间 2023-07-29 17:42:51作者: highlightyys

一、Java简介

Java最早是由SUN公司(已被Oracle收购)的詹姆斯·高斯林(高司令,人称Java之父)在上个世纪90年代初开发的一种编程语言,最初被命名为Oak,目标是针对小型家电设备的嵌入式应用,结果市场没啥反响。谁料到互联网的崛起,让Oak重新焕发了生机,于是SUN公司改造了Oak,在1995年以Java的名称正式发布,原因是Oak已经被人注册了,因此SUN注册了Java这个商标。随着互联网的高速发展,Java逐渐成为最重要的网络编程语言。

随着Java的发展,SUN给Java又分出了三个不同版本:

  • Java EE:Enterprise Edition,企业版,它只是在Java SE的基础上加上了大量的API和库,以便方便开发Web应用、数据库、消息服务等,Java EE的应用使用的虚拟机和Java SE完全相同。

  • Java SE:Standard Edition,标准版,包含标准的JVM和标准库
  • Java ME:Micro Edition,它是一个针对嵌入式设备的“瘦身版”,Java SE的标准库无法在Java ME上使用,Java ME的虚拟机也是“瘦身版”。

┌───────────────────────────┐
│Java EE                    │
│    ┌────────────────────┐ │
│    │Java SE             │ │
│    │    ┌─────────────┐ │ │
│    │    │   Java ME   │ │ │
│    │    └─────────────┘ │ │
│    └────────────────────┘ │
└───────────────────────────┘

 

Java介于编译型语言和解释型语言之间。编译型语言如C、C++,代码是直接编译成机器码执行,但是不同的平台(x86、ARM等)CPU的指令集不同,因此,需要编译出每一种平台的对应机器码。解释型语言如Python、Ruby没有这个问题,可以由解释器直接加载源码然后运行,代价是运行效率太低。而Java是将代码编译成一种“字节码”,它类似于抽象的CPU指令,然后,针对不同平台编写虚拟机,不同平台的虚拟机负责加载字节码并执行,这样就实现了“一次编写,到处运行”的效果。当然,这是针对Java开发者而言。对于虚拟机,需要为每个平台分别开发。为了保证不同平台、不同公司开发的虚拟机都能正确执行Java字节码,SUN公司制定了一系列的Java虚拟机规范。从实践的角度看,JVM的兼容性做得非常好,低版本的Java字节码完全可以正常运行在高版本的JVM上。

 

JRE(Java Runtime Environment    Java运行环境):包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。

JDK(Java Development Kit    Java开发工具包):JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。所以安装了JDK,就不用在单独安装JRE了。其中的开发工具:编译工具(javac.exe)  打包工具(jar.exe)等

简单而言:使用JDK开发完成的java程序,交给JRE去运行。

二者关系如下:

  ┌─    ┌──────────────────────────────────┐
  │     │     Compiler, debugger, etc.     │
  │     └──────────────────────────────────┘
 JDK ┌─ ┌──────────────────────────────────┐
  │  │  │                                  │
  │ JRE │      JVM + Runtime Library       │
  │  │  │                                  │
  └─ └─ └──────────────────────────────────┘
        ┌───────┐┌───────┐┌───────┐┌───────┐
        │Windows││ Linux ││ macOS ││others │
        └───────┘└───────┘└───────┘└───────┘

 

Java语言特点:

  • 简单性
  • 解释性
  • 面向对象
  • 高性能
  • 分布式处理
  • 多线程
  • 健壮性
  • 动态
  • 结构中立
  • 安全性
  • 开源
  • 跨平台:通过Java语言编写的应用程序在不同的系统平台上都可以运行。原理:只要在需要运行java应用程序的操作系统上,先安装一个java虚拟机JVM即可。

 

程序解析:

  • 首先编写java源代码程序,扩展名.java
  • 在命令行模式中,输入javac命令对源代码进行编译,生成字节码文件 : javac 源文件名.java
  • 编译完成后,如果没有报错信息,输入java命令对class字节码文件进行解释运行,执行时不需要添加.class扩展名:java HelloWorld

运行原理:

一个Java源码只能定义一个public类型的class,并且class名称和文件名要完全一致;

使用javac可以将.java源码编译成.class字节码;

使用java可以运行一个已编译的Java程序,参数是类名。

 

 

二、基础语法

1.关键字和标识符

关键字:被Java语言赋予特定含义的单词
关键字特点:组成关键字的字母全部小写
关键字注意事项:goto和const作为保留字存在,目前并不使用。类似Notepad++这样的高级记事本,针对关键字有特殊的颜色标记,非常直观。

 

标识符:就是给类,接口,方法,变量等起名字时使用的字符序列。

组成规则:
  英文大小写字母
  数字字符
  $和_
注意事项:
  不能以数字开头
  不能是Java中的关键字
  区分大小写

常见命名规则:

  1. 变量名(驼峰命名法):变量的名字可大小写混用,但首字符应小写。词由大写字母分隔,限制用下划线,限制使用美元符($),因为这个字符对内部类有特殊的含义。如:inputTextSize。
  2. 包名:应该都是由一个小写单词组成。如:net.test.modules。
  3. 类名:每个单词的首字母都要大写,通常由多个单词合成一个类名。如:DataFile、InfoParser。
  4. 接口名:与类的命名一致,因为接口也是类的一种。
  5. 常量名:常量命名则前面应该是static final,后面变量的名字全部大写。如:static final MAX = 1024。常量名通常全部大写。
  6. 方法名:第一个单词应该是动词,但首字母小写,后面每个单词的首字母大写。大写字母将词分隔并限制使用下划线。方法如果有传入参数,参数的名字必须和变量的命名规范一致。使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字。

2. 注释

// 单号注释

/* */ 多行注释

/** */ 文本注释

 

3.变量和数据类型

变量概述:在程序执行的过程中,在某个范围内其值可以发生改变的量。

变量定义格式:数据类型 变量名 = 初始化值;

1:从本质上讲,变量其实是内存中的一小块区域,使用变量名来访问这块区域,因此,每一个变量使用前必须要先申请(声明),然后必须进行赋值(填充内容),才能使用。
    数据类型,变量名,变量值
2:为什么要定义变量呢
    用来不断的存放同一类型的常量,并可以重复使用

var关键字:如果想省略变量类型,可以使用var关键字。编译器会根据赋值语句自动推断出变量的类型。

定义变量时,要遵循作用域最小化原则,尽量将变量定义在尽可能小的作用域,并且,不要重复使用变量名。

 

Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同大小的内存空间。

除了上述基本类型的变量,剩下的都是引用类型。例如,引用类型最常用的就是String字符串

byte:-128 ~ 127
short: -32768 ~ 32767
int: -2147483648 ~ 2147483647
long: -9223372036854775808 ~ 9223372036854775807

Java语言对布尔类型的存储并没有做规定,因为理论上存储布尔类型只需要1 bit,但是通常JVM内部会把boolean表示为4字节整数。

整数默认:int    小数默认:double

Java 各整数类型有固定的表数范围和字段长度,其不受具体操作系统的影响,以保证Java程序的可移植性。
Java语言的整型常量默认为int型,声明long型常量可以后加‘ l ’或‘ L ’ ,如:
       int i1 = 600; //正确     long l1 = 88888888888L; //必须加l否则会出错

特别注意:整数的除法对于除数为0时运行时将报错,但编译不会报错。

整数由于存在范围限制,如果计算结果超出了范围,就会产生溢出,而溢出不会出错,却会得到一个奇怪的结果。

 

与整数类型类似,Java浮点类型有固定的表数范围和字段长度,不受平台影响。
Java 浮点类型常量有两种表示形式
      十进制数形式,如: 3.14       314.0
科学记数法形式,如 3.14e2 3.14*10^2
Java 浮点型常量默认为 double 型,如要声明一个常量为 float 型,则需在数字后面加 f 或 F ,如:
double d = 12345.6; //正确   float f = 12.3f; //必须加f否则会出错

在计算机中,浮点数虽然表示的范围大,但是,浮点数有个非常重要的特点,就是浮点数常常无法精确表示。

浮点数0.1在计算机中就无法精确表示,因为十进制的0.1换算成二进制是一个无限循环小数,很显然,无论使用float还是double,都只能存储一个0.1的近似值。但是,0.5这个浮点数又可以精确地表示。

因为浮点数常常无法精确表示,因此,浮点数运算会产生误差

需要特别注意,在一个复杂的四则运算中,两个整数的运算不会出现自动提升的情况。

double d = 1.2 + 24 / 5; // 5.2

整数运算在除数为0时会报错,而浮点数运算在除数为0时,不会报错,但会返回几个特殊值

  • NaN表示Not a Number
  • Infinity表示无穷大
  • -Infinity表示负无穷大
double d1 = 0.0 / 0; // NaN
double d2 = 1.0 / 0; // Infinity
double d3 = -1.0 / 0; // -Infinity

 

char 型数据用来表示通常意义上的“字符”
字符常量为用单引号括起来的单个字符,例如:char ch1= 'a'; char ch2='中';
Java 字符采用 Unicode 编码每个字符占两个字节,因而可用十六进制编码形式表示。注:Unicode是全球语言统一编码

一个英文字符和一个中文字符都用一个char类型表示,它们都占用两个字节。要显示一个字符的Unicode编码,只需将char类型直接赋值给int类型即可。

int n1 = 'A'; // 字母“A”的Unicodde编码是65
int n2 = '中'; // 汉字“中”的Unicode编码是20013
// 注意是十六进制:
char c3 = '\u0041'; // 'A',因为十六进制0041 = 十进制65
char c4 = '\u4e2d'; // '中',因为十六进制4e2d = 十进制20013

字符串类型:用双引号"..."表示字符串

常见转义字符包括:

  • \" 表示字符"
  • \' 表示字符'
  • \\ 表示字符\
  • \n 表示换行符
  • \r 表示回车符
  • \t 表示Tab
  • \u#### 表示一个Unicode编码的字符

从Java 13开始,字符串可以用"""..."""表示多行字符串(Text Blocks)了。

String s = """
                   SELECT * FROM
                     users
                   WHERE id > 100
                   ORDER BY name DESC
                   """;  //上述多行字符串实际上是5行,在最后一个DESC后面还有一个\n。
String s = """
...........SELECT * FROM
...........  users
...........WHERE id > 100
...........ORDER BY name DESC
...........""";

//多行字符串前面共同的空格会被去掉
//如果多行字符串的排版不规则,那么,去掉的空格就会变成这样
String s = """
.........  SELECT * FROM
.........    users
.........WHERE id > 100
.........  ORDER BY name DESC
.........  """;
//即总是以最短的行首空格为基准。

Java的字符串除了是一个引用类型外,还有个重要特点,就是字符串不可变。基本类型的变量是“持有”某个数值,引用类型的变量是“指向”某个对象;

public class Main {
    public static void main(String[] args) {
        String s = "hello";
        String t = s;
        s = "world";
        System.out.println(t); // t是"hello"
    }
}

引用类型的变量可以指向一个空值null,它表示不存在,即该变量不指向任何对象。

String s1 = null; // s1是null
String s2 = s1; // s2也是null
String s3 = ""; // s3指向空字符串,不是null

注意要区分空值null和空字符串"",空字符串是一个有效的字符串对象,它不等于null

 

boolean 类型适于逻辑运算,一般用于程序流程控制 。
boolean 类型数据只允许取值 true 或 false ,不可以 0 或非 0 的整数替代 true 和 false ,这点和C语言不同。

 

使用变量注意事项:
作用域:变量定义在哪一级大括号中,哪个大括号的范围就是这个变量的作用域。相同的作用域中不能定义两个同名变量。
初始化值:没有初始化值不能直接使用。
在一行上建议只定义一个变量,可以定义多个,但是不建议。

 

+是一个运算符, 我们应该能够看懂,做数据的加法。
boolean类型不能转换为其他的数据类型
默认转换
    byte,short,char—int—long—float—double
    byte,short,char相互之间不转换,他们参与运算首先转换为int类型
强制转换
    目标类型 变量名=(目标类型)(被转换的数据);

一般建议,最好不要随意使用强制类型转换,容易造成数据精度的损失。
    (1)容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度降低或溢出;使用时要格外注意。
    (2)有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,然后再进行计算。

 可以将浮点数强制转型为整数。在转型时,浮点数的小数部分会被丢掉。如果转型后超过了整型能表示的最大范围,将返回整型的最大值。

public class Main {
    public static void main(String[] args) {
        System.out.println('a'); //a
        System.out.println('a'+1); //98

        System.out.println("hello"+'a'+1);  //helloa1
        System.out.println('a'+1+"hello");//98hello
        System.out.println("5+5="+5+5);//5+5=55
        System.out.println(5+5+"=5+5"); //10=5+5

        byte b1=3,b2=4,b;
        b=b1+b2; //不可以,是因为b1和b2是变量,因为变量的值会变化,不确定具体的值,所以默认使用int类型进行存储。
        b=3+4;   //3和4都是常量,所以java在编译时期会检查该常量的和是否超出byte类型的范围。如果没有可以赋值。
    }
}
//任何数据和字符串进行操作,结果都是字符串类型。但是要注意运算的顺序。

 

 4.运算符

 

 除法的时候要注意一个问题:
  整数相除,只能得到整数
  要想得到小数,可以*1.0

 

赋值运算符:

short s=1;s = s+1; //错
short s=1;s+=1;//对

 

 

 比较运算符“==”不能误写成“=”

 

 位运算是直接对二进制进行运算。

 

 

 三目运算符格式:(关系表达式)?表达式1:表达式2;
    如果条件为true,运算后的结果是表达式1;
    如果条件为false,运算后的结果是表达式2;

 

键盘录入数据:

//如何实现键盘录入数据呢?(目前先记住使用)
//导包(位置放到class定义的上面)
import java.util.Scanner;
//创建对象
Scanner sc = new Scanner(System.in);
//接收数据
int x = sc.nextInt();