锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

javase学习笔记,学习时间一个月,发布笔记进度1/3

时间:2022-09-13 11:00:00 19sb1j电连接器

1. Java基本语法

1.1 语言概述

1.1.1 整体语言概述

image-20220410135456370

1.1.2 Java语言概述

1.1.2.1 基础常识

软件:即按特定顺序组织的一系列计算机数据和指令集。分为系统软件和应用软件

  • 系统软件:Windows,mac os,linux,unix,android,ios,…
  • 应用软件:word,ppt,画图板

人机交互方式:图形化界面vs命令行方式

应用程序=算法 数据结构

1.1.2.2 计算机语言的发展迭代史

第一代:机器语言

第二代:汇编语言

第三代:高级语言

  • 面向过程:C,Pascal,Fortran
  • 面向对象:Java,JS,Python,Scala,…

Java迭代概述语言版本

  • 1991年 Green开发语言最初被命名为项目Oak (橡树)

  • 开发组意识到1994年Oak 非常适合互联网

  • 1996年,发布JDK 1.0,约8.3万个网页应用Java技术来制作

  • 1997年,发布JDK 1.1,JavaOne会议召开,创造了当时世界上最大的类似会议

  • 1998年,发布JDK 1.2.同年发布企业平台J2EE

  • 1999年,Java分成J2SE、J2EE和J2ME,JSP/Servlet技术诞生

  • 里程碑版本于2004年发布:JDK 1.5.为了突出这个版本的重要性,更名为JDK 5.0

  • 2005年,J2SE -> JavaSE,J2EE -> JavaEE,J2ME -> JavaME

  • 2009年,Oracle公司收购SUN,74亿美元的交易价格

  • 2011年,发布JDK 7.0

  • 2014年,发布JDK 8.0,是继JDK 5.自0以来变化最大的版本

  • 2017年,发布JDK 9.0.模块化最大化

  • 2018年3月,发布JDK 10.0,版本号也叫18.3

  • 2018年9月,发布JDK 11.0,版本号也叫18.9

1.1.2.3 Java语言应用领域

Java Web开发:后台开发

大数据开发:数据挖掘:

Android应用程序开发:客户端开发

1.1.2.4 Java语言的特点

面向对象:

  • 两个要素:类、对象;
  • 包装、继承、多态三个特点;

强度:1.去除C语言中的指针 2.自动垃圾回收机制 —>内存溢出仍然存在,内存泄漏

跨平台行:write once,run anywhere归功于一次编译,到处运行)JVM(Java编译器)

1.1.3 开发环境建设

1.1.3.1 JDK、JRE、JVM的关系

1.1.3.2 JDK下载、安装

下载:官网,GitHub

安装:傻瓜式安装:JDK、JRE

**注意:**安装软件的路径不能包安装软件的路径中。

1.1.3.3 path配置环境变量

为什么配置path环境变量

path环境变量:windows操作系统执行命令时搜索的路径

为什么要配置?path:希望java的开发工具(javac.exe,java.exe)可以在任何文件路径下成功执行。

如何配置

1.1.4 第一个java程序

1.开发体验——Hello World

1.1 编写

创建一个java源文件:HelloWorld.java class HelloChina{ 
          public static void main(String[] args){ 
           System.out.println("Hello,World!");  } } 

1.2 编译

javac HelloWorld.java 

1.3 运行

java HelloWord 

2.解决常见问题

3.总结第一个程序

  • 1.java编程-编译-操作过程
    • 写作:我们将写作java代码保存以".java"源文件的结尾
    • 编译:使用java.exe编译我们的命令java源文件。javac源文件名.java
    • 运行:使用java.exe命令解释操作我们的字节码文件。java类名
  • 2.在一个java多个源文件可以声明class。但最多只能有一个类声明位public的。要求声明为public类名必须与源文件名相同
  • 3.程序的入口是main()方法。格式固定。
  • 输出语句:
    • System.out.println:先输出数据,再换行;
    • System.out.print:只输出数据;
  • 5.每行执行语都以;结束。
  • 6.编译的过程:编译后,会生成一个或多个字节码文件。字节码文件名与java源文件中的类名相同。

1.1.5 注释与API文档

1. 注释:Comment

  • 单行注释://注释内容
  • 多行注释:/* 注释内容 */
  • 文档注释:/** 注释内容 */

作用:

① 对所写的程序进行解释说明,增强可读性。方便自己,方便别人

② 调试所写的代码

特点: ① 单行注释和多行注释,注释了的内容不参与编译。换句话说,编译以后生成的 .class 结尾的字节码文件中不包含注释掉的信息 ② 注释内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。

③ 多行注释不可以嵌套使用

2. Java API 文档:

  • API: application programming interface。习惯上:将语言提供的类库,都称为API.
  • API文档:针对于提供的类库如何使用,给的一个说明书。类似于《新华字典》

3. 良好的编程风格

3.1 正确的注释和注释风格

  • 使用文档注释来注释整个类或整个方法
  • 如果注释方法中的某一个步骤,使用单行或多行注释。

3.2 正确的缩进和空白

  • 使用一次tab操作,实现缩进
  • 运算符两边习惯性各加一个空格。比如:2 + 4 * 5。

3.3 块的风格

行尾风格(Java API源码选择的风格)

public class Test{ 
        
    public static void main (String args){ 
        
        System.out.print("Hello");
    }
}
复制代码

次行风格

public class Test
{ 
        
    public static void main (String args)
    { 
        
        System.out.print("Hello");
    }
}

3.4 命名风格:

  • 包名:多单词组成时所有字母都小写:xxxyyyzzz
  • 类名、接口名:多单词组成时,所有单词的首字母大写: XxxYyyZzz(大驼峰式)
  • 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写: xxxYyyZzz(小驼峰式)
  • 常量名:所有字母都大写。多单词时每个单词用下划线连接: XXX_YYY_ZZZ

1.2 基本语法

1.2.1 关键字与标识符

1.2.1.1 java关键字的使用

定义:被java语言赋予了特殊含义,用做专门用途的字符串(单词)

特点:关键字中所有字母都为小写

1.2.1.2 保留字

现Java版本尚未使用,但以后版本可能会作为关键字使用。

具体哪些保留字:goto、const

注意:命名标识符时要避免使用这些保留字

1.2.1.3 标识符的使用

定义:凡是自己可以起名字的地方都叫标识符。

涉及到的结构:包名、类名、接口名、变量名、方法名、常量名

规则:(必须要遵守。否则,编译不通过)

  • 由26个英文字母大小写,0-9, _或$组成。
  • 数字不可以开头。
  • 不可以使用关键字和保留字,但能包含关键字和保留字。
  • Java中严格区分大小写,长度无限制。
  • 标识符不能包含空格。

规范:(可以不遵守,不影响编译和运行。但是要求大家遵守)

  • 包名:多单词组成时所有字母都小写:xxxyyyzzz
  • 类名、接口名:多单词组成时,所有单词的首字母大写: XxxYyyZzz(大驼峰式)
  • 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写: xxxYyyZzz(小驼峰式)
  • 常量名:所有字母都大写。多单词时每个单词用下划线连接: XXX_YYY_ZZZ

注意点: 在起名字时,为了提高阅读性,要尽量意义,“见名知意”。

1.介绍
软件中随处可见命名。我们给变量、函数、参数、类和包命名。我们给源代码及源代码所在目录命名。
这么多命名要做,不妨做好它。下文列出了取个好名字的几条简单规则。

2.名副其实,见名知意
变量名太随意,haha、list1、ok、theList 这些都没啥意义

3.避免误导
包含Listimport、java等类名、关键字或特殊字;
字母o与数字0,字母l与数字1等
提防使用不同之处较小的名称。比如:XYZControllerForEfficientHandlingOfStringsXYZControllerForEfficientStorageOfStrings

4.做有意义的区分
反面教材,变量名:a1、a2、a3
避免冗余,不要出现Variable、表字段中避免出现table、字符串避免出现nameString,直接name就行,知道是字符串类型
再比如:定义了两个类:Customer类和CustomerObject类,如何区分?
定义了三个方法:getActiveAccount()getActiveAccounts()getActiveAccountInfo(),如何区分?

5.使用读得出来的名称
不要使用自己拼凑出来的单词,比如:xsxm(学生姓名)genymdhms(生成日期,年、月、日、时、分、秒)
所谓的驼峰命名法,尽量使用完整的单词

6.使用可搜索的名称
一些常量,最好不直接使用数字,而指定一个变量名,这个变量名可以便于搜索到.
比如:找MAX_CLASSES_PER_STUDENT很容易,但想找数字7就麻烦了。

7.避免使用编码
7.1 匈牙利语标记法:即变量名表明该变量数据类型的小写字母开始。例如,szCmdLine的前缀sz表示“以零结束的字符串”。
7.2 成员前缀:避免使用前缀,但是Android中一个比较好的喜欢用m表示私有等,个人感觉比较好
7.3 接口和实现:作者不喜欢把接口使用I来开头,实现也希望只是在后面添加Imp

8.避免思维映射
比如传统上惯用单字母名称做循环计数器。所以就不要给一些非计数器的变量命名为:i、j、k等

9.类名
类名与对象名应该是名词与名词短语。如CustomerWikiPageAccountAddressParser。避免使用DataInfo这样的类名。
不能使动词。比如:ManageProcess

10.方法名
方法名应当是动词或者动词短语。如postPayment、deletePage或save

11.别扮可爱
有的变量名叫haha、banana
别用eatMyShorts()表示abort()

12.每个概念对应一个词
项目中同时出现controllers与managers,为什么不统一使用其中一种?
对于那些会用到你代码的程序员,一以贯之的命名法简直就是天降福音。

13.别用双关语
有时可能使用add并不合适,比例insert、append。add表示完整的新添加的含义。     

14. 使用解决方案领域名称
看代码的都是程序员,所以尽量用那些计算机科学术语、算法名、模式名、数学术语,
依据问题所涉领域来命名不算是聪明的做法。

2.15 使用源自所涉问题领域的名称
如果不能用程序员熟悉的术语来给手头的工作命名,就采用从所涉问题领域而来的名称吧。
至少,负责维护代码的程序员就能去请教领域专家了。

2.16 添加有意义的语境
可以把相关的变量放到一个类中,使用这个类来表明语境。

2.17 不要添加没用的语境
名字中带有项目的缩写,这样完全没有必要。比如有一个名为“加油站豪华版”(Gas Station Deluxe)的项目,
在其中给每个类添加GSD前缀就不是什么好策略。

2.18 最后的话
取好名字最难的地方在于需要良好的描述技巧和共有文化背景。

1.2.2 变量的使用

1.2.2.1 变量的分类

按数据类型分类

详细说明:

  1. 整型:byte (1字节=8bit) \ short (2字节) \ int (4字节) \ long (8字节)

byte 范围:-128 ~ 127

② 声明 long 型变量,必须以 lL 结尾

③ 通常,定义整型变量时,使用 int 型。

④整型的常量,默认类型是:int

  1. 浮点型:float (4字节) \ double (8字节)

① 浮点型,表示带小数点的数值

float 表示数值的范围比long还大

③ 定义 float 类型变量时,变量要以 fF 结尾

④ 通常,定义浮点型变量时,使用 double 型。

⑤ 浮点型的常量,默认类型为:double

  1. 字符型:char (1字符 = 2字节)

① 定义 char 型变量,通常使用一对’',内部只能写一个字符

② 表示方式:1.声明一个字符 2.转义字符 3.直接使用 Unicode 值来表示字符型常量

  1. 布尔型:boolean

① 只能取两个值之一:truefalse

② 常常在条件判断、循环结构中使用

按照声明位置分类

1.2.2.2 定义变量的格式:

  • 数据类型 变量名 = 变量值;
  • 数据类型 变量名,变量名 = 变量值;

1.2.2.3 变量使用的注意点:

  • 1.变量必须先声明,后使用;
  • 2.变量都定义在其作用域内。在作用域内,它是有效的,出了作用域,就失效了;
  • 3.同一个作用域内,不可以声明两个同名的变量;

1.2.2.4 基本数据类型变量间运算规则

  • 1.涉及到的基本数据类型:除了boolean之外的其他7种

  • 2.自动类型转换(只涉及7种基本数据类型)

    • byte、char、short–>int–>long–>float–>double
      • 结论:当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型。
      • 特别的:当byte、char、short三种类型的变量做运算时,结果为int型
      • 说明:此时的容量大小指的是,表示数的范围的大和小。比如:float容量要大于long的容量
  • 3.强制类型转换(只涉及7种基本数据类型):自动类型提升运算的逆运算。需要使用强转换符:

    • 注意点:强制类型转换,可能导致精度损失。
  • 4.String与8种数据类型间的运算

    • String属于引用数据类型,翻译为:字符串
    • 声明String类型变量时,使用一对""
    • String可以和8种基本数据类型变量做运算,且运算只能是连接运算:+
    • 运算的结果仍然是String类型

注意:

String s = 123;//编译错误
String s1 = "123";
int i = (int)s1;//编译错误

1.3 进制的转化

1.3.1 编程中设计的进制及表示方式:

  • 二进制(binary): 0/1,满2进1以0b或0B开头。

  • 十进制 (decimal):0-9,满10进1。

  • 八进制(octal):0-7,满8进1,以数字0开头表示。

  • 十六进制(hex):0-9及A-F,满16进1,以0x或0X开头表示。此处的A-F不区分大小写如:0x21AF+1=0X21B0

1.3.2 进制的使用说明:

计算机底层的存储方式:所有数字在计算机底层都以二进制形式存在。

二进制数据的存储方式:所有的数值,不管正负,底层都以补码的方式存储。

原码、反码、补码的说明:

  • 正数:三码合一
  • 负数:
    • 负数的原码:直接将一个数值换成二进制数。最高位是符号位。
    • 负数的反码:是对原码按位取反,只是最高位(符号位)确定为1。
    • 负数的补码:其反码加1。

1.3.3 进制之间的转化:

1. 二进制转化为十进制:

2. -69补码–>原码

3. 127原码–>补码

4. 十进制转化二进制

1.4 运算符

1.4.1 算数运算符

算术运算符: + - + - * / % (前)++ (后)++ (前)-- (后)-- +

//除号:/
int num1 = 12;
int num2 = 5;
int result1 = num1 / num2;
System.out.println(result1);//2
// %:取余运算
//结果的符号与被模数的符号相同
//开发中,经常使用%来判断能否被除尽的情况。
int m1 = 12;
int n1 = 5;
System.out.println("m1 % n1 = " + m1 % n1);

int m2 = -12;
int n2 = 5;
System.out.println("m2 % n2 = " + m2 % n2);

int m3 = 12;
int n3 = -5;
System.out.println("m3 % n3 = " + m3 % n3);

int m4 = -12;
int n4 = -5;
System.out.println("m4 % n4 = " + m4 % n4);
//(前)++ :先自增1,后运算
//(后)++ :先运算,后自增1
int a1 = 10;
int b1 = ++a1;
System.out.println("a1 = " + a1 + ",b1 = " + b1);

int a2 = 10;
int b2 = a2++;
System.out.println("a2 = " + a2 + ",b2 = " + b2);

int a3 = 10;
++a3;//a3++;
int b3 = a3;
//(前)-- :先自减1,后运算
//(后)-- :先运算,后自减1

int a4 = 10;
int b4 = a4--;//int b4 = --a4;
System.out.println("a4 = " + a4 + ",b4 = " + b4);

注意

  1. (前)++ :先自增1,后运算 (后)++ :先运算,后自增1
  2. (前)-- :先自减1,后运算 (后)-- :先运算,后自减1
  3. 连接符:+:只能使用在String与其他数据类型变量之间使用。

1.4.2 赋值运算符

赋值运算符:= += -= *= /= %=

经典代码

int i2,j2;
//连续赋值
i2 = j2 = 10;
//***************
int i3 = 10,j3 = 20;
int num1 = 10;
num1 += 2;//num1 = num1 + 2;
System.out.println(num1);//12

int num2 = 12;
num2 %= 5;//num2 = num2 % 5;
System.out.println(num2);

short s1 = 10;
//s1 = s1 + 2;//编译失败
s1 += 2;//结论:不会改变变量本身的数据类型
System.out.println(s1);

【特别说明的】 1.运算的结果不会改变变量本身的数据类型

① 开发中,如果希望变量实现+2的操作,有几种方法?(前提:int num = 10;)

  • 方式一:num = num + 2;
  • 方式二:num += 2; (推荐)

② 开发中,如果希望变量实现+1的操作,有几种方法?(前提:int num = 10;)

  • 方式一:num = num + 1;
  • 方式二:num += 1;
  • 方式三:num++; (推荐)

1.4.3 比较运算符

比较运算符(关系运算符): == != > < >= <= instanceof

【典型代码】

int i = 10;
int j = 20;

System.out.println(i == j);//false
System.out.println(i = j);//20

boolean b1 = true;
boolean b2 = false;
System.out.println(b2 == b1);//false
System.out.println(b2 = b1);//true

【特别说明的】

  • 比较运算符的结果是 boolean 类型;
  • < >= <= :只能使用在数值类型的数据之间;
  • ==!=: 不仅可以使用在数值类型数据之间,还可以使用在其他引用类型变量之间;

代码示例:

Account acct1 = new Account(1000);
Account acct2 = new Account(1000);
boolean b1 = (acct1 == acct2);//比较两个Account是否是同一个账户。
boolean b2 = (acct1 != acct2);//

1.4.4 逻辑运算符

逻辑运算符:& && | || ! ^

//区分& 与 &&
//相同点1:& 与 && 的运算结果相同
//相同点2:当符号左边是true时,二者都会执行符号右边的运算
//不同点:当符号左边是false时,&继续执行符号右边的运算。&&不再执行符号右边的运算。
//开发中,推荐使用&&
boolean b1 = true;
b1 = false;
int num1 = 10;
if(b1 & (num1++ > 0)){ 
        
    System.out.println("我现在在北京");
}else{ 
        
    System.out.println("我现在在南京");
}

System.out.println("num1 = " + num1);


boolean b2 = true;
b2 = false;
int num2 = 10;
if(b2 && (num2++ > 0)){ 
        
    System.out.println("我现在在北京");
}else{ 
        
    System.out.println("我现在在南京");
}

System.out.println("num2 = " + num2);

||| 的区别

相同点1:||| 的运算结果相同;

相同点2:当符号左边是false时,二者都会执行符号右边的运算;

不同点:当符号左边是true时,| 继续执行符号右边的运算,而 || 不再执行符号右边的运算;

开发中,推荐使用||

boolean b3 = false;
b3 = true;
int num3 = 10;
if(b3 | (num3++ > 0)){ 
        
    System.out.println("我现在在北京");
}else{ 
        
    System.out.println("我现在在南京");
}
System.out.println("num3 = " + num3);


boolean b4 = false;
b4 = true;
int num4 = 10;
if(b4 || (num4++ > 0)){ 
        
    System.out.println("我现在在北京");
}else{ 
        
    System.out.println("我现在在南京");
}
System.out.println("num4 = " + num4);

【特别说明的】

逻辑运算符操作的都是 boolean 类型的变量。而且结果也是 boolean 类型

1.4.5 位运算符

位运算符:<< >> >>> & | ^(异或) ~(非)

【典型代码】

int i = 21;
i = -21;
System.out.println("i << 2 :" + (i << 2));
System.out.println("i << 3 :" + (i << 3));
System.out.println("i << 27 :" + (i << 27));

int m = 12;
int n = 5;
System.out.println("m & n :" + (m & n));
System.out.println("m | n :" + (m | n));
System.out.println("m ^ n :" + (m ^ n));

【面试题】 你能否写出最高效的2 * 8的实现方式? 答案:2 << 3 或 8 << 1

【特别说明的】

  • 位运算符操作的都是整型的数据
  • << :在一定范围内,每向左移1位,相当于 * 2 >>:在一定范围内,每向右移1位,相当于 / 2

典型题目:

交换两个变量的值。

① 借用临时变量

int num1 = 10;
int num2 = 20;
int temp = num1;
num1 = num2;
num2 = temp;

② 加减交换:节省内存,但是会超出存储范围,而且只能适用于数值型运算,

num1 = num1 + num2;
num2 = num1 - num2;
num1 = num1 - num2; 

使用位运算符:只适用于数值型运算

num1 = num1 ^ num2;
num2 = num1 ^ num2;
num1 = num1 ^ num2;

1.4.6 三元运算符

三元运算符:(条件表达式) ? 表达式1 : 表达式2

【典型代码】

① 获取两个整数的较大值

int a = 3;
int b = 6;
int c = 10;
int max = (a > b) a ? b;

② 获取三个数的最大值

int a = 3;
int b = 6;
int c = 10;
int temp = (a > b) a ? b;
int max = (temp > c) temp ? c;

【特别说明】

说明:

① 条件表达式的结果为boolean类型

② 根据条件表达式真或假,决定执行表达式1,还是表达式2. 如果表达式为true,则执行表达式1。 如果表达式为false,则执行表达式2。

③ 表达式1 和表达式2要求是一致的。

④ 三元运算符可以嵌套使用

⑤ 凡是可以使用三元运算符的地方,都可以改写为if-else反之,不成立。

⑥ 如果程序既可以使用三元运算符,又可以使用if-else结构,那么优先选择三元运算符。原因:简洁、执行效率高。

1.5 流程控制

1.5.1 分支结构

1.5.1.1 if-else条件判断结构

书写方式

结构一:
if(条件表达式){ 
        
	执行表达式
}

结构二:二选一
if(条件表达式){ 
        
	执行表达式1
}else{ 
        
	执行表达式2
}

结构三:n选一
if(条件表达式){ 
        
	执行表达式1
}else if(条件表达式){ 
        
	执行表达式2
}else if(条件表达式){ 
        
	执行表达式3
}
...
else{ 
        
	执行表达式n
}

说明:

  • else 结构是可选的。

  • 针对于条件表达式:

    • 如果多个条件表达式之间是“互斥”关系(或没有交集的关系),哪个判断和执行语句声明在上面还是下面,无所谓。
    • 如果多个条件表达式之间有交集的关系,需要根据实际情况,考虑清楚应该将哪个结构声明在上面。
    • 如果多个条件表达式之间有包含的关系,通常情况下,需要将范围小的声明在范围大的上面。否则,范围小的就没机会执行了。
  • if-else结构是可以相互嵌套的。

  • 如果if-else结构中的执行语句只有一行时,对应的一对{}可以省略的。但是,不建议大家省略。

1.5.1.2 switch-case选择结构

相关文章