Java 入门笔记
目录
java 版本
- JavaSE(java Standard Edition):标准版 ,定位在个人计算机上的应用。
- JavaEE(java Enterprise Edition):企业版 ,定位在服务器端的应用。
- JavaME(java Micro Edition):微型版 ,定位在消费型电子产品的应用上。
java 虚拟机 —— JVM
- jvm:程序运行的环境,jvm 让 java 具有 跨平台性。
- jre:java 程序运行时的环境,包含 jvm 和运行时所需要的 核心类库。
- jdk:java 程序开发工具包,包含 jre 和 开发人员 使用的工具。
java 内存划分
-
栈(Stack):
- 局部变量:方法的参数,或者方法内部的变量。
- 作用域:一旦 超过 作用域 { },立即从栈内存当中 消失。
- 特点:
- 栈是方法执行内存的模型,每个 方法 调用都会创建一个 栈内存 用来存储局部变量、操作数、方法出口等。
- jvm 会为每个线程创建一个栈。
- 栈线程 私有,不能实现线程的共享。
- 栈存储特征是 “先进后出,后进先出”。
- 栈是个连续的内存空间,速度快。
-
堆(Heap):
- 凡是 new 出来的东西,都在 “堆”当中。
- 堆用于存储创建好的对象和数组。
- jvm 只有一个堆,被所有线程共享。
- 堆是不连续的内存空间,分配灵活,速度慢。
-
方法区(MethodArea):
- 方法区实际上也是堆,只用于存储类、常量相关的信息。
- jvm 只有一个方法区,被所有线程共享。
- 用来存放程序中永远不变或唯一的内容。
-
本地方法栈(NativeMethodStack):与操作系统相关。
-
寄存器(PCRegister):与 PC 相关。
java 注释/关键字/标识符
-
注释
- 单行注释://
- 多行注释: /* */
- 文档注释:/** */
-
关键字
- java 编程语言保留字。
- 标识符起名不可以使用关键字。
-
标识符
- 命名规则
- java 对大小写敏感。
- 标识符可以给变量、类、方法和包进行命名。
- 标识符必须以字母、下划线或美元符号 $ 开头。
- 驼峰命名法
- 表示 类名 使用大驼峰。(就是所有单词都大写)
- 表示 方法 和 变量 使用小驼峰。(就是除了第一个单词,所有都大写)
- 命名规则
常量和 final(字符常量)
输出格式:
-
字符常量
System.out.println("ABC");
-
整数常量
System.out.println(30);
-
浮点数常量
System.out.println(3.14);
-
字符常量
System.out.println('A');
-
布尔常量
System.out.println(true); // 布尔常量只有 true 和 false
-
字符常量
final 数据类型 变量名; // 被 final 修饰的变量只能赋值一次
-
注意:
- println 中 ln 表示换行的意思。
变量
-
变量分类
- 局部变量:
- 方法中的变量。
- 局部变量在栈内存。
- 局部变量没有默认值。
- 成员变量:
-
类中方法外的变量。
-
成员变量在堆内存。
-
成员变量有默认值。
数据类型 默认值 int 0 double 0.0 char \u0000 boolean false
-
- 静态变量:
- 静态变量又称类变量
- 使用 static 定义
- 局部变量:
-
赋值方法
- 第一种 赋值方法
数据类型 变量名; 变量名 = 元素;
- 第二种 赋值方法
数据类型 变量名 = 元素;
- 注意:
- float 类型赋值必须在元素后面添加 F
- long 类型赋值必须在元素后面添加 L
- 第一种 赋值方法
数据类型
-
基本数据类型
- 字符类型:char
- 字符类型在内存中占 2 个字节。
- char 类型用来表示 Unicode 编码表中的字符。
- 在 print 中使用两个 char 类型需要使用 + 拼接。
- 字符串类型:String
- 布尔类型:boolean
- 数值类型:
- 整数类型:byte、short、int、long
- 浮点类型:float、double
- 字符类型:char
-
引用类型:
- 类:class
- 接口:interface
- 数组
-
转义字符
转义符 含义 Uniocde值 \b 退格 \u0008 \n 换行 \u000a \r 回车 \u000b \t 制表符 \u0009 " 双引号 \u0022 \ ’ 单引号 \u0027 \ \ 反斜杠 \u005c -
数据类型转换
- 自动转换:
- 特点:代码不需要进行特殊处理,自动完成转换。
- 规则:数据类型只能从小到大转换。
- 自动转换类型:
- byte -> short -> int -> long
- char -> int -> double
- float -> double
- 强制转换:
- 特点:代码需要进行特殊处理。
- 格式:
小数据类型 变量名 =(大数据类型)元素
- 注意事项:
- 强制类型转换可能发生 精度损失、数据溢出。
- 如果两个数 超过 了原本的数据类型,可以在计算的时候把其中一个转换成大数据类型。
- 自动转换:
运算符
-
运算符分类:
运算符 符号 算术运算符 +、-、*、/、%(取余)、++(自增)、–(自减) 赋值运算符 =、+=、-=、*=、/= 比较运算符 >、<、==、>=、<=、!=(不等于) 逻辑运算符 &&(与)、 ||
(或)、!(非)、^(逻辑异或)位运算符 &、 |
、^、~、>>、<<、>>>三元运算符 ? : 字符串连接符 + - 注:
- 运算符有优先级,可以通过 “( )”进行优先级设置。
- 注:
-
算术运算符:
- 算术运算规则:
- 如果两个数有一个是 long,结果为 long,否则结果为 int。
- 如果两个数有一个是 double,则结果为 double,否则结果为 float。
- 加法的多种用法:
- 对于“数值”来说,就是加法。
- 对于“char”来说,就是自动转换成 int 类型,在计算。
- 对于“String”来说,就是把两个“String”拼接起来。
- 在 String 类型后面 使用 加法会使数据类型发生拼接。
- 自增自减:
- 单独使用没有区别。
- 在混合使用的时候:
- 前++:先自增,后运算。
- 后++:先运算,后自增。
- 取模运算(又称求余运算):
- 浮点数可以使用,一般使用整数。
- 格式:
变量名=整数%整数
- 注意:运算过程中有大数据类型,结果将会被转换成大数据类型。
- 算术运算规则:
-
赋值运算符
- 基本 格式:
数据类型 变量名 = 元素
- 注意:
- 只有变量能赋值,常量不能赋值。
- 赋值运算符中蕴含了一个强制类型转换。
- 如果赋值运算符右边有算术运算符,则会先运算算术运算符再赋值。
- 使用符合运算符需要先初始化。
- 基本 格式:
-
比较运算符(又称关系运算符)
- 大部分用在判断语句。
- 两个元素比较,结果为真表示 true,否则表示 false。
-
逻辑运算符:
- &(与):两边结果全都是真才是 true,否则为 false。
- |(或):两边结果有一个为真就是 true,否则为 false。
- &&(短路与):只有一个为 false,就返回 false。
- ||(短路或):只有一个为 true,就返回 true。
- !(非):本来是 true,变成false,本来是 false,变成 true。
- ^(异或):相同为 false,不同为 true。
- 注意:
- 逻辑运算符只能使用 Boolean 值,进行判断。
- 与 、或,如果有多个条件,可以连续写。
-
位运算符
-
位运算指的是 二进制运算。
-
位运算说明:
位运算符 含义 ~ 取反 & 按位与 | 按位或 ^ 按位异或 << 左移运算符,左移 1 位相当于乘 2 >> 右移运算符,右移 1 位相当于除 2 取商
-
-
三元运算符
- 一元 运算符:只需要一个元素就可以进行运算的运算符。
- 如:自增、自减…
- 二元 运算符:需要两个元素才可以进行运算的运算符。
- 如:加减法…
- 三元 运算符:需要三个元素才可以进行运算的运算符。
- 三元运算符 格式:
数据类型 变量名 = 判断条件 ? 元素1:元素2;
- 运行 规则:
- 如果判断条件为 true,则返回元素1,为 false 返回元素2。
- 三元运算符可以在元素的位置通过 “( )”嵌套 三元运算符。
- 注意:
- 必须同时保证元素1 和元素2 都和左侧数据类型相同。
- 三元运算符 格式:
- 一元 运算符:只需要一个元素就可以进行运算的运算符。
判断语句(又称选择语句)
-
if 语句
- if 语句的 三种 用法:
- 单判断:
if(判断条件){ 语句体; }
- 双判断:
if(判断条件){ 语句体; }else{ 语句体; }
- 多判断:
if(判断条件){ 语句体; }else if(判断条件){ 语句体; }else{ 语句体; }
- 单判断:
- 注意:
- 判断条件值为布尔值。
- 判断条件可以使用逻辑运算符。
- if 语句的 三种 用法:
-
switch 多选择结构
- 格式:
switch(表达式){ case 元素1: 语句体;[break;] //如:System.out.println() case 元素2: 语句体;[break;] default: 语句体;[break;] }
- 注意:
- case 后面的 “值”不可以重复。
- switch 中的表达式只能是基本数据类型和引用数据类型。
- switch 具有穿透性,运行时没有 break 会继续执行。
- 格式:
循环语句
-
循环结构分为 两大类:
- 一类是当型
- 一类是直到型
-
循环基本结构:
- 初始化语句:循环开始最初执行,只做一次。
- 条件判断:如果成立循环继续,否则循环结束。
- 循环体:重复要做的事情。
- 步进迭代:控制循环的语句。
-
for 循环
- 格式:
for(初始化语句;条件判断;步进迭代){ 循环体; }
- 注意:
- 重复 次数确定 的使用 for 循环。
- 初始化语句如果有多个条件可以通过 逗号分隔。
- 在 for 循环初始化语句中定义的 变量,在 for 循环外不能使用。
- 格式:
-
while 循环
- 格式:
while(条件判断){ 循环体; 步进迭代; }
- 格式:
-
do … while 循环
- 格式:
do{ 循环体; 步进迭代; }(条件判断语句);
- 格式:
-
循环的特点:
- for 和 while 循环如果判断条件不成立,则不会执行,do … while 循环会执行一次。
- 只有 for 循环有初始化语句。
- 三个循环都能使用循环 嵌套。
-
控制函数
- break 函数
- 结束循环。
- switch 语句中当做结束语句。
- continue 函数
- 结束本次循环,进行下一次循环。
- 大部分在循环中使用。
- 标签 break 和 continue 函数(就是 goto 语句)
// 本标签的作用是调到开头 标签名:for(初始化语句;条件判断;步进迭代){ if(条件判断){ break 标签名; // 设置标签 } } // java 支持标签,但不支持使用。
- break 函数
语句块
- 使用括号括起来简单 java 语句。
- 语句块没有名字。
- 用来确定局部变量的作用域。
方法
-
概述:
- 方法就是一段用来完成特定功能的代码片段,类似于其它语言的函数。
-
方法的 三要素:
- 返回值类型
- 方法名称
- 参数列表
-
方法格式
- 方法声明格式:
// 无返回值 [ 修饰符 ] void 方法名( [数据类型 形参] ){ 方法体; } // 有返回值 [ 修饰符 ] 返回值类型 方法名(数据类型 形参){ 方法体; return 返回值; }
- 方法的调用:
类名 对象名 = new 类名(); 对象名.方法名()
- 调用说明:
- 如果要直接调用需要添加 static [修饰符]
- 调用说明:
- 方法详细说明
- 返回值类型:用于规定返回值的数据类型。
- 数据类型:用于规定方法接收的数据类型。
- 参数名:在方法声明时用于接收外界传入的数据。
- 实参:调用方法时传给方法的数据。
- 返回值:方法调用完返回给调用处的数据。
- 方法的重载
- 方法重载只有名称相同。
- 重载的条件:
- 形参类型、形参个数、形参类型顺序不同。
- 只有返回值或形参名称不同不构成重载。
- 方法注意事项
- 实参和形参数据类型和个数必须匹配。
- return 语句会终止程序,并不允许有程序在 return 后面。
- java 中方法参数传递的是数据的副本。
- 基本数据类型传递的是该数据值的 copy 值。引用类型也一样,但指向的是同一对象。
- 方法声明格式:
递归算法
-
递归 基本思想 是 “自己调用自己”
-
递归结构包括两部分
- 递归头:递归结束条件,如果没有将陷入死循环。
- 递归头:控制递归开始。
public static void main(String[] args) { System.out.println(方法名(1)); } // 方法 static int 方法名(int a) { // 递归头 if(a == 1){ return a; // 递归体 }else{ return am(a+1); } }
-
递归优点:程序简单。
-
递归缺点
- 占用大量系统堆栈。
- 内存消耗多。
- 调用层次多时速度比循环慢。
函数
- 随机数
- Math.random()
- 格式
double 变量名 = Math.random();
- 使用:
- 可以通过强制转换将随机数转换成 int 类型。
- 格式
- Math.random()