跳至主要內容

基础语法

晨光-向大约 21 分钟JavaJava语言

基础语法

基础语法

1. Java概述

1.1 什么是Java?

Java是Sun Microsystems于1995年首次发布的一种编程语言和计算平台。编程语言还比较好理 解,那么什么是计算平台呢?

计算平台是在电脑中运行应用程序(软件)的环境,包括硬件环境和软件环境。一般系统平台 包括一台电脑的硬件体系结构、操作系统、运行时库。

Java是快速,安全和可靠的。从笔记本电脑到数据中心,从游戏机到科学超级计算机,从手机到互联 网,Java无处不在! Java主要分为三个版本

• JavaSE(J2SE)(Java2 Platform Standard Edition, java平台标准版)

JavaEE(J2EE)(Java 2 Platform,Enterprise Edition, java平台企业版)

• JavaME(J2ME)(Java 2 Platform Micro Edition, java平台微型版)。

1.2 Java的特点

特征一:面向对象的编程语言

Java是一门面向对象的编程语言。什么是面向对象?面向对象(Object Oriented)是一种软件开发思想。它是对现实世界的一种抽象, 面向对象会把相关的数据和方法组织为一个整体来看待。

相对的另外一种开发思想就是面向过程的开发思想,什么面向过程?面向过程(Procedure Oriented)是一种以过程为中心的编程思想。

举个例子:比如你是个学生,你每天去上学需要做几件 事情?

起床、穿衣服、洗脸刷牙,吃饭,去学校。一般是顺序性的完成一系列动作。

class student {
 void student_wakeUp(){...}
 void student_cloth(){...}
 void student_wash(){...}
 void student_eating(){...}
 void student_gotoSchool(){...}
}

而面向对象可以把学生进行抽象,所以这个例子就会变为

class student(){
 void wakeUp(){...}
 void cloth(){...}
 void wash(){...}
 void eating(){...}
 void gotoSchool(){...}
}

可以不用严格按照顺序来执行每个动作。这是特点一。

特征二

Java摒弃了 C++中难以理解的多继承、指针、内存管理等概念;不用手动管理对象的生命周期。

特征三

Java语言具有功能强大和简单易用两个特征,现在企业级开发,快速敏捷开发,尤其是各种框架 的出现,使Java成为越来越火的一门语言。

特征四:静态语言

Java是一门静态语言。静态语言指的就是在编译期间就能够知道数据类型的语言,在运行前就能 够检查类型的正确性,一旦类型确定后就不能再更改,比如下面这个例子。

public void foo() {
 int x = 5;
 boolean b = x;
}

静态语言主要有 Pascal, Perl, C/C++, JAVA, C#, Scala 等。

相对应的,动态语言没有任何特定的情况需要指定变量的类型,在运行时确定的数据类型。比如有Lisp, Perl, PythonRubyJavaScript 等。

从设计的角度上来说,所有的语言都是设计用来把人类可读的代码转换为机器指令。动态语言是为了能 够让程序员提高编码效率,因此你可以使用更少的代码来实现功能。静态语言设计是用来让硬件执行的 更高效,因此需要程序员编写准确无误的代码,以此来让你的代码尽快的执行。从这个角度来说,静态 语言的执行效率要比动态语言高,速度更快。

特征五:平台独立性和可移植性

Java具有平台独立性和可移植性。Java有一句非常著名的口号:Write once, run anywhere,也就是一次编写、到处运行。为什么 Java能够吹出这种牛批的口号来?核心就是JVM。我们知道,计算机应用程序和硬件之间会屏蔽很多 细节,它们之间依靠操作系统完成调度和协调,大致的体系结构如下

img

那么加上Java应用、JVM的体系结构会变为如下

img

Java是跨平台的,已编译的Java程序可以在任何带有JVM的平台上运行。你可以在Windows平台 下编写代码,然后拿到Linux平台下运行,该如何实现呢?

首先你需要在应用中编写Java代码;用IDEA或者javac把Java代码编译为.class文件;然后把你的.class文件打成.jar文件;然后你的.jar文件就能够在Windows*、* Mac OS X*、*Linux系统下运行了。不同的操作系统有不同的 JVM实现,切换平台时,不需要再次编译你的Java代码了。

特征六:多线程

Java是一门高级语言,高级语言会对用户屏蔽很多底层实现细节。比如Java是如何实现多线程的。从操作系统的角度来说,实现多线程的方式主要有下面这几种

  • 在用户空间中实现多线程

  • 在内核空间中实现多线程

  • 在用户和内核空间中混合实现线程

Java应该是在用户空间实现的多线程,内核是感知不到Java存在多线程机制的。

特征七:高性能

Java具有高性能。我们编写的代码,经过javac编译器编译称为字节码(bytecode),经过JVM内嵌的解释器将字节码 转换为机器代码,这是解释执行,这种转换过程效率较低。但是部分JVM的实现比如Hotspot JVM 都提供了 JIT(Just-In-Time)编译器,也就是通常所说的动态编译器,JIT能够在运行时将热点代 码编译机器码,这种方式运行效率比较高,这是编译执行。所以Java不仅仅只是一种解释执行的语言。

特征八:健壮性

Java语言具有健壮性。Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证。这也是Java与C 语言的重要区别。这是特点八。

特征九:Java很容易开发分布式项目

Java语言支持Internet应用的开发,Java中有net api,它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket等。Java的RMI (远程方法激活)机制也是开发分布 式应用的重要手段。这是特点九。

1.3 Java开发环境

JDK

JDK (Java Development Kit)称为Java开发包或Java开发工具,是一个编写Java的Applet 小程序和应用程序的程序开发环境。JDK是整个Java的核心,包括了 Java运行环境(Java Runtime Environment),—些 Java 工具Java 的核心类库(Java API)

Java Platform Standard Edition 8 Documentationopen in new window

image-20230224173004118

我们可以认真研究一下这张图,它几乎包括了 Java中所有的概念,此处是jdk1.8,可以点进去 Description of Java Conceptual Diagramopen in new window ,可以发现这里面包括了所有关于Java的描述.

Oracle提供了两种Java平台的实现,一种是我们上面说的JDK, Java开发标准工具包,一种是 JRE,叫做Java Runtime Environment, Java运行时环境。JDK的功能要比JRE全很多。

JRE

JRE是个运行环境,JDK是个开发环境。因此写Java程序的时候需要JDK,而运行Java程序的时候 就需要JRE。而JDK里面已经包含了JRE,因此只要安装了JDK,就可以编辑Java程序,也可以正常 运行Java程序。但由于JDK包含了许多与运行无关的内容,占用的空间较大,因此运行普通的Java 程序无须安装JDK,而只需要安装JRE即可。

总结

JVM (Java Virtual Machine) , Java虚拟机

JRE (Java Runtime Environment) , Java运行环境,包含了JVM和Java的核心类库(Java API)

JDK (Java Development Kit)称为Java开发工具,包含了JRE和开发工具

总结:我们只需安装JDK即可,它包含了java的运行环境和虚拟机。

2. Java开发环境配置

这个地方不再多说了,网上有很多教程配置的资料可供参考。

Win10配置Java环境(手把手从零搭建Java开发环境)_火石桥霍建华的博客-CSDN博客open in new window

3. Java基本语法

3.1 数据类型

在Java中,数据类型只有四类八种

  • 整数型:byte、short、int、long

byte也就是字节,1 byte = 8 bits, byte的默认值是0 ;

short占用两个字节,也就是16位,1 short = 16 bits,它的默认值也是0 ;

int占用四个字节,也就是32位,1 int = 32 bits,默认值是0 ;

long占用八个字节,也就是64位,1 long = 64 bits,默认值是0L;

所以整数型的占用字节大小空间为long > int > short > byte

  • 浮点型

浮点型有两种数据类型:float和double

float是单精度浮点型,占用4位,1 float = 32 bits,默认值是0.0f;

double是双精度浮点型,占用8位,1 double = 64 bits,默认值是0.0d;

  • 字符型

字符型就是char, char类型是一个单一的16位Unicode字符,最小值是\u0000 (也就是0 ) 最大值是\uffff (即为65535) , char数据类型可以存储任何字符,例如char a = 'A'。

  • 布尔型

布尔型指的就是boolean, boolean只有两种值,true或者是false,只表示1位,默认值是false。

以上x位都指的是在内存中的占用。

数据类型内存默认值
byte8位0
short16位0
int32位0
long64位0L
float32位O.Of
double64位O.Od
char16位\u0000
boolean8位fals

3.2 基础语法

  • 大小写敏感:Java是对大小写敏感的语言,例如Hello与hello是不同的,这其实就是Java的字 符串表示方式

  • 类名:对于所有的类来说,首字母应该大写,例如MyFirstClass

  • 包名:包名应该尽量保证小写,例如my.first.package

  • 方法名:方法名首字母需要小写,后面每个单词字母都需要大写,例如myFirstMethod()

3.3 运算符

运算符不只Java中有,其他语言也有运算符,运算符是一些特殊的符号,主要用于数学函数、一些类 型的赋值语句和逻辑比较方面。

运算符:对常量或者变量进行操作的符号。

表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。

不同运算符连接的表达式体现的是不同类型的表达式。

举例说明:

int a = 10; 
int b = 20; 
int c = a +

+:是运算符,并且是算术运算符。

a + b:是表达式,由于+是算术运算符,所以这个表达式叫算术表达式。

1. 赋值运算符

赋值运算符使用操作符=来表示,它的意思是把=号右边的值复制给左边,右边的值可以是任何常 数、变量或者表达式,但左边的值必须是一个明确的,已经定义的变量。比如int a = 4

但是对于对象来说,复制的不是对象的值,而是对象的引用,所以如果说将一个对象复制给另一个对 ,实际上是将一个对象的引用赋值给另一个对象

2. 算数运算符

算数运算符就和数学中的数值计算差不多,主要有

符号作用说明
+参看小学一年级
-参看小学一年级
*参看小学二年级,与“×”相同
/参看小学二年级,与“÷”相同
%取余获取的是两个数据做除法的余数
  • /和%的区别:两个数据做除法,/取结果的商,%取结果的余数。整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。
int a = 10; int b = 3;
System.out.println(a / b); // 输出结果3
System.out.println(a % b); // 输出结果1

算数运算符需要注意的就是优先级问题,当一个表达式中存在多个操作符时,操作符的优先级顺序就 决定了计算顺序,最简单的规则就是先乘除后加减,()的优先级最高,没必要记住所有的优先级顺序,不确定的直接用0就可以了。

3. 自增、自减运算符

符号作用说明
++自增变量的值加1
--自减变量的值减1

这个就不文字解释了,解释不如直接看例子明白

int a = 5;
b =   ++a;
c =   a++;  

4. 比较运算符

比较运算符用于程序中的变量之间,变量和自变量之间以及其他类型的信息之间的比较。

比较运算符的运算结果是boolean型。当运算符对应的关系成立时,运算的结果为true,否则为 false。比较运算符共有6个,通常作为判断的依据用于条件语句中。

5. 逻辑运算符

逻辑运算符主要有三种:与、或、非

下面是逻辑运算符对应的true/false符号表

aba & ba&&ba | ba||b!aa A b
truetruetruetruetruetruefalsefalse
truefalsefalsefalsetruetruefalsetrue
falsetruefalsefalsetruetruetruetrue
falsefalsefalsefalsefalsefalsetruefalse

6. 按位运算符

按位运算符用来操作整数基本类型中的每个比特位,也就是二进制位。按位操作符会对两个参数中对 应的位执行布尔代数运算,并最终生成一个结果。

如果进行比较的双方是数字的话,那么进行比较就会变为按位运算。

按位与:按位进行与运算(AND),两个操作数中位都为1,结果才为1,否则结果为0。需要首先把比 较双方转换成二进制再按每个位进行比较

按位或:按位进行或运算(OR),两个位只要有一个为1,那么结果就是1,否则就为0。

按位非:按位进行异或运算(XOR),如果位为0,结果是1,如果位为1,结果是0。

按位异或:按位进行取反运算(NOT),两个操作数的位中,相同则结果为0,不同则结果为1。

7. 移位运算符

移位运算符用来将操作数向某个方向(向左或者右)移动指定的二进制位数。

运算符含义
»右移运算符eg: 8 » 1 = 4
«左移运算符eg: 9 « 2 = 36

8. 三元运算符😄

三元运算符是类似if...else...这种的操作符,语法为:条件表达式?表达式1:表达式2。问号前面的位置是判断的条件,判断结果为布尔型,为true时调用表达式1,为false时调用表达式2。

int a = 10; int b = 20;
int c = a > b ? a :// 判断 a>b 是否为真,如果为真取a的值,如果为假,取b的值

4. Java执行控制流程

Java中的控制流程其实和C —样,在Java中,流程控制会涉及到包括if-elsewhiledo-whileforreturnbreak以及选择语句switch。下面以此进行分析

4.1 条件语句

条件语句可根据不同的条件执行不同的语句。包括if条件语句与switch多分支语句。

if条件语句

if语句可以单独判断表达式的结果,表示表达的执行结果,例如

int a = 10;
if(a > 10){
 return true;
}
return false;

if...else条件语句

if语句还可以与else连用,通常表现为如果满足某种条件,就进行某种处理,否则就进行另一种处 理

int a = 10;
int b = 11;
if(a >= b){
 System.out.println("a >= b");
}else{
 System.out.println("a < b");
}

if后的0内的表达式必须是boolean型的。如果为true,则执行if后的复合语句;如果为false,则执 行else后的复合语句。

if...else if多分支语句

上面中的if...else是单分支和两个分支的判断,如果有多个判断条件,就需要使用if...else if

int x = 40;
if(x > 60) {
	System .out. println("x 的值大于 60");
} else if (x > 30) {
	System.out.println("x 的值大于 30 但小于 60");
} else if (x > 0) {
	System.out.println("x 的值大于 0 但小于 30");
} else {
	System.out.println("x 的值小于等于 0);
}

switch多分支语句

一种比if...else if语句更优雅的方式是使用switch多分支语句

格式:

switch (表达式) {
    case 1:
        语句体1;
        break; 
    case 2:
        语句体2;
        break;
    ...
    default:
    	语句体n+1; break;
}

执行流程:

  • 首先计算出表达式的值

  • 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。

  • 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。

示例:

 switch (week) {
     case 1:
     	System.out.println("Monday");
    	break;
     case 2:
     	System.out.println("Tuesday");
     	break;
     case 3:
     	System.out.println("Wednesday");
     	break;
     case 4:
     	System.out.println("Thursday");
     	break;
     case 5:
     	System.out.println("Friday");
     	break;
     case 6:
     	System.out.println("Saturday");
     	break;
     case 7:
     	System.out.println("Sunday");
     	break;
     default:
     	System.out.println("No Else");
     	break;
}

4.2 循环语句

循环语句就是在满足一定的条件下反复执行某一表达式的操作,直到满足循环语句的要求。使用的循环语句主要有 fordo...while()while ,

while循环语句

while循环语句的循环方式为利用一个条件来控制是否要继续反复执行这个语句。while循环语句的格式 如下

while(布尔值){
 表达式
}

它的含义是,当(布尔值)为true的时候,执行下面的表达式,布尔值为false的时候,结束循环,布尔 值其实也是一个表达式,比如

int a = 10;
while(a > 5){
 a--;
}

do...while 循环

while与do...while循环的唯一区别是do...while语句至少执行一次,即使第一次的表达式为false。而 在while循环中,如果第一次条件为false,那么其中的语句根本不会执行。在实际应用中,while要比 do...while应用的更广。它的一般形式如下

int b = 10;
// do···while循环
do {
 System.out.println("b == " + b);
 b--;
} while(b == 1);

for循环语句

for循环是我们经常使用的循环方式,这种形式会在第一次迭代前进行初始化。它的形式如下

for(初始化;布尔表达式;步进){}

每次迭代前会测试布尔表达式。如果获得的结果是false,就会执行for语句后面的代码;每次循环结 束,会按照步进的值执行下一次循环。

  • 迭代器

  • 逗号操作符

这里不可忽略的一个就是逗号操作符,Java里唯一用到逗号操作符的就是for循环控制语句。在表达式 的初始化部分,可以使用一系列的逗号分隔的语句;通过逗号操作符,可以在f。r语句内定义多个变 量,但它们必须具有相同的类型

for(int i = 1;j = i + 10;i < 5;i++, j = j * 2){
    
}
  • for-each 语句 (增强for循环)

在Java JDK 1.5中还引入了一种更加简洁的、方便对数组和集合进行遍历的方法,即for-each语 句,例子如下

int array[] = {7, 8, 9};
for (int arr : array) {
 System.out.println(arr);
}

4.3 跳转语句

Java语言中,有三种跳转语句:breakcontinuereturn

break语句

break语句我们在switch中已经见到了,它是用于终止循环的操作,实际上break语句在for、while、 do-whil e循环语句中,用于强行退出当前循环,例如

for(int i = 0;i < 10;i++){
 if(i == 5){
 break;
 }
}

continue 语句

continue也可以放在循环语句中,它与break语句具有相反的效果,它的作用:用于执行下一次循环, 而不是退出当前循环,还以上面的例子为主:

for(int i = 0;i < 10;i++){
 
 System.out.printl(" i = " + i );
 if(i == 5){
 System.out.printl("continue ... ");
 continue;
 }
}

return语句

return语句可以从一个方法返回,并把控制权交给调用它的语句。

public void getName() {
 return name;
}

5.包装类

5.1基本类型包装类

  • 基本类型包装类的作用

    ​ 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据

    ​ 常用的操作之一:用于基本数据类型与字符串之间的转换

  • 基本类型对应的包装类

    基本数据类型包装类
    byteByte
    shortShort
    intInteger
    longLong
    floatFloat
    doubleDouble
    charCharacter
    booleanBoolean

5.2Integer类

  • Integer类概述

    ​ 包装一个对象中的原始类型 int 的值

  • Integer类构造方法

    方法名说明
    public Integer(int value)根据 int 值创建 Integer 对象(过时)
    public Integer(String s)根据 String 值创建 Integer 对象(过时)
    public static Integer valueOf(int i)返回表示指定的 int 值的 Integer 实例
    public static Integer valueOf(String s)返回一个保存指定值的 Integer 对象 String
  • 示例代码

    public class IntegerDemo {
        public static void main(String[] args) {
            //public Integer(int value):根据 int 值创建 Integer 对象(过时)
            Integer i1 = new Integer(100);
            System.out.println(i1);
    
            //public Integer(String s):根据 String 值创建 Integer 对象(过时)
            Integer i2 = new Integer("100");
    //        Integer i2 = new Integer("abc"); //NumberFormatException
            System.out.println(i2);
            System.out.println("--------");
    
            //public static Integer valueOf(int i):返回表示指定的 int 值的 Integer 实例
            Integer i3 = Integer.valueOf(100);
            System.out.println(i3);
    
            //public static Integer valueOf(String s):返回一个保存指定值的Integer对象 String
            Integer i4 = Integer.valueOf("100");
            System.out.println(i4);
        }
    }
    

5.3int和String类型的相互转换

  • int转换为String

    • 转换方式

      • 方式一:直接在数字后加一个空字符串
      • 方式二:通过String类静态方法valueOf()
    • 示例代码

      public class IntegerDemo {
          public static void main(String[] args) {
              //int --- String
              int number = 100;
              //方式1
              String s1 = number + "";
              System.out.println(s1);
              //方式2
              //public static String valueOf(int i)
              String s2 = String.valueOf(number);
              System.out.println(s2);
              System.out.println("--------");
          }
      }
      
  • String转换为int

    • 转换方式

      • 方式一:先将字符串数字转成Integer,再调用valueOf()方法
      • 方式二:通过Integer静态方法parseInt()进行转换
    • 示例代码

      public class IntegerDemo {
          public static void main(String[] args) {
              //String --- int
              String s = "100";
              //方式1:String --- Integer --- int
              Integer i = Integer.valueOf(s);
              //public int intValue()
              int x = i.intValue();
              System.out.println(x);
              //方式2
              //public static int parseInt(String s)
              int y = Integer.parseInt(s);
              System.out.println(y);
          }
      }
      

5.4字符串数据排序案例

  • 案例需求

    ​ 有一个字符串:“91 27 46 38 50”,请写程序实现最终输出结果是:“27 38 46 50 91”

  • 代码实现

    public class IntegerTest {
        public static void main(String[] args) {
            //定义一个字符串
            String s = "91 27 46 38 50";
    
            //把字符串中的数字数据存储到一个int类型的数组中
            String[] strArray = s.split(" ");
    //        for(int i=0; i<strArray.length; i++) {
    //            System.out.println(strArray[i]);
    //        }
    
            //定义一个int数组,把 String[] 数组中的每一个元素存储到 int 数组中
            int[] arr = new int[strArray.length];
            for(int i=0; i<arr.length; i++) {
                arr[i] = Integer.parseInt(strArray[i]);
            }
    
            //对 int 数组进行排序
            Arrays.sort(arr);
    
            //把排序后的int数组中的元素进行拼接得到一个字符串,这里拼接采用StringBuilder来实现
            StringBuilder sb = new StringBuilder();
            for(int i=0; i<arr.length; i++) {
                if(i == arr.length - 1) {
                    sb.append(arr[i]);
                } else {
                    sb.append(arr[i]).append(" ");
                }
            }
            String result = sb.toString();
    
            //输出结果
            System.out.println(result);
        }
    }
    

5.5 自动拆箱和自动装箱

  • 自动装箱

    ​ 把基本数据类型转换为对应的包装类类型

  • 自动拆箱

    ​ 把包装类类型转换为对应的基本数据类型

  • 示例代码

    Integer i = 100;  // 自动装箱
    i += 200;         // i = i + 200;  i + 200 自动拆箱;i = i + 200; 是自动装箱
    

6. 扩展

Random

Random产生随机数(掌握)

概述:

Random类似Scanner,也是Java提供好的API,内部提供了产生随机数的功能

API后续课程详细讲解,现在可以简单理解为Java已经写好的代码 使用步骤:

1. 导入包
import java.util.Random;

2. 创建对象
Random r = new Random();

3.  产生随机数
int num = r.nextInt(10);

解释: 10代表的是一个范围,如果括号写10,产生的随机数就是0-9,括号写20,参数的随机数则是0- 19

示例代码:

import java.util.Random; 

public class RandomDemo {
    public static void main(String[] args) {
        //创建对象
        Random r = new Random();
        //用循环获取10个随机数
        for(int i=0; i<10; i++) {
        //获取随机数
        	int number = r.nextInt(10); System.out.println("number:" + number);
        }
        //需求:获取一个1-100之间的随机数
        int x = r.nextInt(100) + 1; System.out.println(x);
    }
}