1.Java基础
2019-09-09 11:01:44 0 举报
AI智能生成
java基础的思维导图(打赏一杯饮料钱)
作者其他创作
大纲/内容
环境变量配置
环境变量的配置
分支主题
JAVA_HOME
在系统环境变量中,新建,值是jdk所在目录
path
系统创建好的,存储的是 .exe 可执行文件程序的目录,针对 JDK 可配置其 bin 目录,目录下的 javac、java、javadoc 命令就可以随时使用了。
添加值为: %JAVA_HOME%/bin
基础语法
注释
分类
单行注释 //
多行注释 /* */
注意:多行注释不可以嵌套
文档注释 /** */
@author
@param
@return
作用
对代码进行解释说明
可以对代码进行调试
关键字
特殊含义的单词(都是小写)
常用的(48)
不常用的(2)
goto
const
数据类型
基本数据类型
整型
byte
1个字节,8位,范围:-128~127
short
2个字节,16位
int
4个字节,32位
long
8个字节,64位
浮点型
float
double
布尔型
两个值,分别是 true 和 false
字符型
char
2个字节,Unicode编码
引用类型
凡不是基本数据类型,都是引用类型
String
数组
自定义类或接口,对象
字面常量
整型字面量
100, 100L
int i = 200L
浮点型字面量
3.5,3.5F,3.12321E5
字符字面量
'a' '\t' '\u0000'
布尔型字面量
true,false
引用字面量
null
类型字面量
String.class int.class
标识符
给类,接口,方法,变量等起的名字
命名规则
字母,数字,下划线和$ 数字不能开头
大小写敏感
不能使用关键字
见名知意
借助翻译软件
驼峰标识
常量全部大写,多个单词使用下划线分隔
eg: MAX_NUMBER
变量和方法名从首个单词全部小写,其他单词首字母全部大写
getNumber
类名或接口名每个单词的首字母大写
OurName
运算符
算术运算符
赋值运算符
比较运算符
逻辑运算符
非短路运算符
短路运算符
&&
false && ? 则?会被短路
||
true || ? 则 ? 会被短路
位运算符
三目运算符
new
创建对象
()
强制类型转换 | 向下转型
改变优先级运算
方法的标识符
[]
数组标识符
下标
.
成员运算符
person.say()
student.name
instanceof
运行时类型识别
流程控制
顺序结构
分支结构
if..else
switch...case
可以使用的类型是 byte short int char 枚举类型, jdk1.7之后可以使用String
循环结构
分类
while循环
条件性循环
do...while循环
for循环
计数式循环
知道循环多少次
int i=0;i < 次数;i++
罗列式循环
知道初始值,终止值
int i=初始值; i<=终止值;i++
相关关键字
break
退出本层循环
continue
跳出本次循环,进入到下次循环
注意:continue 不要和 while的计数式循环 搭配使用,容易出现死循环
数组
基本用法
数组的声明
类型[] 数组名
建议使用
类型 数组名[]
数组的初始化
根据大小创建
格式:new 类型[大小]
作为方法的返回值,一般情况下使用这种形式创建数组
根据元素创建
格式:new 类型[]{元素1,元素2,....}
格式: 类型[] 数组名 = {元素1,元素2,...} 这种格式必须和数组的定义一起使用
length属性
数组的存储空间
下标运算
从0开始,到 length-1
遍历
for循环
格式: for(int i = 0; i < 数组.length; i++){数组[i]}
优势:可以访问索引并修改元素
劣势:结构复杂,容易数组越界
foreach循环
格式:for(类型 变量名 : 数组引用){变量}
优势:遍历过程中无需考虑数组越界
劣势:无法访问索引,更无法修改元素值
Arrays工具类
sort排序
toString 将数组转为字符串
equals 比较数组元素是否相同
二维数组
一个普通数组,每个元素又是一个数组
二维数组的声明
数据类型[][] 数组名
数据类型 数组名[][]
二维数组的定义
new 数据类型[n][m]
一维数组的空间是 n ,每个一维数组的单元格存储的是m个空间的数组
应用
表格
矩阵
2D游戏中的地图
棋盘
变量
声明格式: 类型 变量名
说明:类型有基本数据类型 也有 引用类型(其中包括自定义类型)
赋值 : 根据变量的类型赋值
对于自定义类型的变量,需要创建对象再赋值
原则
变量是什么类型,就给什么值
eg: Dog d = new Dog();
变量是什么类型,可以给 类型对应的子类的对象(向上转型)
eg: Person p = new Student()
说明: Student 继承于 Person
分类
局部变量
存储在栈内存中,无法默认初始化
在方法中或代码块中声明的变量
修饰符
final
表示局部常量
成员属性
默认初始化
和对象一起存储在堆内存中
访问修饰符
public,protected,默认,private
修饰符
final
值不可以修改
static
属于类,所有对象共享,一般用于静态方法
final static
类常量的声明方式
访问
就近原则
在访问变量时,会访问变量名相同最近变量
方法
构造方法
[访问修饰符] 方法名([形参列表])
成员方法
[访问修饰符] [修饰符] 返回值类型 方法名([形参列表]) [异常声明]
访问修饰符
public
可以在任何地方被访问
protected
只能在本类,本包,子类中被访问
默认
只能在本类和本包中被访问
private
只能在本类中被访问
修饰符
static
静态方法
静态方法内部不可以出现非静态成员
直接通过类名访问
abstract
抽象方法,没有方法体
不可以和static搭配使用
因为静态方法不可以被重写,只能被覆盖
不可以和final搭配使用
因为final修饰的方法不可以被重写
不可以和private搭配使用
因为子类中访问不到private的修饰方法
final
修饰方法,方法不能被重写
synchronized
非静态同步方法,锁对象是 this
静态同步方法,锁对象是 类名.class
返回值类型
就是方法执行结果所属的类型
如果没有返回值 定义为 void
形参列表
形参在方法声明(定义)的时候才使用,参与运算的未知数
就是一个 变量
形参必须有 自己的类型
方法调用
构造方法
new 关键词来调用
成员方法
方法名([实参列表])
静态和非静态
非静态方法:对象.方法名(实参列表)
静态方法:类名.方法名(实参列表)
返回值
void
只是直接调用
方法不可以用来赋值,不可以用来打印,不可以用来计算
有返回值类型
可以直接打印或直接用于计算,但不可以只调用
将方法执行结果交给 一个 返回值类型的变量
实参列表
作用:给形参赋值
实参和形参的关系是 一一对应
参数
形参
在声明方法的时候,在方法体中需要使用到的变量
实参
在方法使用时,给形参传入的值。形参什么类型,实参就给什么类型。
递归
概念: 指的就是一个方法自己调用自己(递归是一种算法)
递归的特点
1.自己调用自己:总体逻辑不变,但是调用过程中规模在缩小,由于是自己调用自己,功能逻辑都是一样.
2.代码要有两个分支
递归的分支
未达到最小规模时,自己调用自己
非递归分支
最小规模时,完成一个具体功能
3.每次递归调用的时候,规模都在朝着最小方向发展,其实就是在朝着非递归分支前进.达到非递归分支后,在一层一层归来.
递归的注意使用
1.递归效率比较低,原因是自己调用自己的时候方法要不停的进栈,在不停的出栈.
2.递归比较消耗栈区内存空间,很容易造成栈区溢出, StackOverflowError
3.递归一定要留非递归分支,就是要设计一个递归的出口
4.所有递归能实现方式,都有非递归的实现,只不过逻辑比较困难.
面向对象
类
对象的蓝图和模板
[访问修饰符] [修饰符] class 类名 [extends 父类] [implements 接口1,接口2,...]
访问修饰符
public 默认
修饰符
final
类不可以被继承
abstract
抽象类
不可以实例化对象
extends 父类
单继承
implements 接口....
多实现
定义属性
[访问修饰符] [修饰符] 类型 属性名
访问修饰符
public,protected,默认,private
修饰符
static
静态属性,可通过类名直接调用,类中所有对象共用
final
修饰的属性不可以修改值
如果没有在声明时初始化,则可以在构造方法中初始化
static final
用来声明类中的常量,声明时必须进行初始化
构造方法
调用方式 :
new
构造方法(实参)
如果类中没有手动定义构造方法,则系统会赠送一个无参的构造方法。一旦手动定义构造方法,则赠送的无参构造方法就会被取消。
作用
创建对象
为新建对象的属性赋值
定义方法
对象
一切皆对象
对象都是唯一的
对象都是属于某个类
作用
调用方法
三大特性
封装
隐藏一切可隐藏的实现细节,只暴露最简单的编程接口
private
设置器(setter),获取器(getter)
继承 (关键词 extends)
从已有类创建新类的过程
提供继承信息的类叫父类(基类,超类)
得到继承信息的类叫子类(派生类)
子类的构造方法第一行,必调用父类的构造方法
隐式调用
父类有无参的构造方法
显示调用
调用父类的有参构造方法
子类不可以继承的内容有:构造方法,封装的成员(属性和方法)
在子类非静态环境中通过super调用父类的成员
方法重写
父子类中,重写的方法要定义在子类中
方法名相同
参数列表相同
返回值类型相同或返回父子类型
访问修饰符不可以被缩小
不可以抛出比被重写方法声明的异常更广泛的强制性异常
java中的继承是单继承
Object类是所有类的超类
多态
用父类的引用指向子类的对象(向上转型)
调用子类重写的方法
(向下转型)
格式:子类 对象引用 = (子类) 向上转型的引用
注意:只有发生了向上转型的引用才可以向下转型
其他相关内容
访问修饰符
类
public
特点:类名必须和文件名保持一致,也就是说一个文件中只能有一个public修饰的外部类
默认
方法,属性,内部类
public
任意位置都可以访问
protected
只能在本类中,同包类中,不同包的子类中被访问
默认
只能在本类中,同包类中被访问
private
只能在本类中被访问
final
修饰变量
不可以修改值
变量包括:局部变量,成员属性,形参
修饰方法
不可以被重写
不可以用来修饰构造方法
不可以和abstract 搭配使用
修饰外部类
不可以被继承
static
属于类
修饰属性
所有对象共享,只会在类被加载时初始化一次
应用
1.在静态方法中被使用
2.类中的静态常量 static final
3.用来做计数器
修饰方法
通过类名调用
应用
1.偷懒,为了避免创建对象调用
2.工厂方法 用来创建对象
修饰内部类
修饰代码块
类被加载时执行一次,初始化时机和静态属性显示初始化一致
抽象类 (abstract)
如果一个类有抽象方法,则这个类必须被声明为抽象类
抽象类中未必有抽象方法
抽象和普通类的定义区别就是抽象方法和修饰符
抽象类不可以被实例化(不能创建对象)
强烈建议:将被继承的类设计为抽象类
接口(interface)
类 实现(implements) 接口
接口是约定:实现接口的类必须重写接口中所有的方法,否则就要声明为抽象类
接口代表能力:实现了接口的类就是具备了接口所描述的能力
接口是一种角色:一个类可以实现多个接口,一个接口也可以被多个类实现
接口弥补了单继承的缺点
接口的继承
接口可以多继承
java中的接口
单方法接口:这个唯一的方法通常都是会掉方法
Runnable
Comparable
标识接口:没有方法,单表示了某种能力
Serializable
内部成员:
public static final 修饰的常量
public abstract 修饰的成员方法
1.8之后,可以定义默认方法 default 定义
内部类
普通成员内部类
定义在类体中
可以访问外部类的成员变量和方法
外部类不能直接访问内部类的内容,但是可以创建内部类对象访问, 直接使用内部类名创建就可以了
外部类以外访问: 外部类名.内部类名 内部类对象引用 = new 外部类名().new 内部类名();
私有成员内部类
定义在类体中, 使用private修饰类
class 外部类{
private class 内部类名{
内部类内容
}
}
私有内部类也可以访问外部类的内容
外部类也不能直接使用私有成员内部类的内容. 可以同私有成员内部类名 创建对象之后访问私有成员内部类的内容.
外部类以外不能访问.但是可以把私有成员内部类定义到方法中,外部类以外调用方法间接的访问
静态成员内部类
定义在类体中
格式: class 外部类 {
static class 内部类{
内部类成员变量;
内部类成员方法;
内部类静态变量:
内部类静态方法;
}
}
静态内部类能直接使用外部类的成员变量吗? 不能直接使用. 创建一个外部类对象后就可以访问外部类的成员变量.成员方法.
静态可以直接访问外部类的静态变量和静态方法
外部类能直接访问静态内部类的内容
外部类以外
访问静态内部类的成员内容
创建静态内部类对象: 外部类名.内部类名 内部类对象引用 = new 外部类名.内部类名();
访问静态内部类静态内容
外部类名.内部类名.静态内容
局部内部类
定义在方法中的类,只能在这个方法中直接使用,可以用来封装访问传递过来的参数.
格式: 方法{
class 类名 {
类的内容;
}
}
外部的话只能通过调用局部内部类所在的方法间接的访问.
匿名内部类
没有名字的内部类
使用的前提
创建一个类的对象
实现一个接口
作用: 快速的为一个类创建一个子类或者为一个接口创建一个实现类
格式:
继承一个类
new 类名(){
重写类的方法;
};
实现一个接口
new 接口名(){
重写接口中的方法;
};
代码块
静态代码块
为静态属性赋值
执行顺序和静态属性的显式初始化一致
构造代码块
为非静态属性赋值
执行顺序和属性的显式初始化一致
包
包的本质就是文件夹,使用用存储java的源码和编译生成.class子界面文件的文件夹
包的好处
分类管理我们定义类
可以在不同的包下定义同名类
包的命名规则: 域名倒写 com.xxx.dao; com.xxx.server; com.xxx.service; com.xxx.entry;
包的效果: 把一个类放到包中类名就会发生变化:
全类名: 包名+类名; com.xxx.entry.Person;
声明的包: package 包名
必须放到第一行
别的包下才需要导包.为了简化使用带有包的类: 可以通过导包的方式,在一个类中直接使用类名创建: import 类的全名(包名+类名)
如果一个类是定义在默认包中,则这个类没有办法被进行导入 ,默认包中的类没有办法导入
自己的包下.可以直接使用类名
当多个包中定义的相同的类名: 此时不能导包, 必须使用全类名的方式使用同名的类;
0 条评论
下一页