Java-韩顺平笔记
基础知识
- JDK:Java开发工具包
- JDK = JRE+java的开发工具[java,javac,javadoc,javap等]
- JRE:java运行环境 JRE = JVM+java核心类库[类]
- JDK = JRE + 开发工具集
- jRE = JVM + javaSE标准类库
- 如果只想运行开发好的.class文件,只需要JRE
流程分析
.java 文件—javac—>.class—java—>结果
源文件–编译–>字节码文件–运行–>结果
开发注意事项和细节说明
- java 源文件以.java 为扩展名。源文件的基本组成部分是类(class)
- java 应用程序执行入口时 main()方法,
- java 语言严格区分大小写
- 每条语句以;结尾
- 一个源文件最多只能有一个 public 类,其他类不限数量
- 打括号都是成对出现,缺一不可[习惯先写{}再写代码]
- 如果源文件包含一个 public 类,则文件名必须按该类名命名
- 一个源文件最多只能有一个 public 类,其他类不限数量,也可以将 main 方法写在其他的非 public 类中,然后指定运行非 public 类,这样入口方法就是非 public 的 main 方法
转义字符
转义字符 | 含义 |
---|---|
\t | 一个制表符,实现对齐功能 |
\n | 换行符 |
\\ | 一个\ |
\“ | 一个” |
\‘ | 一个’ |
\r | 一个回车 |
1 | package javabase; |
易犯的错误
- 找不到文件
- 主类名于文件名不一致
- 缺少分号
注释
- 将自己的思想通过注释先整理出来,再用代码去体现
- 单行注释
- 多行注释
- 文档注释
单行注释
- 格式: // 注释文本
多行注释
- 格式 :/* 注释文本 */
文档注释
- 格式:/** 注释文本 */
使用细节:
- 被注释的文字,不会被 JVM 解释执行
- 多行注释里面不允许有多行注释嵌套
文档注释
注释内容可以被 JDK 提供的工具 javadoc 所解析,生产一套以网页形式呈现的呈现的说明文档,一般写在类
1 | package javabase; |
1 | javadoc -d . -author -version TransferredMeaning |
-d 指定地址
-author 指定作者标签
-version 指定版本标签
java 代码规范
- 类、方法的注释要以 javadoc 的方式来写
- 非 javadoc 的注释往往时给代码的维护者看的,着重告诉读者如何修改,注意什么问题
- 使用 tab 操作,实现缩进,默认整体移动,时候用 shift+tab 整体向右移动
- 运算符和=两边习惯性各加一个空格
- 源文件使用 utf-8 编码
- 行宽不要超过 80 字符
- 代码编写次行风格和行尾风格(推荐)
变量原理
变量是程序基本组成单位
三个基本要素(类型+名称+值)
底层名称就像指针,指向内存中的值
变量的概念
变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号外面可以找到房间,而通过变量名可以访问到变量值
基本步骤
1.声明变量
int a;
2.赋值
a=10;
变量使用细节
- 变量表示内存中的一个存储区域[不同的变量,类型不同,占用的空间大小不同]
- 该区域有自己的名称[变量名]和类型[数据类型]
- 变量必须先声明,后使用,即有顺序
- 该区域的数据/值可以在同一类型范围内不断改变
- 变量在同一个作用于内不能重名
- 变量=变量名+值+数据类型
加号的使用
当左右两边都是数值时,做加法运算
当左右两边为字符串,则做拼接运算
数据类型
每一种数据都定义了明确的数据类型,在内侧中分配了不同大小的内存空间
1 | 数据类型: |
整数类型
类型 | 占用空间 | 范围 |
---|---|---|
byte | 1 | -128~127 |
short | 2 | -2^15~2^15-1 |
int | 4 | -2^32~2^32-1 |
long | 8 | -2^63~2^63-1 |
整型细节
- java 各整数类型有固定的范围和字段长度,不受具体 os 的影响,以保证 java 呈现的可以移植性
- java 的整型常量默认为 int 型,声明 long 型出来需要在后面加**’l’或”L”**
- java 程序中变量常声明 int 型,除非不足以表示大数,才使用 long
- bit:计算机中最小存储单位,byte:计算机中基本存储单元,1byte = 8bit
1 | int n1 = 1; //4个字节 |
浮点型使用
类型 | 占用空间 |
---|---|
单精度 float | 4 字节 |
双精度 double | 8 字节 |
浮点数=符号位+指数位+尾数位
尾数部分可能丢失,造成精度损失(小数都是近似值)
小数相加都是近似值
浮点型细节
与整数类型类似,java 浮点类型也有固定的范围和字段长度,不受具体 os 的影响
java 的浮点型常量默认为 double 型,声明 float 型常量,须后加’f’或’F’
- 因为默认时 double 所以 float n1 = 1.1;会报错加个 f 就不会报错了
浮点型常量有两种形式
- 十进制形式:如 5.12, 512.0f, .512(必须要有小数点)。
- 科学计数形式:如 5.12e2[5.12*10 的 2 次方] 5.12E-2[5.12 除以 10 的 2 次方]
- 0.532 可以省略 0 但不能省略.
通常情况下,应该使用 double 型因为它比 float 型更精确
``` java
double num9 = 2.1234567851;//2.1234567851
float num10 = 2.1234567851F;//2.1234567float num1 = 1.1;//错误
float num2 = 1.1F;//对
double num3 = 1.1;//对
double num4 = 1.1f;//对
double num5 = .123;//等价0.123
System.out.println(5.12e2);//512.0
System.out.println(5.12E-2);//0.05121
2
3
4
5
6
7
8
9
10
11
12
13
5. 浮点数使用陷阱:2.7 和 8.1/3 比较
1. ```java
double num11 = 2.7;//2.7
double num12 = 8/3;//2.6999999999999997
//错误写法
if( num11 == num12) {
System.out.println("num11 == num12 相等");
}
//正确写法
if(Math.abs(num11 - num12) < 0.000001 ) {
System.out.println("差值非常小,到我的规定精度,认为相等...");
}当我们运算结果时小数的进行相判断,要小心 错误写法 num11 == num12
应该是以两个数的差值的绝对值,在某个精度范围类判断 Math.abs(num11 - num12)<0.000001
单精度太长,会被舍去
API 文档
JDK->包->类、接口、异常->构造方法、字段、成员方法
字符类型(char)
字符类型可以表示单个字符,字符类型是 char,char 是两个字节(可以存放汉字)多个字符我们用字符串 String
可以直接存放一个数字
1 | char c1 = 'a'; |
字符类型细节
- 字符常量使用单引号(‘’)括起来的单个字符,双引号会报错
- java 中允许使用转义字符’\n’来将其后的字符转变为特殊字符常量
- 在 java 中,char 的本质是一个整数,在默认输出时Uniconde 码对应的字符,要输出数字须转型为 int
- 可以直接给 char 赋一个整数,然后输出时,会按照对应的 unicode 字符输出
- char 类型是可以进行运算的,相当于一个整数,因为它都对应有 unicode 码
1 | char c1 = 97; |
字符型的本质
- 字符型存储到家睡觉中,需要将字符对于到码值(整数)找出来
- 存储:’a’==>码值 97==>二进制==>存储
- 读取:二进制==>97==>’a’=>显示
- 字符和码值的对应关系是通过字符编码表决定的
- 编码表
- ASCII(一个字节表示,一个 128 个字符)
- Unicode(固定大小的编码,使用两个字节来表示,字符和汉字统一都是占用两个字节)
- utf-8(大小可变,字母使用 1 个字节,汉字 3 个字节)
- gbk(可以表示汉字,而且范围广,字母 1 字节,汉字 2 字节)
- Gb2312(可以表示汉字,关闭 312<gbk)
- big5 码(繁体中文,台湾,香港)
常用编码(了解)
- ASCII 码 ,缺点不能完全显示
- Unicode 的好处一种编码,将世界上所有字符的符号都纳入其中,每一个符号都给予一个独一无二的编码,使用 Unicode 没有乱码问题,缺点,一个英文和一个汉字都占 2 字节,对于存储空间来说是浪费
- Unicode 码兼容 ASCII
- UTF-8 是互联网上使用最广泛的一种 Unicode 的实现方式
- 使用大小可变的编码,字母 1 字节,汉字 3 字节
布尔类型
- 布尔类型也叫 boolean,只允许取值 true 和 false,无 null
- boolean 类型占 1 字节
- boolean 适用于逻辑运算,一般用于程序流控制
使用细节说明:
不可以 0 或非 0 的整数代替 false
基本类型转换
当java程序在进行赋值或者运算时,精度小的类型自动转换为精度大的类型,这就是自动类型转换
char -> int ->long -> float -> double
byte ->short -> int -> long -> float -> double
1 | int a = 'c'; |
基本数据类型转换细节
有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算
当我们把精度大的数据类型赋值给精度小的数据类型时,就会报错,反之就会进行自动类型转换
(Byte,short)和char之间不会相互自动转换
byte,short,char他们三者可以计算,在计算时首先转换为int类型
boolean不参与转换
自动提升原则:表达式结果的类型自动提升为操作数中最大的类型
当把具体数赋给byte 时,(1)先判断该数是否在byte 范围内,如果是就可以,如果是变量赋值则不行
1 | int n1 = 10;//ok |
1 | //细节4: byte,short,char 他们三者可以计算,在计算时首先转换为int 类型 |
强制类型转换(ForceConvent)
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型,使用时要加上强制转换符(),但可能造成精度降低或溢出,格外要注意
1 | int i = (int)1.9; //精度降低 |
强制类型转换细节
当进行数据的从大的类型转向小的类型时,就需要使用到强制转换
强制符号只针对最进的操作有效,往往会使用小括号提升优先级
- ``` java
// int x = (int)103.5+61.5;
int y = (int)(103.5+61.5);
System.out.println(y);1
2
3
4
5
6
7
8
9
10
11
3. char类型可以保存int的常量**值**,但不能保存int的**变量**值,需要强转
1. ``` java
char c1 = 100; // ok
int m = 100; // ok
char c2 = m; // 错误
char c3 = (char)m; // ok
System.out.println(c3)// 100对应的字符
- ``` java
byte、short、char类型进行运算时,当作int类型处理
练习题
1 | short s = 12;//ok 12虽然时整型,但是在sort范围内,所以赋值时,先看是否在范围内 |
基本数据类型和String类型的转换
基本类型转String类型
语法:基本类型的值 +””
String类型转基本数据类型
语法:通过基本类型的包装类调用parseXX方法即可
1 | //基本数据类型->String |
基本数据类型和String类型的转换细节
- 在将String类型转成基本数据类型时,要确保String类型能够转成有效的数据,比如我们把“123”转成一个整数,但是不能把“hello”转换成一个整数
- 如果格式不正确,就会抛出异常,程序就会终止,这个问题在异常处理章节会处理
运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 赋值运算符
- 三元运算符
- 位运算
- 运算符优先级
用以表示数据的运算,赋值,比较
算术运算符
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
+ | 正号 | +7 | 7 |
- | 负号 | b=11;-b | -11 |
+ | 加 | 9+9 | 18 |
- | 减 | 10-8 | 2 |
/ | 除 | 9/9 | 1 |
% | 取模 | 11%9 | 2 |
++ | 自增(前):先运算后取值,自增(后):先取值后运算 | a=2;b=++a; a=2;b=a++ | a=3;b=3 |
算术运算符的具体使用(ArithmeticOperator)
+,-,*,/,%,++,–,重点讲/,%,++
在% 的本质看一个公式!!!! a % b = a - a / b * b
```java
//使用
System.out.println(10 / 4); //从数学来看是2.5, java 中2
System.out.println(10.0 / 4); //java 是2.5
// 注释快捷键ctrl + /, 再次输入ctrl + / 取消注释
double d = 10 / 4;//java 中10 / 4 = 2, 2=>2.0
System.out.println(d);// 是2.0
// % 取模,取余
// 在% 的本质看一个公式!!!! a % b = a - a / b * b
// -10 % 3 => -10 - (-10) / 3 * 3 = -10 + 9 = -1
// 10 % -3 = 10 - 10 / (-3) * (-3) = 10 - 9 = 1
// -10 % -3 = (-10) - (-10) / (-3) * (-3) = -10 + 9 = -1
System.out.println(10 % 3); //1
System.out.println(-10 % 3); // -1
System.out.println(10 % -3); //1
System.out.println(-10 % -3);//-1
//++的使用
//
int i = 10;
i++;//自增等价于i = i + 1; => i = 11
++i;//自增等价于i = i + 1; => i = 12
System.out.println(“i=” + i);//12
/*
作为表达式使用
前++:++i 先自增后赋值
后++:i++先赋值后自增
*/
int j = 8;
//int k = ++j; //等价j=j+1;k=j;
int k = j++; // 等价k =j;j=j+1;
System.out.println(“k=” + k + “j=” + j);//8 91
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2. 自增++
1. 作为独立的语句使用
2. 前++和后++都完全等价于i=i+1
3. 作为表达式使用
前++:++i 先自增后赋值
后++:i++先赋值后自增
3. --,+,-,*是一个道理,完全可以类推
1. 对于除号"/",它的整数除和小数除湿有区别的:整数之间做除法时,只保留整数部分,而舍去小数部分
2. 党对一个数取模时,可以等价a % b = a - a / b * b,这样我们可以看到取模的一个本质运算
3. 当自增当作一个独立语言使用时,不管是++i还是i++都是一样的,等价
4. 当自增当作一个表达式使用时j=++i等价?
5. 当自增当作一个表达式使用时j=i++等价?
1. 面试题
1. ``` java
int i = 1;//i->1
i = i++;//规则使用变量(1)temp = i;(2)i=i+1;(3)i=temp;
System.out.println(i);//1``` java
int i = 1;//i->1
i = ++i;//规则使用变量(1)i=i+1;(2)temp = i;(3)i=temp;
System.out.println(i);//11
2
3
4
5
6
7
``` JAVA
1) 假如还有59 天放假,问:合xx 个星期零xx 天
2) 定义一个变量保存华氏温度,华氏温度转换摄氏温度的公式为:5/9*(华氏温度-100),请求出华氏温度对应的摄氏温度。
[234.5]
1 | //1.需求: |
1 | //定义一个变量保存华氏温度,华氏温度转换摄氏温度的公式为 |
关系运算符
关系运算符的结果都是boolean 型,也就是要么是true,要么是false
关系表达式经常用在if 结构的条件中或循环结构的条件中
==,!=,<,><=,>=,instanceof检查是否是类的对象
- 关系运算符的结果都是boolean 型,也就是要么是true,要么是false。
关系运算符组成的表达式,我们称为关系表达式。a > b
比较运算符”==”不能误写成”=”
逻辑运算符
短路与&& , 短路或||,取反!
逻辑与&,逻辑或|,^ 逻辑异或
说明逻辑运算规则:
a&b : & 叫逻辑与:规则:当a 和b 同时为true ,则结果为true, 否则为false
a&&b : && 叫短路与:规则:当a 和b 同时为true ,则结果为true,否则为false
a|b : | 叫逻辑或,规则:当a 和b ,有一个为true ,则结果为true,否则为false
a||b : || 叫短路或,规则:当a 和b ,有一个为true ,则结果为true,否则为false
!a : 叫取反,或者非运算。当a 为true, 则结果为false, 当a 为false 是,结果为true
a^b: 叫逻辑异或,当a 和b 不同时,则结果为true, 否则为false
4.4.3&& 和& 基本规则
名称语法特点
短路与&& 条件1&&条件2 两个条件都为true,结果为true,否则false
逻辑与& 条件1&条件2 两个条件都为true,结果为true,否则false
1 | //&&短路与和& 案例演示 |
&&短路与:如果第一个条件为false,则第二个条件不会判断,最终结果为false,效率高
& 逻辑与:不管第一个条件是否为false,第二个条件都要判断,效率低
开发中, 我们使用的基本是使用短路与&&, 效率高
或运算
4.4.6|| 和| 基本规则
名称语法特点
短路或|| 条件1||条件2 两个条件中只要有一个成立,结果为true,否则为false
|逻辑或条件1|条件2 只要有一个条件成立,结果为true,否则为false
1 | //||短路或和|逻辑或案例演示 |
4.4.8|| 和| 使用区别
||短路或:如果第一个条件为true,则第二个条件不会判断,最终结果为true,效率高
| 逻辑或:不管第一个条件是否为true,第二个条件都要判断,效率低
开发中,我们基本使用||
4.4.9! 取反基本规则
名称语法特点
! 非(取反) !条件如果条件本身成立,结果为false,否则为true
1 | //! 操作是取反T->F , F -> T |
a^b: 叫逻辑异或,当a 和b 不同时,则结果为true, 否则为false
^逻辑异或,System.out.println( (4 < 1) ^ (6 > 3) ); // ?
练习
1 | int x = 5; |
1 | int x = 5; |
1 | int x = 5; |
1 | int x = 5; |
赋值运算符
分类
- 基本赋值运算符 int a = 10;
- 复合运算符
- +=,-=,*=,/=,%=,重点讲+=
赋值运算符演示
- 运算顺序从右向左
- 赋值运算符的左边,只能是变量,右边可以是变量,表达式,常量值
- 复合赋值运算符等价于 a+=3. a=a+3
- 复合运算符会进行类型转换 byte b = 2;b += 3 b=(byte)(b+2)
- b++ b=(byte)(b+1)
三元运算符
语法
1 | 条件表达式?表达式1:表达式2; |
运算规则:
1.如果条件表达式为true,运算后的结果是表达式1;
2.如果条件表达式为false,运算后的结果是表达式2;
三元运算符细节
- 表达式1和表达式2要诶可以赋值给接收变量的类型(或可以自动转换)
- 三元运算符可以转换成if-else语句
1 | int a = 3; |
运算符的优先级
标识符的命名规则和规范
- java对各种变量、方法和类等命名时使用字符序列称为标识符
- 凡是自己可以起名字的地方都叫标识符
标识符命名规则
- 由26个英文字母大小写,0~9,_或$组成
- 数字不可以开头
- 不可以使用关键字和保留字,但能包含关键字和保留字
- java中严格区分大小写,长度无限制
- 标识符不能包含空格
标识符命名的规范
- 包名:多单词组成时所有字母都小写
- 类名、接口名:多个单子组成时,所有单词的首字母大写(大驼峰)
- 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写
- 常量名:所有字母都大写,多单词时每个单词用下划线连接
- 后面我们学习到类,包,接口,等时,我们的命名规范要这样遵守
关键字
被java语言赋予特殊含义,专门用途哦的字符串
特点:关键字中所有字母都为小写
保留字:现在java版本尚未使用,但以后版本可能会作为关键字使用,自己命名时应避免使用这些保留字
键盘输入语句
扫描器:Scanner
步骤
- 导入该类所在包 java.util.*
- 创建类对象(声明变量)
- 接收用户的输入,使用相关的方法
1 | Scanner scanner = new Scanner(System.in); |
进制
- 二进制以0b或0B开头
- 十进制
- 八进制以0开头
- 十六进制一0x或0X开头,A-F不区分大小写
进制转换
二转八、十六
三位一组,4位一组
原码、反码、补码
对于有符号的而言
- 二进制的最高位是符号位:0表示正数,1表示负数(0->0,1->-)
- 正数的原码,反码,补码都一样(三合一)
- 负数的反码=它原码符号位不变,其他位取反(0->1,1->0)
- 负数的补码=它的反码+1,负数的反码=负数的补码-1
- 0的反码,补码都是0
- java没有无符号数,换言之,java中的数都是由符号的
- 在计算机运算的时候,都是以补码的方式来运算的
- 党我们看运算结果的时候,要看它的原码
位运算
java中有8个位运算符(&,|,^,~,>>,<<,>>>)
分别是按位与&,按位或|,按位异或^按位取反~,他们的运算规则是:
按位与&:两位全为1,结果为1,否则为0
按位或|:两位有一个为1,结果为1,否则为0
按位异或^:两个一个为0一个为1,结果为1,否则为0
按位取反~:0>1,1>0
1 | System.out.println(~-2); //1 |
3个位运算符>>、<<和>>>
- 算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位
- 算术左移<<:符号位不变,低位补0
- >>>逻辑右移也叫无符号右移,运算规则是:低位溢出,高位补0
- 特变说明:没有<<<
向右边移动一位相当于除以2
向左移动一位相当于乘以2
1 | -10.5%3=-1.5 |
1 | int num1 = (int)"18";//错误 Interger.parseInt("18") |
控制结构
顺序控制
查询从上到下逐行执行,中间没有任何判断和跳转
分支控制(if-else)
单分支
基本语法
1 | if (条件表达式){ |
当条件表达式为true时,就会执行{}中的代码,如果为false就不执行
如果{}中只有一条语句,则可以不用{}但建议写上
双分支
基本语法
1 | if (条件表达式){ |
多分支
基本语法
1 | if (条件表达式){ |
只能有一个执行入口
特别说明:多分支可以没有else,如果所有条件都不成立,则一个执行入口都没有
注意判断范围
嵌套分支
规范:不要超过3层
Switch分支结构
- switch关键字,表示分支
- 表达式对应一个值
- case常量1:当表达式的值等于常量1,就执行语句块1
- break:表示退出swtich
- 如果和case常量1匹配,就执行语句块1,如果没有匹配就继续匹配2
- 如果一个都没匹配上就执行default
没break会穿透
细节讨论
表达式数据类型,应和case后的常量类型一致,或者是可以自动转成可以互相比较多类型
switch(表达式)中表达式的返回值必须是(byte,short,int,char,enum,String)
- ```java
double c = 1.1;
switch(c){//错误
}case 1.1: System.out.println("ok"); break;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
* case子句中的值必须是常量,而不能是变量
* default子句是可选的,当没有匹配的case时,执行default
* break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有写break,程序会顺序执行到switch结尾
## switch与if-else的区别
* 如果判断的具体数值不多而且符合byte、short、int、char、enum、String这6种类型。虽然两个语句都可以使用,建议使用switch语句
* 其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广
## for循环控制
循环操作只有一条语句可以省略{}但不建议省略
## 细节
1. 循环条件时返回一个布尔值的表达式
2. for(;循环判断条件;)中的初始化和变量迭代可以写到其他地方,但两边的分号不能省略
3. 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用**逗号**隔开,循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开
4. ```
int count = 3;
for (int i = 0,j = 0; i < count;i++, j+=2){
System.out.println(i+""+j);
}
- ```java
while循环控制
1 | while(循环条件){ |
while也有四要素
细节
循环条件返回的事一个布尔值
执行时先判断后执行
do while
134 多重循环
最好不要超过3次
设置外层循环次数为m次,内层为n次,则内层循环提实际上需要执行m*n次
break
当某个条件满足时,终止小循环
细节
break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的时那一层的语句块
标签的基本使用
1 | lable1: |
- break语句可以指定退出那一层
- lable1时标签,由程序员决定
- break后指定到那个lable就退出到那里
- 在实际的开发中,尽量不要使用标签
- 如果没有指定break,默认退出最近的循环体
144 continue
用于结束本次循环,继续执行下一次循环
continue语句出现在多层嵌套语句体中时,可以通过标签指明要逃过的时那一层循环,这个和签名的标签的使用的规则一样
跳转控制语句 return
用来方法中,跳出所在方法,如果在main方阵中则是退出程序
158 数组
第一种用法
定义
1 | double[] a = new double[5]; |
数组的引用
数组名[索引]
第二种用法
先声明
Double[] a;
创建数组
数组名=new double[5];
第三种用法
数据类型[] 数组名={1,2,3….}
这个用法相当于int[] a = new int[9];
a[0]=1;a[1]=2….
注意事项
- 数组时多个相同类型数据的组合,实现对这个数据的统一管理
- 数组重点元素可以时任何数据类型,包括基本类型和引用类型,但是不能混用
- 数组创建后,如果没有赋值,有默认值int 0, short 0, byte 0,long 0,float 0.0,double 0.0,char \u0000boolean false, String null
- 使用数组的步骤,1.声明数组并开辟空间,2给数组个元素赋值,3.使用数组
- 数组的下表从0开始
- 数组下表必须在指定范围内使用,否则报下表越界异常
- 数组属引用来性,数组型数据时对象
数组的扩容,索减、排序、查找
183-273
包原理
三大作用:
- 区分相同名字的类
- 当类很多时,可以很好的管理类
- 控制访问范围
包语法:
1 | package com.hspedu; |
包的本质分析
实际上包的本质就是创建不同的文件夹来保存类文件
包的命名
命名规则:
智能包含数字、字母、下划线、小圆点、但不能用一数字开头,不能时关键字或保留字
命名规范:
一般是小写字母+小圆点一般是
com.公司名.项目名.业务模块名
常用的包
Java.lang.*//lang包是基本包是默认引入包
java.util.*//util包是系统提供的工具包,工具类,使用Scanner
java.net.*//网络包,网络开发
java.awt.*//是做java的界面开发
如何导入包
语法
Import 包;
访问修饰符
用于控制方法和属性(的访问权限
访问级别 | 访问控制修饰符 | 同类 | 同包 | 子类 | 不同包 |
---|---|---|---|---|---|
公开 | public | 1 | 1 | 1 | 1 |
受保护 | protected | 1 | 1 | 1 | 0 |
默认 | 没有修饰符 | 1 | 1 | 0 | 0 |
私有 | private | 1 | 0 | 0 | 0 |
修饰符可以用来修饰类中的属性。成员方法以及类
只有默认的和public才能修饰类,并且尊顺上述访问权限的特点
成员方法的访问规则和属性完全一样
封装
就是吧抽象出来的数据和对数据的操作封装在一起,数据被保护在内部,查询的其他部分只有通过授权的操作,才能对数据操作
好处:
- 隐藏实现的细节
- 可以对数据进行验证,保证安全合理
封装的步骤
- 将属性私有化private
- 提供一个公共的set方法,用于对属性判断并赋值
- 提供一个get方法,用于获取属性的值
构造器与set相结合
如果直接用构造器指定属性
This.set
继承
继承可以解决代码复用,当类存在相同的属性和方法时可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可
1 | class 子类 extends 父类{ |
- 子类就会自动拥有父类的属性和方法
- 父类又叫超类和基类
- 子类又叫派生类
继承细节1
- 代码的复用性提高了
- 代码的扩展性和维护性提高了
- 子类继承了所有的属性和方法,但是私有属性和方法不能在子类直接方法能间接访问,要通过公共的方法去访问(get,set)
- 子类必须掉用父类的狗朝气,完成父类的初始化
- 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去掉用父类的无参构造器,如果父类没有提供无参构造器去,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化规则,否则,编译不会通过
290
子类必须调用父类的构造器,完成父类的初始化
当创建子类对象时,不管使用子类的那个构造器,默认情况下总会去掉用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构在器中用super去指定使用父类的那个构造器完成对父类的初始化工作,否则,编译不会通过
如果希望指定器掉用父类的某个构造器,则显示的调用一下:super(c参数列表)
super在使用时,需要放在构造器第一行
super()和this()都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
292
java所有类都死object类的子类
父类构造器的调用不限于直接父类 将一致往上追溯到object类