大数据学习路线,从零开始学大数据,学习不迷路
1、什么是标识符?
-在Java程序中以程序员命名的单词为标识符
-标识符可以标识:;类名、方法名、变量名、常量名、接口名
2、标识符的命名规则:
3、标识符的命名规范
只是一种规范,不属于语法,不遵守规范编译不会报错
最好见名知意
遵守驼峰命名方式
SystemService
UserService
类名,接口名: 首字母大写,后面每个单词首字母大写
变量名、方法名: 首字母小写,后面每个单词首字母大写
常量名: 全部大写
关键字在Java语言中全部是小写
常见的关键字有:
public
class
static
void
if
while
…
…
字面值:
--10 、100
--“abc”
--'a'
--true、false
字面值就是数据
字面值是Java源程序的组成之一。包括标识符和关键字它们都是Java源程序的组成部分
数据在计算机语言中也是有类型的:【数据类型】
--10 、100 整数型字面值
--3.14 浮点型字面值
--'a'、‘人’ 字符型字面值
--“abc” 字符串型字面值
--true、false 布尔型字面值
什么是变量?
数据类型的作用?
变量要求:
变量的作用域:
基本数据类型(四大类八大种)
二进制:
数据的一种表示形式,十进制表示满十进一
例如:十进制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
二进制
1 10(2) 11(3) 100(4) 101(5).......
计算机二进制有三种表示方式:
原码、反码、补码
计算机在任何情况下底层表示和储存数据的时候都采用了补码形式
正常的补码:和原码相同
负数的补码:负数的绝对值对应的二进制码所有二进制取反,再加1
子节(byte):
1 byte = 8 bit 【1 个字节等于8个比特位】 (1个比特位等于二进制位: 0 或 1)
1 KB = 1024 Byte
1 MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB
1 TB = 1024 * 1024 * 1024 *1024 * 8
数据类型的取值范围
转义字符:
\n : 换行
\t : 制表符
\ +字符 : 输出字符 如: ' \\ ' 输出: \
整数型字面值有三种表示方式
数据类型转换:
小容量向大容量转换,自动类型转换
大容量向小容量转换,强制类型转换,要加强制类型转换符 : (数据类型)变量
float 单精度【4个字节】
double 双精度【8个字节,精度较高】
在Java中,所有的浮点型字面值默认当作double类型来处理
要想该字面值当作float类型来处理,要在字面值后面添加 f / F
算术运算符
+求和
-相减
* 乘积
/ 商
% 求余数
++ 自加1
-- 自减1
注意:一个表达式中有多个运算符,运算符有优先级,不确定的用小括号,优先级提升
关系运算符
> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
!= 不等于
= 是赋值运算符 , == 是关系运算符
关系运算符的运算结果一定是布尔类型 : true / false
逻辑运算符
& 逻辑与 (两边都是true,结果才是true)
| 逻辑或 (两边有一个是true,结果就是true)
! 逻辑非 (取反,!false就是true,这是一个单目运算符)
^ 逻辑异或 (两边的结果只要不一样,结果就是true)
&& 短路与 如果前面的算子能判断出结果,后面的算子就不再执行
|| 短路或 如果前面的算子能判断出结果,后面的算子就不再执行
1.逻辑运算符的算子两边都要是布尔类型,而且运算的结果也应该是布尔类型
赋值运算符
= 等于(赋值给变量)
+= 加等于 如: i += 2 既 i = i+2
-= 减等于
*= 乘等于
/= 除等于
%= 取余等于
先执行等号右边的表达式,将执行结果赋值给左边的变量
三元运算符
1、语法规则:
布尔表达式 ? 表达式1 : 表达式2
2、三元运算符的执行原理?
当布尔表达式的结果是true的时候,表达式1作为整个表达式的执行结果
当布尔表达式的结果是false的时候,表达式2作为整个表达式的执行结果
向控制台输出: System.out.println();
接受键盘的输入: java.until.Scanner s = new java.Scanner(System.in); //创建键盘扫描对象
String userInputContent = s.next(); // 以字符串的形式接收
if、if else语句
if语句的语法结构,有四种:
第一种:
if(布尔表达式){
Java语句;
Java语句;
.............
}
第二种:
if(布尔表达式){
Java语句;
Java语句;
.............
}else{
Java语句;
Java语句;
.............
}
第三种:
if(布尔表达式){
Java语句;
Java语句;
.............
}else if (布尔表达式){
Java语句;
Java语句;
.............
} else if (布尔表达式){
Java语句;
Java语句;
.............
} else if (布尔表达式){
Java语句;
Java语句;
.............
}
只要有一条语句满足条件,执行完那条语句后控制语句结束
第四种:
if(布尔表达式){
Java语句;
Java语句;
.............
}else if (布尔表达式){
Java语句;
Java语句;
.............
} else if (布尔表达式){
Java语句;
Java语句;
.............
} else if (布尔表达式){
Java语句;
Java语句;
.............
} else{
Java语句;
Java语句;
.............
}
当所有if else语句没有执行,最后执行else语句
注意:
1.所有语句可以嵌套使用,只要合理嵌套就行
2.第二种和第四种可以保证分支百分百会执行
switch语句
1.属于选择结构,也是分支结构
2.语法结构:
switch(int或String类型的字面值或变量){
case int 或 string类型得到字面值或变量:
Java语句;
........
case int 或 string类型得到字面值或变量:
java 语句;
.......
break;
default:
java 语句;
.......
}
3.switch语句的执行原理:
switch后面小括号中的”数据“和case后面的”数据“进行一 一匹配,匹配成功的分支执行。
按照自上而下的顺序依次匹配
4.匹配成功的分支执行,当后面有break,整个switch语句终止。
5.匹配成功的分支执行,后面没有break,直接进入下一个分支执行(不进行匹配)
这种现象称为穿透现象【提供break,语句可以避免被穿透】
6.所有分支都没有匹配成功,当有default语句时,会执行default分支当中的程序。
7.case可以合并:
int i= 10;
swicth(i){
case 1:case 2: case :10:
System.out.print("Test!")
}
for(初始化表达式;布尔表达式;更新表达式){
//是需要重复执行的代码片段【循环体:由java语句组成】
}
for循环执行过程/执行原理
初始化表达式 ,布尔表达式 , 更新表达式都不是必须的!
初始化表达式最先执行,并在整个for循环中只执行一次
布尔表达式的结果只能是true/ false,不能是其他值
for循环执行过程:
1.先执行初始化表达式,并且该表达式只执行一次
2.判断布尔表达式是true还是false,
- 布尔表达式true
执行循环体
执行更新表达式
判断布尔表达式是true还是false
- 布尔表达式true
执行循环体
执行更新表达式
判断布尔表达式是true还是false
..................
-布尔表达式false
循环结束
- 布尔表达式false
循环结束
//例题 --输出1到10
for (i = 1 ; i < = 10 ; i++)
System.out.print(i);
// 死循环
for(;;)
System.out.print("死循环");
// 输出九九乘法表
for( int i = 1; i<10;i++){
for(int j = 1; j < =i; j++){
System.out.print(j + "*" + i + "=" + i*j +" ");
}
System.out.println()
}
//输出结果:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
while 语句
1. while 循环的语法结构:
while(布尔表达式 True){
循环体;
}
2. while循环的执行原理:
先判断布尔表达式的结果:
* true
-执行循环体
* 判断布尔表达式的结果:
*true
-执行循环体
* 判断布尔表达式的结果:
...................
*false
循环结束。
3. while循环的循环次数:
0 ~ N 次
注意:while循环的循环体可能执行次数为0次
do while语句
1. do .....while 循环的语法结构:
do {
循环体;
} while (布尔表达式);
2. do.....while 循环的执行原理:
3. do.....while循环的执行次数:
循环体代码片段执行的次数是 : 1~N次【至少一次】
4. do.....while循环的注意事项:
循环语句最终有一个分号
【修饰符列表】返回值类型 方法名(形式参数列表){
方法体;
}
* 可选项,不是必须的
* 目前统一写成 public static
* 方法的修饰符中有static关键字的话,怎么调用这个方法?
- 类名.方法名(实际参数列表);
* 什么是返回值?
一个方法是可以完成某个特定的功能,这个功能结束之后大多数
要返回最终的执行结果,执行结果可能是一个具体存在的数据。
而这个具体存在的数据就是返回值。
* 返回值类型都可以是哪些数据类型呢?
Java任意一种类型都可以,包括基本数据类型和所有的引用数据类型
* 也可能这个方法执行后不返回任何数据,Java中规定,当一个方法执行
结束之后不返回任何数据的话,返回值的类型必须编写:void关键字
* 返回值是 “ void”的时候,在方法体中不能编写“ return 值 ;” 这样
的语句,但可以编写“ return ;” 语句。
*返回值不是void的时候
1. 要求方法必须百分百的执行“return”值;这样的语句来完成值的返回。
没有这个语句会报错
2. 一个方法有返回值的时候,当我们调用这个方法,方法返回了一个
值,对于调用者来说,这个返回值可以选择接收,也可以选择不接收,
但大部分情况都是选择接收。
* 只要带有return 关键字的语句,这个语句所在的方法结束
* 只要是合法的标识符就行
* 方法名最好见名知意
* 方法名最好是动词
* 方法名首字母小写,后面每个单词首字母大写
*
* 形参是局部变量,int a ; double b ; float c ; String s ;......
* 形参的个数可以是: 0~N个
* 多个形参之间用“逗号” 隔开
* 形参中起决定性作用的是形参的数据类型,形参的名字是就是局部变量的名字。
* 方法在调用的时候,给这个方法传递的真实数据就是实际参数,简称实参
* 实参列表和形参列表必须满足:数量相同和类型对应相同
例如:
方法定义
public static int sum (int a ,int b ){
}
方法调用
sum(“abc”,“def”);编译器报错
sum (10,20); 成功编译
*
*
并且方法体y由Java语句构成,每个java语句以 “;” 结尾
3.方法怎么调用?
方法只定义不去调用是不会执行的, 只有在调用的时候才会执行
语法规则: 《方法的修饰符列表当中static》
类名.方法名(实参列表);<只是一条Java语句 ,
表示调用某个类的某个方法
传递这样的实参>
方法重载:
1. 方法重载又被称为:overload
2. 什么时候考虑方法重载呢?
* 功能相似的时候,尽可能让方法名相同。
【但是,功能不同 / 不相似 的时候,尽可能让方法名不同】
3. 什么条件构成了方法重载?
* 在同一个类中
* 方法名相同
* 参数列表不同
-数量不同
-顺序不同
-类型不同
4. 方法重载和什么有关系?和什么没有关系?
* 方法重载和方法名+参数列表有关
* 方法重载和返回值类型无关
* 方法重载和修饰符列表无关
1. 什么是递归?
方法自身调用自身
a(){
a();
}
2. 递归是很耗费栈内存的,递归算法可以不用的时候尽量不去使用。
3. 以下程序在执行的时候发生了一个这样的错误【不是异常,是错误error】
java.lang.StackOverflowError
栈内存溢出错误
错误发生无法挽回,只有一个结果,就是JVM停止工作。
4. 递归必须有结束条件,没有结束条件一定会发生栈内存错误。
5. 递归有结束条件,即使条件是正确的,也可能发生栈内存溢出错误,
因为递归太深了
注意:
递归能不使用尽量别用
但有些情况下该功能的实现必须依靠递归方式。
面向过程和面向对象的区别:
-面向过程:主要关注点是: 实现的具体过程,因果关系【集成显卡的开发思路】
* 优点:对于业务逻辑比较简单的程序,可以达到快速开发,前期投入成本较低。
* 缺点:采用面向过程的方式开发很难解决非常复杂的业务逻辑, 另外面向过程的
方式导致软件元素之间的 “ 耦合度 ” 非常高,只要其中一环出现问题,
整个系统受到影响,导致最终的软件 “ 扩展力 ” 差,另外,由于没有独立体的
概念,所以无法达到组件复用。
-面向对象:主要关注点是:主要关注对象【独立体】能完成哪些
功能【独立显卡的开发思路】
* 优点: 耦合度低,扩展力强。更容易解决现实世界中更复杂的业务逻辑,组件复用性强。
* 缺点:前期投入成本较高,需要进行独立体的抽取,大量的系统分析与设计。
-C语言是纯面向过程的、C++是半面向对象、Java是纯面向对象
-目前出现的一些新的编程语言多数都是面向对象的,人在认识现实世界
的时候以面向对象的方式。
-面向对象更符合人的思维方式。
- 封装
- 继承
- 多态
所有面向对象的编程语言都有者三大特征。
采用面向对象的方式开发一个软件,生命周期当中:【整个生命周期中贯穿使用OO面向对象方式】
* 面向对象的分析:OOA
* 面向对象的设计:OOD
* 面向对象的编程:OOP
*3.1 什么是类?
- 类在现实世界中是不存在的, 是一个模板,是一个概念,是人类经过大脑思考抽象的结果
- 类代表了一类事物
- 在现实世界中,对象a与对象b之间有相同的特征,进行抽象总结出一个模板,
这个模板称做 “ 类 ”。
* 3.2 什么是对象?
- 对象是实际存在的个体,现实世界当中实际存在。
* 3.3 描述一下整个软件开发的过程:
* 程序员先观察现实世界,从现实世界中寻找对象
* 寻找了N个多对象之后,发现所有的对象都有共同特征
* 程序员在脑海中形成了一个模板【类】
* java程序员可以通过Java代码来表述一个类
* Java程序中有了类的定义
* 然后通过类可以创建对象
* 有了对象之后,可以让对象直接协作起来形成一个系统。
* 类 -- 【实例化】-- >对象
* 对象又被称为实例 / instance
* 对象-- 【抽象】--> 类
* 重点:
类描述的是对象的共同特征。
共同特征例如:身高特征
这个身高在访问的时候,必须先创建对象,通过对象去访问这个特征。
因为这个特征对应具体的某个对象上之后,值不同。有的对象1.80,有的对象身高1.70
* 3.4 一个类主要描述什么信息呢?
一个类主要描述的是 状态 + 动作 。
状态信息:名字、身高、性别、年龄
动作信息:学习、吃饭、睡觉、跳舞
状态--> 一个类的属性
动作--> 一个类的方法
*
类{
属性:// 描述对象的状态信息
方法:// 描述对象的动作信息
}
注意:状态和动作当具体到某个对象上之后,发现最终的结果可能不一样。
语法结构:
[ 修饰符列表 ] class 类名{
属性;
方法;
}
例如:
学生类,描述所有学生对象的共同特征:
学生对象有哪些状态信息:
* 学号【int】
* 名字【string】
* 性别【boolean】
* 年龄【int】
......
学生对象有哪些动作信息:
* 吃饭
* 睡觉
* 学习
* 玩
* 唱歌
* 跳舞
......
重点:属性通常是采用一个变量的形式来完成定义的
int no;
int age;
string name;
string address;
boolean sex;
基本数据类型
byte
short
int
long
float
double
boolean
char
引用数据类型
String.class sun提供的
System.class sun提供的
Student.class 程序员自定义的
User.class 程序员自定义的
…
java语言中所有的class都属于引用数据类型。
封装的好处:
封装的步骤:
关于java类中的构造方法:
构造方法又称为构造函数 / 构造器 / Constructor
构造方法语法结构:
[ 修饰符列表 ] 构造方法名(形参列表){
构造方法体;
}
回顾普通方法的语法结构:
[ 修饰符列表 ] 返回值类型 方法名(形参列表){
方法体;
}
对于构造方法来说,“返回值类型”不需要指定,并且也不能写void,
只要写上void,那这个方法就变成普通方法了。
对于构造方法来说,构造方法名一定要与类名保持一致。
构造方法的作用?
构造方法的意义是,通过构造方法的调用,可以创键对象。
构造方法怎么调用的?
构造方法调用执行之后,有返回值吗?
每一个构造方法调用执行之后都有返回值,但是这个 “ return 值;” 这样的语句不用写。构造方法结束的时候自动返回值 。
并且返回值类型是构造方法所在类的类型。由于构造方法的返回值就是类本身,所以返回值类型不需要写。
当一个类中没有定义任何构造方法,系统默认会给改类提供一个无参数的构造方法,这个构造方法被称为缺省构造器。
当一个类显示的构造方法定义出来了,那么系统则不再默认为这个类提供省构造器。建议开发过程中手动的为当前类提供无参数构造方法。因为无参数的构造方法太常用了。
构造方法支持重载机制。在一个类当中编写多个构造方法,这多个构造方法显然已经构成方法重载机制。
构造方法的作用:
* 对象:目前在使用new运算符在堆内存中开辟的内存空间称为对象。
* 引用:是一个变量,不一定是局部变量,还可能是成员变量。引用保存了内存地址,指向了堆内存的对象
* 所有访问实例相关的数据,都需要通过 “ 引用. ” 的方式访问,因为只有通过引用才能找到对象。
* 只有一个空的引用,访问对象的实例相关的数据会出现空指针异常。
class Student{
Computer com ; // com是一个引用【实例变量】
public static void dosome(){
Computer cc ; // cc是一个引用【局部变量】
}
}
传递值:
方法调用的时候,涉及到参数传递的问题,传递的时候,Java只遵循一种语法机制,
就是将变量中保存的 “ 值 ” 传递过去了,只不过有的时候这个值是一个字面值,有的时候
这个值是另一个java对象的内存地址ox1234
在带有static的方法中不能 “ 直接 ” 访问实例变量和实例方法。
因为实例变量和实例方法都需要有对象的存在。
而static的方法当中是没有this的,也就是说当前对象是不存在的。
自然无法访问当前对象的实例变量和实例方法。
“ this. ”什么时候不能省略?
用来区分局部变量和实例变量的时候,“ this. ”不能省略。
重点【记忆】:this()这种语法只能出现在构造方法的第一行。
什么时候成员变量声明为实例变量呢?
所有对象都有这个属性,但是这个属性的值会随着对象的变化而变化【不同对象的这个属性具体的值不同。】
什么时候成员变量声明成静态变量呢?
所有对象都有这个属性,并且所有对象这个属性的值都是一样的,建议定义为静态变量,节省内存的开销。
静态变量在类加载的时候初始化,内存在方法区中开辟。访问的时候不需要创建对象,直接使用“类名.静态变量名”的方式访问。
关于Java关键字中static语句:
可以使用static关键字来定义 “ 静态代码块 ” :
实例代码块:
继承是面向对象的三大特征之一,分别是:封装、继承、多态。
继承“基本”作用是:代码复用。但是继承最“重要”的作用是:有了继承才有了以后“方法的覆盖”和“多态机制”。
继承语法格式:
[修饰符列表] class 类名 extends 父类名{
类体 = 属性 + 方法
}
Java语言当中的继承只支持单继承,一个类不能同时继承多个类,只能继承一个类。
关于继承的一些术语:
B类继承A类,其中:
A类称为:父类、基类、超类、superclass
B类称为:子类、派生类、subclass
在Java语言当中子类继承父类都继承哪些数据?
* 私有的不支持继承
* 构造方法不支持继承
* 其他数据都可以被继承
虽然Java语言当中只支持单继承,但一个类也可以间接继承其他类,例如:
C extends B {
}
B extends A {
}
A extends T{
}
C类继承B类,但是C类间接继承 T 、A 类。
Java语言中假设一个类没有显示的继承任何类,该类默认继承JavaSE库当中提供的java.lang.Object类。
回顾Java语言当中方法的重载:
方法重载又称 :Overload
方法重载什么时候使用?
当在同一个类当中,方法完成的功能是相似的,建议方法名相同,这样方便程序员的编程。
就像在调用一个方法似的,代码美观。
什么条件满足之后构成方法的重载?
* 在同一个类中
* 方法名相同
* 参数列表不同:类型、顺序、个数
方法重载和什么无关?
* 和方法的返回值类型无关
* 和方法的修饰符列表无关
关于Java语言中方法的覆盖:
方法覆盖又被称为方法重写:override 【官方的】/ overwrite
什么时候使用方法重写?
* 当父类的方法已经无法满足当前子类的业务需求。
* 子类有必将父类继承过来的方法进行重新编写
什么条件满足之后发生方法重写?【代码满足什么条件之后,就构成方法的覆盖呢?】
建议方法重写的时候尽量复制粘贴。 不要编写,容易出错,导致,没有产生覆盖。
私有方法不能继承,所以不能覆盖
构造方法不能继承,所以不能覆盖
静态方法不存在覆盖。
覆盖只针对方法,不谈属性。
多态的基础语法:
向下转型:
Animal a3 = new bird();
cat c3 = (cat)a3;
1. 以上异常只有在强制类型转换时才会发生,也就是“向下转型”存在隐患(编译过了,但是运行错了!)
2. 向下转型只要编译通过,运行一定不会出现问题: Animal a = new Cat()
3. 向下转型编译通过,运行可能出现错误: Animal a3 = new Bird(); Cat c3 = (Cat)a3;
4. 怎么避免向下转型出现ClassCaseEception呢?
使用instanceof(实例) 运算符可以避免以上的异常。
5. instanceof运算符怎么使用呢?
5.1、语法格式 :
(引用 instanceof 数据类型名)
5.2、以上运算符的执行结果类型是布尔类型,结果可能是true / false
5.3、关于运算结果true/ false:
假设:(a instanceof Animal)
true表示:
a这个引用指向的对象是一个Animal类型。
false表示:
a这个引用指向的对象不是一个Animal类型。
if(a3 instanceof Cat) {
Cat c3 = (Cat)a3;
}else if (a3 instanceof Bird ){
Bird b2 = (Bird)b3;
}
多态在实际开发过程中的作用:
以主人喂养宠物为例说明多态的作用:
分析:主人喂养宠物这场景实现需要进行类型的抽象:
- 主人【类】
- 主人可以喂养宠物,所以主人又喂养的动作
- 宠物【类】
- 宠物可以吃东西,所以宠物有吃东西的这个动作
面向对象编程的核心:定义好类,然后将类实例化成对象,给个环境驱使一下,让各个之间协作成一个系统。
3.多态的作用是什么?
降低程序的耦合度,提高程序的扩展力。
能使用多态尽量使用多态
父类型引用指向子类型对象
核心:面向抽象编程,不要面向具体编程。
关于Java语言当中的final关键字:
1. final是一个关键字,表示:最终的,不可改变的
2. final修饰的类无法被继承
3. final修饰的方法无法被覆盖
4. final修饰的变量一旦赋值之后,不可重新赋值
5. final修饰的实例变量,必须手动赋值,不能采用系统默认赋值
6. final修饰的引用,一旦指向某个对象之后,不能再指向其他对象,那么被指向的对象无法被垃圾回收器回收。
final修饰的引用虽然指向某个对象之后不能在指向其他对象,但是所指向的对象内部的内存也是可以被修改的。
7. final修饰的实例变量,一般和static联合使用,被称为常量。
对于以后学习的类库,一般是包括三个部分:
- 源码【可以看源码来理解程序】
- 字节码【程序开发过程中使用的就是这部分】
- 帮助文档【对源码的解释说明被提取出来,更方便程序的开发】
注意使用的时候版本统一。
访问控制权限修饰符:
1. 访问控制权限修饰符来控制元素的访问范围
2. 访问控制权限符包括:
public 表示公开的,在任何位置都能访问
protected 同包、同类下可以访问
缺省 同包下可以访问
private 表示私有的,只能在本类访问
3. 访问控制权限符可以修饰类、变量、方法......
4. 当某个数据只希望子类使用,使用protected进行修饰。
5. 修饰符的范围:
private < 缺省 < protected < public