javaSE
2020-07-03 12:06:30 0 举报
AI智能生成
javaSE
作者其他创作
大纲/内容
01 J2SE概述
java包括三大块
java语言特性
java的加载与执行
jdk,jre,jvm
一个简单程序的注释
02 Java语言基础
标识符
命名规则,命名规范
关键字
字面值
变量
局部变量,成员变量
数据类型
基本数据类型(八大)
1248,4812:byte,short,int,long,float,double,boolean,char
引用数据类型
运算符
算术运算符
+,-,*,/,%,++,--
关系运算符
>,<,>=,<=,==,!=
逻辑运算符
&,|,!,^,&&,||
赋值运算符
基本
=
扩展
+=,-=,*=,/=,%=
扩展类的赋值运算符相当于加了强制类型转换!
字符串连接运算符
+
三元运算符、三目运算符、条件运算符
布尔表达式?表达式1:表达式2
控制语句
选择语句
if,if..else,if..else if..else
switch
case,default
case穿透现象(break帮助阻止穿透)
循环语句
for
while
do..while
控制循环语句
break
switch或者循环语句当中
continue
方法
方法执行过程中的内存分配
代码片段在方法区存储,调用到栈内存中使用
JVM大致分为3块:方法区内存,栈内存,堆内存
方法的重载机制
方法名相同,参数列表不同
方法的递归调用
无限递归java.lang.StackOverflowError
递归需要结束条件
03 面向对象
面向过程,面向对象
类和对象
类:属性(状态)+方法(动作)
三大特性
封装
继承
extends
只支持单继承
Object类
默认继承自它
多态
向上转型,upcasting
子到父
自动类型转换
向下转型,downcasting
父到子
强制类型转换(加强制类型转换符)
可能存在java.lang.ClassCastException
存在安全隐患
解决:instanceof运算符,返回boolean
JVM
方法区内存
在类加载时,class字节码代码片段会被加载到内存空间中
最先有数据
栈内存
(局部变量在栈内存中存储)方法代码片段执行时,会给方法分配内存空间,在栈内存中压栈
变化频繁
堆内存
new出的对象在堆内存中存储
垃圾回收器针对它
变量(引用)
局部变量
方法体中申明
栈
成员变量
方法体外申明
实例变量
无static
堆
静态变量
有static
方法区
属性访问方式
get方法
读取值
set方法
修改值
构造方法
作用:1.创建对象 2.创建对象的同时初始化实例变量的内存空间
无参构造器
有参构造器
this关键字
this变量中保存了内存地址指向自身,this存储在JVM堆内存的java对象内部
this和对象相关,N对N
static关键字
类级别,与具体对象无关
类名.访问,非引用.访问(可以,但有警告,不会空指针异常)
静态方法
静态变量
静态代码块
类加载时执行,只执行一次,可以写多个,自上而下
类加载时刻
对比:实例代码块
构造方法执行前执行,可以写多个,自上而下
对象初始化时刻
方法的覆盖(方法重写)
Override
方法名相同,形参列表相同,返回值类型相同
final关键字
final+static,变量:常量!
类不能继承,方法不能重写,变量不可再赋值,引用不可再指向
package包,import
访问控制权限
public
表公开的,在任何位置都能访问
protected
同包或者子类,都可以访问
缺省default
同包下可以访问
privated
表私有的,只能在本类中访问
从上到下,从大到小!!
==
基本数据类型比较值,引用数据类型比较引用地址
equals方法可以被重定义,原先与==含义相同
String类的equals被重写了
单例模式
饿汉式单例
懒汉式单例
构造方法私有化
构造方法私有化,没有子类
super关键字
抽象类,抽象方法
abstract
抽象类中不一定有抽象方法,但抽象方法必须出现在抽象类中
非抽象类继承抽象类,要将抽象类中的抽象方法覆盖,实现,重写
抽象类为了继承,抽象方法为了覆盖,二者不能被final所修饰
接口
接口中只能出现常量和抽象方法
接口是特殊抽象类,特殊在接口是完全抽象的
一个类可以实现多个接口
接口和接口间可以多继承
implements
Object类
toString方法
equals方法
finalize方法
程序员不调用,系统自己调用
垃圾回收
clone方法
hashCode方法
内部类
静态内部类
等同静态变量
成员内部类
等同成员变量
不可有静态声明
局部内部类
等同于局部变量
不可以加修饰符,main函数使用不了
匿名内部类
使用较多
类和类之间的关系
泛化关系
继承
is a
实现关系
类和接口
is like a
关联关系
has a
聚合关系
合成关系
依赖关系
04 异常处理
1.Error
JAVA程序运行过程中若出现了错误,错误不能处理,只能退出JVM
2.Exception
是可处理的,没有处理异常,则程序退出JVM
编译时异常
不处理发生几率高
运行时异常
发生几率低没必要处理
处理异常的两种方式
声明抛出
throws
捕捉
try...catch...
catch不能换序,必须从上到下,从小到大进行捕捉
catch最多执行一个,且try之后代码不再执行,执行try...catch...之后的语句内容
打印信息
printStackTrace
e.printStackTrace
getMessage
String msg = e.getMessage();
System.out.println(msg);
若都不写,控制台会带来一种无异常的错觉
finally语句块
try...finally
try...catch...finally
try中内容会执行不完整,但finally会执行,常在finally语句块中释放资源
final,finalize,finally区别
final
修饰:类不可继承,方法无法被覆盖,成员变量需要手动赋值,局部变量一旦赋值不可改变;final+static变成常量
finalize
Object中的一个方法名,垃圾回收器回收垃圾之前调用finalize
finally
异常处理的语句块
注:重写的方法不能比被重写的方法抛出更为广泛的异常
05 数组
一维数组,二维数组,多维数组
长度不可改变,固定的,元素类型统一
查找效率高,增删元素效率低
静态初始化(赋值),动态初始化(赋默认值,初始化大小)
main方法中,String[] args,接收命令行参数
arraycopy方法,数组的拷贝,(源数组,源数组开始下标,目标数组,目标数组开始下标,拷贝长度)
接受键盘输入
import java.util.Scanner
冒泡排序
一个个冒出来,最大or次大......
缺点:只要比较就交换位置
选择排序
也是一个个排序,但是是找到最值再交换
折半查找法(二分排序)
Arrays工具类
06 常用类
String类
不可变类,不可修改,但引用可以重新指定,eg:String s1= "abc";s1="bef";这两句没毛病!!
字符串在字符串常量池中,在方法区中存储
原因:字符串使用较多
字符串常量池是一个缓冲区,为了提高访问字符串效率
多用String s = “abc”;少用String s = new String(“abc”);前者为字符串常量池在方法区可复用,后者不仅在方法区中还在堆空间中创建
String不能拼接,否则字符串常量池大量占用,垃圾回收是问题
常用方法
正则表达式专题
StringBuffer和StringBuilder
字符串缓冲区,底层是数组,可自动扩容
默认初始化容量16
优化:防止底层数组拷贝,初始化时估计容量去初始化
StringBuilder非线程安全,StringBuffer线程安全的
append方法追加
基本数据类型包装类
java.lang.-
Byte
Short
Integer
整型常量池:-128-127
Long
Float
Double
Boolean
Character
自动装箱自动拆箱 jdk1.5
BigDecimal
Date日期类
java.util.Date
java.text.SimpleDateFormate
日期字符串间的格式转换
Calendar日历类
子主题
数字类
java.text.DecimalFormat
数字格式化
java.math.BigDecimal
数据精度极高
Random随机数
enum枚举
07 集合
List
有序集合,可重复
Set
无序集合,不可重复
Map
无序集合,值+键
见图谱!!
泛型
编译期概念
优点:统一类型,减少强制类型转换
缺点:类型太统一,只能存储一种类型
foreach
jdk5.0的新特性,增强for循环
缺点:没有下标
for(类型 变量:数组名/集合名)
08 流与文件
输入流和输出流,针对内存而言!内存出来输出,到内存是输入!
输入读,输出写
字节流,字符流,字节流按照字节方式读取,字符流按照2个字节1个字符
字节流:视频声音图片等二进制文件
stream结尾
啥文件都可以拷贝
字符流:纯文本文件
reader或writer
可以避免半个字符一个字节的乱码现象
见图谱!!
装饰者模式
泛化(继承)关系耦合度太高,使用关联关系
装饰者中包含被装饰者的引用,二者实现同一类型接口,关闭时,关最外面的即可
序列化与反序列化
java文件编译成class文件,class文件反编译成java文件
java.io.ObjectOutputStream
序列化,java对象到硬盘
写
java.io.ObjectInputStream
反序列化,硬盘数据到JVM内存
读
java.io.Serializable
SerialVersionUID
序列化版本号需要一致
java.io.File
File类
与流无关,和硬盘上的file,directory有关
09 多线程
进程,多进程,线程,多线程
线程与线程之间共享堆内存和方法区内存,栈内存是独立的,一个线程一个栈
实现多线程的两种方法
继承java.lang.Thread类
Thread类本身实现了Runnable接口
实现java.lang.Runnable接口
线程的生命周期(状态图)
线程安全问题,线程同步问题,加锁
异步编程模型,各走各
同步编程模型,一个等一个
效率会变低
synchronized
类锁,对象锁
死锁
守护进程
其他线程结束,守护线程才退出,无限执行,eg:垃圾回收器
Timer定时器
10 反射
反编译:class到java,通过反射机制来访问Java类中的属性,方法,修饰符,构造方法
获取class对象的三种方式
Class c = Class.forName("Employee")
会执行静态语句块(字节码加载到JVM中时)
Class c = Employee.class
不会执行静态语句块
Class c = 引用.getClass()
会执行静态语句块
c.newInstance()
调用了类的无参构造器,返回一个实例
可变长参数
eg:m1(int... a)
可变长参数可以视为数组
可变长参数只能出现一次,且只能出现在所有参数的最后一位
IO+Properties
配置文件,属性文件
IO+Properties+reflect
灵活,代码耦合度降低
四点
java.lang.reflect.Field
setAccessible(true),打破封装使其不安全
获取属性
java.lang.reflect.Method
获取方法
invoke方法
java.lang.reflect.Modifier
修饰符
java.lang.reflect.Constructor
构造方法
可以获取父类和父接口
既然反射可以拿到private里的值,那private的意义在哪里?
1.Java的private修饰符不是为了绝对安全设计的,而是对用户常规使用Java的一种约束。就好比饭店厨房门口挂着“闲人免进”的牌子,但是你还是能够通过其他方法进去。
2.private的意义是OOP(面向对象编程)的封装概念。
3.setAccessible(true),这行代码取消了java的权限控制检查,会产生安全隐患
2.private的意义是OOP(面向对象编程)的封装概念。
3.setAccessible(true),这行代码取消了java的权限控制检查,会产生安全隐患
缺点:破坏封装性,效率不高
0 条评论
下一页