感谢sikiedu.com的siki老师。几年前就开始看siki的课程,最近突然想写这个笔记系列,顺便回顾一下这些基础的知识,同时也希望能帮助到一些人,有问题一起交流哈。
全文共十章,大约1.5万字,适合清扫知识点盲区之用。知识点覆盖全面,涵盖绝大多数基础内容。
第一章 基础知识
1-1 DOS命令(Windows)
操作计算机的两种方式
图形化界面
DOS(磁盘操作系统)DOS就是人给计算机下达命令的
打开DOS
cmd
window+R
1-2 常用DOS命令(输入命令后按下回车)
------目录操作-----
d: 切换盘符
dir 列出来当前目录的所有文件
md 创建文件夹
rd 删除文件夹
cd 打开文件夹
tab 自动补全
. 当前目录 .. 上一个目录
cd \ 或者 cd\ 退回到根目录(盘符目录)
------文件操作------
del a.txt del *.txt
del 目录 表示删除目录下的所有文件
------其他操作------
cls 清屏
exit 退出DOS
上方向键 取得上一个命令
-----计算机常用命令(不区分大小写)---
notepad
Mspaint
Cals
Mstsc
计算机快捷键
Ctrl + A Ctrl + S Ctrl + Z Ctrl + X Ctrl + C Ctrl + V Ctrl + N
Home End
1-3 Java的历史
百度百科
计算机语言,跟计算机沟通的语言,通过计算机语言可以让计算机干各种他可以干的事情
Java的排行榜
Java可以干什么
JavaEE (Web,网站开发) 网站分为前端和后端
淘宝 京东 工行网银 Amazon Google eBay 我的世界后端
企业内部使用的OA系统 财务系统
哪些网站使用的Java开发的
JavaME 基本没人用
JavaSE 桌面应用程序(什么是桌面应用程序 QQ 百度影音播放器 浏览器 )
Android开发(基于Java语言)
Hadoop大数据
1-4 Java是跨平台的
平台是操作系统 Windows Linux Mac
JVM Java虚拟机 Java开发的一个中间软件
JVM包含在JDK里面,下载JDK的时候是需要选择平台的
JDK和JRE
JDK 是 java开发工具包(包含jre)
JRE 是java运行环境
Java开发环境
安装JDK (Java Development Kit Java开发工具包) JDK9(Java SE JDK)
目录不要有中文
卸载(控制面板 卸载程序)
通过Java和Javac命令验证安装的是否正确
Java运行原理图
编译和执行可以通过DOS来完成
1-5 HelloWorld.java 第一个Java程序
关于后缀名如何修改
写代码必须全部是英文(除了个别中文字符)
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World!");
}
}
javac xx.java
java xx
1-6 常见问题:
文件扩展名问题
class写错 Class classs claas
main写错 Main
打印语句问题 System.out.print(“”);
引号问题 ; ;
环境变量的配置
什么作用
怎么配置
配置完重启cmd
Java_Home的作用和配置(jdk安装目录)
classpath
path里面的是exe可执行文件,class是java的运行文件.class文件
安装notepad++(Eclipse MyEclipse)
行号
高亮显示,代码提示
1-7 什么是注释
对代码进行解释说明,不会影响程序的运行,编译的时候,会忽略注释,注释就是为了开发人员方便阅读代码使用的!
单行 //
多行 /* */
文档 /** */
1-8 Java标识符
自己定义的东西的名字就是标识符(类名,变量名,方法名)
1,有字母(大写和小写) 数字 下划线_ 美元符$
2,不能以数字开头,不能是关键字
3,区分大小写 main Main
1-9 命名规范(驼峰命名):
见名知意
包:全部小写,以域名开头
com.sikiedu.tools
com.sikiedu.person
类名字:第一个单词首字母大写,后面的单词首字母大写
函数和变量名:第一个单词首字母小写,后面的单词首字母大写
1-10 Java关键字(变色)
https://baike.baidu.com/item/java%E5%85%B3%E9%94%AE%E5%AD%97/5808816?fr=aladdin
全部都是小写的
1-11 常量:
字面值常量
字符串,整数,小数,字符,布尔,空常量
自定义常量
1-12 进制
百度百科:https://baike.baidu.com/item/%E8%BF%9B%E5%88%B6/317457?fr=aladdin
进制也就是进位制,是人们规定的一种进位方法。 对于任何一种进制---X进制,就表示某一位置上的数运算时是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。
为什么计算机只识别0和1 https://zhidao.baidu.com/question/191371417.html
为什么0和1可以表示丰富的图形和影视 https://www.zhihu.com/question/36269548
1-13 计算机存储单位
二进制(0b开头) 八进制(0开头) 十进制(默认) 十六进制(0x)
1-14 变量
变量类型 变量名 = 初始化值;
整数默认为int 小数默认为double类型
变量注意事项:
作用域:定义在哪个大括号内,就在哪个大括号内有效。不能同名在同一个作用域里面。
在使用之前初始化
一行可以定义多个变量,两种写法
一行多条语句
一行一条语句
变量类型一般:
整数类型
浮点类型
字符类型
布尔类型
Notepad++的编码修改为 ANSI编码(中文)
1-15 变量注意事项
作用域(有效范围):定义在哪个大括号内,就在哪个大括号内有效。不能同名在同一 个作用域里面。
在使用之前初始化
一行可以定义多个变量,两种写法
一行多条语句
一行一条语句
1-16 常量final
在运行期间一直不会改变的量成为常量!一、字面值常量,二、自定义常量
怎么自定义常量(一般常量名称都全部大写)
final 数据类型 常量名称 = 值。
定义long或者float类型的时候要加上l(L)和f(F)
定义byte或者short的时候要保证给的值在类型的范围内
char是否可以存储汉字
可以的,因为char占有两个字节,每个汉字也是占用两个字节的
练习题1:
- 请写出标识符的命名规则是什么?
- 由英文字母、数字、_和$组成,长度不限。
- 标识符的第一个字符不能是数字
- 标识符区分大小写。
- 标识符不能包含空格。
- 下列属于正确标识符的选项有[多选]()
- int B. $_Count C. 3M D. Hello
- b-7 F. ms#d G. bool H. D9658
- java的基本数据类型有哪些?
- java的基本数据类型中,有几种可以表示数字?
- 写一个程序,输出你的姓名、身份证号、年龄、所在大学、专业、入学年限和学制。
第二章 运算符
2-1 运算符
赋值运算符
= |
+= |
-= |
*= |
/= |
%= |
a = 3;a = a + b;
x = y = z = 7;//不建议
a x= b; ======> a = a x b; x代表 + - * / %
2-2 算术运算符(可以对常量和变量进行操作)
规则: 操作数1 运算符 操作数2 int b = a + c;
2-2-1 加减乘除求余
+
可以对整数和浮点数做加法操作
-
可以对整数和浮点数做减法操作
*
可以对整数和浮点数做乘法操作
/
可以对整数和浮点数做除法操作
(两个整数相除得到的还是整数 = 略去小数部分)
如果想要得到小数,需要将其中一个转成浮点数
%
可以对整数和浮点数做求余操作
特殊一:
使用浮点数做运算的时候的不精确性
5.3-4.2
0.08f + 0.01f
6.9*7
7.6%2.0
原因:double 和 float两个类型在java中本身就是非精确存储的,再用两个近 似值去做计算,得到的结果就只能是一个近似值了。
特殊二:
可以使用+对字符串进行组拼,任何类型和字符串相加都会把数据转成字符串,再 进行组拼
a+b+”Hello”
“Hello”+a+b
特殊三:
使用字符做算术运算的时候,会自动把字符转换成对应的数字,然后进行数学运算
2-2-2 自增和自减运算符
++
两种用法:放在前面或者放在后面
--
两种用法:放在前面或者放在后面
2-2-3 比较运算符
结果为boolean类型(true/false)
<
<=
>
>=
==
!=
注意区分 == 和 =
System.out.println(a==b); System.out.println(a=b);
2-2-4 逻辑运算符(两边的操作数必须是boolean类型的)
规则: 操作数1 运算符 操作数2
&& (短路 与)
|| (短路 或)
&
|
^ 异或
!非(取反)
与:两边同时满足条件的时候为true(其他情况为false)
或:两边只要满足一个条件结果为true(其他情况为false)
异或:两边结果不一样的时候结果为true(其他情况为false)
2-2-5 短路和不短路的区别
当可以通过操作数1判断出来结果的时候,是否运算操作数2(短路表示不运算操 作数2)
注意:
1<x<9 1<x && x<9
2-2-6 位运算符
计算机是二进制的,所有的数据使用二进制来存储。对于每个二进制来说都有原码、反码和补码。计算机存储数据的时候,使用第一位表示数字的正负,0代表正数,1代表负数。计算机存储正数的时候直接存储正数的原码,存储负数的时候存储负数的补码。(为什么存储补码,而不是原码,这个是为了方便进行数学运算,具体不解释了)
正数:原码、反码和补码相同。
负数:
原码(符号位为1)
反码(符号位不变,其余位数取反)
补码(反码+1)
只针对二进制来说的,所以在进行运算之前会转换成二进制,再运算。
& 按位与:对应位都是1才是1
| 按位或:对应位有一个1,就是1
~ 按位取反:1变0,0变1
^ 按位异或:对应位不一样才是1
<< 左移(高位抛弃,低位补0)
>> 右移(高位按照符号位补齐,低位抛弃)
>>>无符号右移(忽略符号位,高位补0,低位抛弃)
2-2-7 三元运算符
?:
规则: 布尔表达式?表达式1:表达式2
如果布尔表达式的结果为true,返回表达式1的结果
如果布尔表达式的结果为false,返回表达式2的结果
案例:
取最大值(两个整数和三个整数)
2-3 运算符优先级
默认优先级
通过()控制优先级
2-4 数据类型转换
2-4-1隐式类型转换
小类型到大类型会自动转换:byte->short,char->int->long->float->double
虽然float比long小,但是因为存储方法不一样导致float里面可以存储的数据 范围比 long要大(浮点型来说,有一部分是用来表示有效位数的,有一部分是 用来表示多少次方。)
使用情况:
- 赋值语句
- 算术表达式中
2-4-2 显式类型转换(也叫做强制类型转换)
把一个大类型赋值给小类型,需要进行前置类型转换
int i = (int)3.3;
long j = (long)3.4f;
int c = ‘a’;//隐式转换
练习题2
一、对于以下,有int x = 5, y = 6, z;
题目1:z = ++x + y++;
题目2:z = ++x + x++;
题目3:x = ++x + x++;
题目4:z = x > y ? ++x : y++;
二、下列说法正确的是( )
A、 JAVA程序的main方法必须写在类里面
B、 JAVA程序中可以有多个main方法
C、 JAVA程序中类名必须与文件名一样
D、 JAVA程序的main方法中如果只有一条语句,可以不用{}(大括号)括起来
三、变量命名规范说法正确的是( )
A、 变量由字母、下划线、数字、$符号随意组成;
B、 变量不能以数字作为开头;
C、 A和a在java中是同一个变量;
D、 不同类型的变量,可以起相同的名字;
四、下列javaDoc注释正确的是( )
A、 /*我爱北京天安门*/
B、 //我爱北京天安门*/
C、 /**我爱北京天安门*/
D、 /*我爱北京天安门**/
五、为一个boolean类型变量赋值时,可以使用( )方式
A、 boolean = 1;
B、 boolean a = (9 >= 10);
C、 boolean a="真";
D、 boolean a = = false;
六、以下( )不是合法的标识符
A、 STRING B、 x3x; C、 void D、 de$f
第三章 流程控制
3-1 语句块
以{开始,以}结束
{}
注释事项
- 遇到单纯的语句块的时候,会直接执行语句块里面的语句,从上到下
- 语句块可以访问外面定义的变量,外面不能访问语句块里面定义的变量
3-2 流程控制
控制程序中语句执行的流程(顺序)。默认是从上到下一条语句一条语句执行。
3-3 条件语句
意义:通过条件判断是否执行某些语句
3-3-1 if条件
3-3-1-1 第一种
if(布尔表达式){
//语句,当布尔表达式为true的时候才会执行的语句
}
3-3-1-2 第二种
if(){
//语句
}else{
//语句
}
3-3-1-3 第三种
if(){
}else if(){
}else{
}
3-3-1-4 特殊的用法:
if()
Xxx;
Xxx;
if();
3-3-1-5 注意事项
三元运算符可以实现的都可以使用if语句代替
区别:
三元运算符比较简洁
三元运算符必须返回结果
if语句可以执行多条语句
3-3-2 switch分支语句
结构:
switch(表达式){
case 值1:
语句块1;
break;
case 值2:
语句块2;
break;
...
default:
Default语句块;
break;
}
表达式可以是整数 字符 枚举 字符串
case后面的值必须是常量
break用来中断switch语句
3-4 循环语句
完成:创建10个敌人
完成:取得1-100的所有数的和
完成:输出1-10
完成:输出10-1
3-4-1 while循环
while(布尔表达式){
//循环体
}
do ... while循环
do{
//循环体
}while(布尔表达式);
4-3-2 for循环
for(初始化语句;判断条件语句;更新语句){
//循环体
}
注意:
For初始化语句里面定义的变量只能在for循环里面使用
for循环的特殊使用方式
语句的嵌套
输出1-100内的所有偶数
循环练习:
- 求整数1~100的累加值,跳过所有个位为3的数。
- 循环输出以下结果:
- 2*5=10
- 4*10=40
- 6*15=90
- ……
- ?*100=?
3,一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13 米)?
3-5 流程控制
3-5-1 break语句(中断语句)
- switch
- 循环语句
- 多层循环的情况下,跳出break所在的循环
- 可以定义标签,指定跳出哪个循环
3-5-2 continue语句(中断当前循环,继续下次循环)
使用在循环语句中
return
用来结束方法
如何接收用户键盘输入的数据
import java.util.Scanner;
Scanner s = new Scanner(System.in);
s.nextInt();
练习题3
一、接收用户输入的一个整数,判断它是奇数还是偶数。
二、使用循环语句计算20的阶乘。20!
三、使用循环语句计算1!+2!+3!+ ... + 20!
四、接收三个整数abc,对这个三个整数按照从小打到的顺序进行排列
五、让用户输入一个字符,判断他是小写字母还是大写字母,如果是小写字母的话,就转换成大写字母输出。
六、编写程序,给定一个学生成绩,给出相应等级:
90~100 优秀
80~89 良好
70~79 中等
60~69 及格
0~59 不及格
七、用 while 循环,计算 1~200 之间所有 3 的倍数之和。
八、编写程序,输出 200~500 之间的所有素数。
九、编写程序解决“百钱买百鸡”问题。公鸡五钱一只,母鸡三钱一只,小鸡一钱三只,现 有百钱欲买百鸡,共有多少种买法?
十、打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该 数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次 方。
十一、猜数字,随机生成一个数字,让用户猜大小,然后提示猜大了或者猜小了,猜不中让 用户一直猜,直到用户猜中,游戏结束,就不需要继续猜了。
第四章 字符串String
4-1 本章学习方法
字符串是比较重要的内容
因为本章会学习到很多API,学习比较容易理解,也会使用,就是比较容易忘,
忘了没有关系,跟着老师做一遍练习,心中有印象,后面使用的时候再回头查阅即可
在使用中慢慢掌握
4-2 怎么表示字符串
4-2-1 字符串常量
需要使用””双引号引起来
“234” “sdfsdf” “中国”
一个字符串不能放在多行,那怎么表示换行呢
4-2-2 字符串变量
String str=”sdfsdf”;
String str=new String(”sdfsdf”);
4-3 连接字符串(+)
多个字符串连接
和其他数据连接
通过+可以直接对字符串(或者其他数据类型)常量和变量做连接操作
4-4 字符串的特性
字符串无法被修改
解释(引用类型,基本类型)
内存区域:栈 堆 方法区 运行常量区
字符串值无法被修改,但是字符串对象可以引用别的字符串。
4-5 字符串信息获取
4-5-1 长度
s.length();
4-5-2 查找子字符串的位置
s.indexOf(int c);
s.indexOf(String str);
s.lastIndexOf(String str);
4-5-3 获取指定位置的字符
s.charAt(int index)
4-5-4 获取子字符串
s.substring(int beginIndex);
s.substring(int beginIndex,int endIndex);
4-6 字符串判断:
4-6-1 判断字符串的开始和结尾
s.startsWith(String prefix);
s.endsWith(String suffix);
4-6-2 判断字符串是否相等
==
s.equals(String str);
s.equalsIgnoreCase(String str);
s.compareTo(String str);//compareTo比较的不是字符串是否相等,这里比较的 是字符串的大小,字符串的大小怎么怎么比较呢,按个字符比较相同的字符跳过, 遇到不同的字符,返回字符的差。如果两个字符串,前面几个字符相等,长度不相 等(“siki” “sikiedu”)返回两个字符串的长度差。
4-6-3 判断是否包含某个子字符串
s.contains(String str);
4-6-4 判断字符串是否为空
s.isEmpty();
空的两种状态
String s = “”;//空字符串
String s = null;//空对象
4-7 字符串转换操作
4-7-1 字母大小写转换
s.toLowerCase();
s.toUpperCase();
4-7-2 字符串分割
s.split(String str);
s.split(String str,int limit);
4-7-3 去除空格(前面和后面的空格,不包括中间的空格)
s.trim();
4-7-4 字符串替换
s.replace(char oldChar,char newChar);
s.replace(String oldStr,String newStr);
4-7-5 字符串格式化
日期和时间的格式化
练习题4
- 给定一个字符串,判断该字符串中是否包含某个子串.如果包含,求出子串的所有出现位置.如:"abcbcbabcb34bcbd"中,"bcb"子串的出现位置为: 1,7,12.字符串和子串均由用户输入
- 在一个字符串中查找一个子串,计算出来这个子串在字符串中出现的次数。
- 编写程序将 “jdk” 全部变为大写,并输出到屏幕,截取子串”DK” 并输出到屏幕
- 编写程序将String类型字符串”test” 变为 “tset”。
- 接收用户输入的一个字符串,判断这个字符串是否对称。
- 将一个字符串进行反转。例:”abcdefg”反转成“gfedcba”.
- 随机生成4位验证码,由用户输入并验证是否输入正确,如果输入错误就生成新的验证码让用户重新输入,最多输入5次
第五章 一维数组
5-1 数组是用来干嘛的?
假如我们要做一个成绩管理系统,一个班级里面有50个人。
假如我们做的是一个公司的财务管理软件,需要记录每个人的工资,公司有30到1000 个员工。
使用数组可以搞定上面的:
数组可以存储多个类型一致的元素。(任意类型)
5-2 引用类型和基本类型变量创建的不同
基本类型变量声明出来不管是否赋值,都已经分配了内存。
引用类型变量的创建分为两步:声明和初始化
声明只在栈内分配内存(存储引用,或者说存储内存地址)
初始化在堆或者方法区分配内存(存储实际的数据)
new出来的东西放在堆里面
程序运行常量放在方法区里面
5-3 关于栈
所有局部变量都存放在栈里面。
5-4 什么是局部变量?
在方法里面创建的变量都是局部变量,因为只在这个方法内有效。
5-5 一维数组的声明、初始化和使用
第一步:声明
声明第一种方式:数组元素类型[] 数组名;
声明第二种方式:数组元素类型 数组名[];
注意:没有初始化的数组是无法使用的。(可以初始化为null)
第二步:初始化
初始化的时间:
可以在声明的时候直接初始化
也可以先声明后初始化
初始化的方式:(初始化的时候必须确定数组的长度)
第一种方式:int[] shuzu = new int[3];//按照默认值初始化 0
第二种方式:int[] shuzu = new int[]{3,32,34};//长度根据元素个数确定
第三种方式:int[] shuzu = {23,234,23,4}//上面的简化版本,根据元素个数确 定数组长度
数据类型的默认值
基本类型是0(0 0.0 0所代表的字符 false )
引用类型是null
第三步:使用
使用:
通过索引访问数组里面元素,索引是从0开始。
访问方式:数组名[索引] //可以访问值,也可以设置值
获取数组长度
数组名.length 这里的length是属性,不是方法,不需要加括号
注意事项
数组之间的赋值
引用类型的赋值
下标超出范围 //严重
空引用int[] shuzu = null;
shuzu[index] //严重
数组的其他操作:
填充数组
Arrays.fill(数组名,值);//使用指定的值填充指定的数组
编程练习5
- 一.遍历一个数组中所有的元素,并输出出来
- 二.请将’A’,’B’,’C’存入数组,然后再输出
- 三.复制数组,将数组里面的数据全部复制到另一个数组里面
- 四.取得一个数组里面的最大值和最小值
- 五.把数组里面的元素倒置( {234,3,34,25,3} => {3,25,34,3,234} )
for循环的特殊用法
六、现在有如下一个数组:
int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
要求将以上数组中的0项去掉,将不为0的值存入一个新的数组,生成新的数组为
int newArr[]={1,3,4,5,6,6,5,4,7,6,7,5}
七、数据查找,有一个数组,里面存储是是整数,从这个里面查找一个指定整数,找到 这个整数所在位置(索引位置)。(查找第一个出现的位置)
第六章 二维数组
6-1 二维数组的声明、初始化和使用
为什么用二维数组?
假如我们要做一个成绩管理系统,一个班级里面有50个人。
假如我们做的是一个公司的财务管理软件,需要记录每个人的工资,公司有40个员工。
对上面的问题进行升级
假如我们要做一个成绩管理系统,我们有10个班级,一个班级里面有50个人。
假如我们做的是一个公司的财务管理软件,需要记录每个人的工资,公司有6个部门, 每个部门有40个员工。
-
声明
声明第一种方式:数据类型[][] 数组名;
声明第二种方式:数据类型 数组名[][];
-
初始化
初始化第一种方式:数组名=new 数据类型[m][n];
初始化第二种方式:数组名= {{2,5},{1},{3,2,4},{1,7,5,9}};
可以把二维数组当成多个一维数组组成的一维数组,比如这里的就是一个长度 为m 的一维数组,这个数组里面每一个元素都是长度为n的一维数组。(画图 表示二维数组在内存中怎么存储的)
初始化第三种方式:数组名= new 数据类型[m][];
m表示里面有多少个一维数组,但是没有给出这个一维数组的长度。这里的每 个一维数组的长度是可以不一样的。
int[][] school= new int[3][];
school[0]=new int[2]; //或者= {xx,x,x,xxx,xx};
school[1]=new int[3]; //或者= {xx,x,x,xxx,xx};
school[2]=new int[1];
-
使用
格式:数组名[索引][索引]
通过数组名[索引] 得到的是一维数组,完全可以当做一维数做来使用
6-2 数组排序
1、冒泡排序
2、直接选择排序
编程练习6
- 定义一个数组来存储12个学生的成绩{72,89,65,58,87,91,53,82,71,93,76,68},计算 并输出学生的平均成绩。
- 在歌唱比赛中,共有10位评委进行打分,在计算歌手得分时,去掉一个最高分,去掉 一个最低分,然后剩余的8位评委的分数进行平均,就是该选手的最终得分。输入每个 评委的评分,求某选手的得分。
- 声明一个int型的数组,循环接收8个学生的成绩,计算这8个学生的总分及平均分、 最高分和最低分。
第七章 类和面向对象编程-初级
7-1 什么是面向对象编程?
意思是交个女朋友,面对女朋友编程吗?
很多程序中的概念,实际的意思跟它表面的意思会有一些不一样。
假如我们要开发一个坦克大战的游戏
我们这个游戏有一些属性
当前剩余多少条命(没命的话,游戏结束,开始有3条命)
当前游戏的分数(每次杀死敌人得分)
Boss是否死亡(死亡重新开始游戏,损失一条命)
我们有一个主角(坦克)它有一些属性
等级(等级越高,攻击力越强,初始1级)
当前血量
我们有一些种类的敌人
普通敌人,铜敌人,黄金敌人
不同敌人的攻击力和血量不一样
敌人可以自己移动
交互
可以控制主角移动
可以发射子弹攻击敌人
敌人会自动追踪主角,并进行攻击
在我们写的程序有很多的代码的时候,我们可以把程序中的东西进行分类,跟主角相关的是一类,跟敌人相关的是一类,跟整个游戏相关的是一类。
通过分类可以让程序变得更加有结构。在程序中可以使用类(class)对代码进行分类,当使用类编程的时候,使用创建出来的变量称之为一个对象。这就是传说中的面向对象编程。
面向对象和面向过程的区别。面向过程里面没有对象,强调的开发一个功能的步骤和过程,一步一步类,面向对象我们操作处理的是一个个的对象,(详细的每个功能的步骤和过程都封装在了类里面,通过类分类划分模块)程序更加结构化。(更加适合开发大型项目,更加便于后期的维护)
如何通俗易懂地举例说明“面向对象”和“面向过程”有什么区别?
https://www.zhihu.com/question/27468564
7-2 面向对象(类、对象)的三个特征:
封装、继承、多态(后面慢慢理解)
一个类表示一个类别(比如上面的例子,有主角 敌人 游戏管理系统)
通过一个类管理这个类别的所有相关的东西。比如敌人,主角
我们可以定义一个人主角类,来控制主角相关的属性和行为(方法)的管理。
这里所说的属性和行为,在我们程序中叫做成员变量、成员方法。
7-3 怎么定义类?
class 类名{
//成员变量(这个类有的属性)
//成员方法(这个类有哪些行为,有哪些功能)
}
怎么声明对象
类名 对象名;
定义好了类,为什么要利用类定义变量(对象)?
一个类相当于一个模板,利用模板可以生产实例。
类相当于车工厂里面的车模(模具),利用车模可以生成可以实际使用的很多辆车。
类==车模 对象==车
(敌人类 和 很多个敌人)
分析下主角类有哪些属性和行为?
如何利用类创建对象?
使用属性、调用行为
大象装进冰箱问题
分析有哪些类
大象类,冰箱类
对象之间的赋值(引用的赋值)
7-4 成员变量和局部变量
定义的位置
什么时候占用内存
所占用内存的位置
什么时候所占内存被销毁
初始值
当把一个对象当做一个方法的参数的时候
因为类是引用类型,所以在方法内修改引用类型里面的数据的时候,原引用类型里面的 数据也被修改了!
7-5 什么是匿名对象?
如果这个对象只使用一次的时候
Java中的垃圾回收机制GC(JVM)
7-6 开发教务管理系统
如果我们要开发一个教务管理系统。这个教务管理系统是给学校使用的,用来管理学生和老师的,比如学生的成绩信息管理,老师所有信息管理...等。
学生类创建
老师类创建
对象是如何在内存中存储的
7-7 访问修饰符 private
(项目开发中,我们开发的类不止给我们自己使用也给团队中的其他人使用)
可以修饰成员变量,可以修饰成员方法
7-8 封装:
把不需要外界访问的属性都隐藏起来
提供方法让外界访问
优点:
让代码结构更加清晰
比较安全(编写代码不容易出错,特别是大项目)
使用:
所有属性私有化
提供getter和setter方法访问
7-9 关于this关键字
在类定义的时候使用
this代表当前对象
优点:
通过this区分方法参数和成员变量
通过this方便IDE给出提示(后面eclipse演示)
7-10 构造方法(用来构造对象的)
什么是会被调用(new的时候)
默认构造方法(只有没有任何构造方法的时候,系统才会提供默认无参的构造方法)
格式:
修饰符 类名(参数){}
练习题7
- 创建手机类,分析一个手机类有哪些属性和行为。为属性创建getter和settter方法,并创建手机类的构造器。
- 定义火车、飞机这些类,为这些类提供构造器。
- 定义长方形类,含:
属性:宽、高(整型);
方法:求周长、面积;
构造方法3个:
无参——宽、高默认值为1;
1个参数——宽、高均为参数值;
2个参数——宽、高各为参数值。
4.定义长方体类,定义求底面积、体积的方法。(可利用上述定义的长方形类)
第八章 类和面向对象编程 - 中级
8-1 static关键字(静态修饰符)
可以修饰成员变量和成员方法
可以通过对象和类来调用(调用的都是同一个)
修饰成员变量表示静态变量,静态变量是所有对象公用的,在内存中只占有一份内存
修饰成员方法表示静态方法,静态方法里面只能访问静态变量
8-2 static应用举例
圆类(π可以设置为static)
一个游戏中的游戏管理类(负责整个游戏的状态,只需要一个对象,可以全部设置为 static)
一个班级类(每个班级有一个所属的学校)
8-3 static占用内存图解
方法区(静态区)
8-4 static特点
随着类的加载而加载
优先于对象存在
所有对象共享(可以通过对象或者类来访问)
main方法就是静态方法
8-5 使用static的地方:工具类的创建
数组工具类ArrayTool
Arrays.fill(API中关于Arrays的其他方法)
查找在数组中的位置
字符串工具类StringTool
indexOf
自己动手实现
构造方法私有化
举例
Math
8-6 静态代码块
放在类里面,只会执行一次(加载类的时候,就执行这个类里面的静态代码块)
static{
}
8-7 继承案例
老师
姓名 年龄 性别 职称 教授科目 教授班级
吃饭 睡觉 教课
学生
姓名 年龄 性别 所在班级 班级排名
吃饭 睡觉 上课
8-8 怎么继承
提取公共类
子类继承公共类(子类拥有公共类所拥有的东西)
extends XXX
8-9 继承的特点:
Java支持单继承不支持多继承
8-10 继承的优点:
减少了代码量(不是很明显)
代码变得简洁
代码变得更加容易维护(后期修改)
8-11 继承注意事项
一、子类继承了父类里面的成员(成员变量和成员方法)
子类不能访问父类里面的私有成员
子类对象里面拥有父类里面的私有成员变量(只是不能直接访问)
- 继承中的 “是一个”关系(人 老师 学生)
- 子类和父类里面有同名的变量,就近原则(this super)
可以通过super访问父类里面的变量、方法和构造方法
8-12 继承中的构造
通过子类的构造方法构造子类对象的时候,都会调用父类里面的构造方法
(对父类里面的属性初始化,不指定就调用默认的无参构造方法)
如果父类没有无参构造方法,要通过下面的调用指定的有参构造方法
怎么指定调用父类里面的那个构造方法
super(xx,xx,xx,xx);
怎么在构造方法中调用其他构造方法
this(xx,xx,xx);
注意:
通过this或者super调用构造方法的时候必须在第一条语句
8-13 方法重写(方法覆盖)
子类中的方法名、参数和返回值和父类相同
意义:子类跟父类拥有同样的功能,但是子类有自己的特定内容和特定实现方式。可以 定义一个不同的名字方法,但是为了见名知意,保持父类名字,自己重新实现方法体。
重写注意事项
不能重写private方法
重写的时候,访问权限不能更低(最好保持权限一致)
8-14 重载(overload)和重写(override)
重载:
同一个类
方法名 一样 参数 不一样 返回值 不要求
重写:
子类父类
参数 返回值 方法名 都要一样
(public private)
final(最终的、最后的)
可以修饰类、方法、变量
final类
这个类不能被继承
final方法
修饰一个方法:表示这个方法不能被子类重写
final变量(之前说过)(变量分为成员变量和局部变量)
常量
- 字面值常量 二、自定义常量
8-15 Java类包(package)
当我们开发的项目很大的时候,我们会写很多很多的类,这样的话不方便管理,而且容 易重名。
我们可以通过包对类进行分类管理,也可以避免重名问题。一种类型的Java类放在一 个包里面,或者一个模块的Java类放在一个包里面。不同包里面可以包含同名的类, 通过包来区分。
8-16 怎么定义包
package xx.xx.xx;
放在class前面
8-17 包名命名规则(以域名开头)
com.sikiedu.xx;
com.sikiedu.login;
com.sikiedu.register;
com.sikiedu.course;-->
com.sikiedu.courserelease
com.sikiedu.coursecreate
-->
com.sikiedu.course.release
com.sikiedu.course.create
8-18 怎么划分包
可以按照功能、模块(后面具体情况具体学习)
系统举例:
java.util
java.sql
8-19 带包的类的编译和运行
- 编译javac -d . xxx.java (编译的时候会根据你定义的包,创建对应的文件夹目录结构)
- 运行java com.sikiedu.xxx
8-20 带包的类的使用
第一种方式:直接在类前面加上包
xxx.xx.xxx x = new xxx.xxx.xx();
第二种方式:
import xxx.xxx.xx.xx;
import xx.xx.xx.*;
8-21 内部类
把一个类定义在另一个类的内部,这个被定义在内部的类称为内部类。包含内部类的叫 做外部类。
内部类比外部类多了三个访问权限:
private protected static
为什么类只有public和default两个访问权限
因为类的作用域只有两个 包内和包外,public在包外也可以访问,default只能在包 内访问。
分类
非静态内部类(是否使用static修饰)
静态内部类
局部内部类
匿名内部类
非静态内部类
不能拥有静态成员
内部类可以访问外部类的私有成员,外部类不能访问内部类的成员。
如果内部类成员和外部类成员名相同的时候,可以通过 this 外部类.this来区分
如果内部类是private的那只能在外部类内部使用
如果是public的话,那可以在外部类外部使用 外部类.内部类 对象名;
8-22 非静态内部类对象和外部类对象的关系
你可以认为内部类对象是寄生在外部类对象里面的。外部类对象里面可以有多个寄生 虫,每个寄生虫都可以访问外部类对象的private数据,而且访问到的是一样的。
8-23 在外部类外面创建内部类:
这样对吗?
外部类.内部类 对象名 = new 外部类.内部类(); // 错误
//第一种方式
外部类.内部类 对象名 = new 外部类().new 内部类();
//第二种方式
外部类 外部类对象 = new 外部类();
内部类 对象 = 外部类对象.new 内部类();
8-24 局部内部类
把类定义在方法内部,作用域只在这个方法内有效。这个用法用的比较少
8-25 匿名内部类//JDK 8
适用于只需要使用一次的类。
通过接口或者抽象类创建匿名内部类。
8-26 访问权限修饰符
应用的地方:类、成员变量、成员方法
类 public default 类使用的作用域有两个 包内,包外
private成员 只能在同一个类里面访问(子类,通过对象,类外,其他包里面)
public 成员,所有地方都可以访问
练习题8
- 定义交通工具、汽车、火车、飞机这些类,注意他们的继承关系,为这些类提供超过3个构造器。
第九章 类和面向对象编程 - 高级
9-1 继承和多态
多态:多种状态,多种形态
一个人可能是老师,可能是学生。它有两种状态。
9-2 为什么使用多态
主角 武器
父类对象可否调用子类里面的特有方法(强制类型转换)
多态中的对象所占有的内存
9-3 抽象类 abstract
抽象类里面可以包含正常方法和抽象方法
抽象类可以包含构造方法,但是不能被实例化
构造方法的作用是让子类对父类里面的数据进行初始化
抽象类的子类还可以是一个抽象类(不用实现抽象方法)
抽象类的子类(正常类)必须实现抽象类中的抽象方法
9-3-1 抽象类声明
abstract class xxx{}
9-3-2 抽象方法声明
Abstract void xx(); //没有方法体
9-3-3 抽象类练习:
* 需求:公司中程序员有姓名、工号、薪水、工作内容。
* 项目经理除了有姓名、工号、薪水、还有奖金、工作内容。
父类:雇员
程序员
属性 姓名 工号 薪水
行为 工作
项目经理
属性 姓名 工号 薪水 奖金
行为 工作
http://blog.csdn.net/china_demon/article/details/50525362
9-4 接口 interface implements
接口里面只能包含抽象方法(接口是完全抽象化的类,里面没有完整的方法)
我们可以通过接口定义一个功能(其他类可以实现这个接口来拥有这个功能)
用来扩展功能
接口可以被实现,不能被继承(接口里面只是定义了一些东西,并没有可以被实际继承 的数据或者方法(属性和行为))
接口可以被抽象类实现、也可以被具体类实现
单继承 多实现
接口与接口:可以多继承(一般不这么用)
9-4-1 接口的定义
interface xx{}
9-4-2 接口的实现
class xx implements xx{}
例子:老师和做饭功能和招生功能
继承和接口练习:
交通工具
飞机、汽车、轮船
附加功能:攻击
9-5 抽象类和接口的关系和区别
抽象类可以包含变量、常量、具体方法、抽象方法
接口可以包含 常量和抽象方法
接口一般用来做功能扩展
类、抽象类、接口练习题
教练和运动员案例
乒乓球运动员和篮球运动员。
乒乓球教练和篮球教练。
为了出国交流,跟乒乓球相关的人员都需要学习英语。
请用所学知识:分析这个案例中有哪些抽象类,哪些接口,哪些具体类。
https://www.cnblogs.com/LZL-student/p/5860918.html
9-6 匿名内部类//JDK 8
适用于只需要使用一次的类。
通过接口或者抽象类创建匿名内部类。
第十章 Java基础类库
-
Scanner
- hasNextXXX nextXXX()
- 让用户输入手机号和密码,判断是否登录成功。案例
-
Object类
-
String、StringBuffer和StringBuilder
- String字符串的构造(一旦被赋值不能被修改)
- StringBuffer和StringBuilder可以创建一个可以被修改的字符串
- 使用起来基本相同
- 不同:StringBuffer线程安全,但是性能略低。StringBuilder线程不安全但是性能略高。(什么是线程安全)
- 字符串的存储,在内存里面JDK9之前使用char数组存储,JDK9里面使用byte数组存储。
-
Arrays数组类
- sort
- binarySearch
-
Math
- PI E
- 三角函数相关方法
- round(x)四舍五入
- sqrt平方根
- pow(x,y)乘方x的y次方
- abs(x)绝对值
- ceil 向上取整
- floor 向下取整
- max(x1,x2)求最大值
- min(x1,x2)求最小值
- random()生成随机数 大于等于0,小于1
-
BigDecimal类
- 创建
- BigDecimal f1 = new BigDecimal(“0.05”);//首推
- BigDecimal f2 = BigDecimal.valueOf(0.01);//次推
- BigDecimal f3 = new BigDecimal(0.05);//不推
- 使用
- add
- subtract
- multiply
- divide
- 创建
-
Date、Calendar 日期和时间
- Date d = new Date();创建一个当前时间的日期类
- Calendar calendar = Calendar.getInstance();
- getTime()
基本类型包装类
- Byte byte
- Short short
- Integer int
- BigInteger可以表示任意大小的整数
- Long long
- Float float
- Double double
- Character char
- Boolean Boolean
包装类常用操作
- 基本类型数据和字符串之间的转换
- intValue 成员方法
- parseInt 静态方法
- toString 静态方法
- valueOf(int i) 静态方法
- valueOf(String s) 静态方法
自动拆箱和装箱
- 装箱
- Integer i = 100;
- 拆箱
- i+=100;
字符包装类Character
目前总复习就到这里结束了,谢谢大家浏览,若有错误恳请指出,谢谢。