黑马程序员技术交流社区
标题:
JavaEE就业班前六天学习笔记
[打印本页]
作者:
syc123
时间:
2017-12-21 17:12
标题:
JavaEE就业班前六天学习笔记
本帖最后由 小石姐姐 于 2017-12-22 15:30 编辑
JavaEE就业班前六天学习笔记
Day 01
static静态关键字
static是一个关键字,用来修饰成员变量成员方法
static特点:
得所有的对象所共享
可以直接使用类名来调用
静态所修饰的成员加载优先于对象
随着类的加载而加载
注意事项
静态方法
可以调动静态的成员变量
可以调用静态的成员方法
不可以调用非静态的成员变量
不可以调用非静态的成员方法
直能在静态的方法中调用静态的成员
非静态方法
可以调用静态的成员变量、成员方法、非静态的成员变量和方法
## 静态的概述和特点
* static:
* 含义
* 静态
* 是一个关键字
* 作用
* 修饰成员变量, 成员方法, 使其被该类的所有对象共享
* 修饰类(后面讲)
* 如何调用static修饰的变量和方法
* `类名.静态成员属性`: `System.out`
* `类名.静态成员方法();`: `Arrays.toString(arr);`
* 静态的特点
* 静态成员被所有对象共享
* 静态成员可以直接使用类名调用
* 静态成员的加载优先于对象
* 静态资源在创建类时加载并初始化(在方法区中)
* 非静态资源在创建对象时才加载并初始化(在堆内存中)
* 静态成员生命周期
* 随着类的加载而创建, 直到程序结束
* 举例
* 班级中同学要喝水
- 水杯每个同学各自用, 不能共用: 对象各自有各自用的
- 饮水机所有同学共用, 不能一人一个: 所有对象共用的
## 静态的内存图解
* 静态成员在内存中的位置
* 方法区中的类的字节码区域中的静态区域中
* 静态成员的加载时机
* 随着所在类的加载而加载
* 静态成员和非静态成员的区别
* 生命周期不同
* 静态成员: 随着类的加载而创建, 随着程序结束而销毁
* 非静态成员: 随着对象的创建而创建, 随着对象的销毁而销毁
* 所以, 静态成员的生命周期优先于非静态成员创建, 晚于非静态成员销毁
* 内存中的定义位置不同
* 静态成员: 方法区中类字节码区域的静态区中
* 非静态成员: 堆内存中
* 初始化时机不同
* 静态成员: 类加载时初始化
* 非静态成员: 对象创建时初始化
## 静态注意事项
* static的访问规则:
* 静态方法中
* 可以调用静态的成员变量
* 可以调用静态的成员方法
* 不可以调用非静态的成员变量
* 不可以调用非静态的成员方法
* 非静态方法中
* 可以调用静态的成员变量
* 可以调用静态的成员方法
* 可以调用非静态的成员变量
* 可以调用非静态的成员方法
* 综上所述:
* 静态方法中只能调用静态成员:
* 原因: 因为静态方法随着类的加载而加载, 而非静态方法随着对象的创建而加载, 当静态方法加载时, 并不一定创建了对象, 所以不一定有对象可以调用非静态方法, 为了避免这种不安全的访问, 所以静态方法中只能调用静态资源
* 非静态方法中可以调用静态和非静态成员
* 原因: 非静态方法随着对象的创建而创建, 对象创建的前提是类已经加载, 类在加载时已经加载了静态资源, 所以当对象调用非静态方法时, 静态资源一定存在, 这种访问是安全的
* 静态方法中**不能**用this
* 因为this引用当前类的对象, 而静态方法在类加载时已经加载, 此时没有对象可以引用
abs绝对值
ceil向上取整
floor向下取整
round四舍五入
pow返回第一个参数的第二个参数次幂
random返回一个随机数大于0.0小于1.0的
代码块:
局部代码块;存在于方法中,控制变量的生命周期(作用域)
构造代码块:提取构造方法中的共性,每次创建对象都执行,并且在构造方法执行之前执行
静态代码块:随着类的加载而加载,只加载一次,加载类时做的一些初始化,
同部代码块(多线程讲解)
DAY2
继承 多各类有共同的成员变量和方法,抽取到另外一个类中(父类),再让多个类去继承这父类,我们的多个类就可以获取到父类中的成员了
extends
Java中继承特点:
Java语言只支持单一继承,只能继承一个父类
Java语言支持多层继承,(一个儿子一个亲爹一个亲爷爷)
继承中成员变量的特点:
子类只能获取父类非私有成员
子父类中成员便令的名字不一样直接获取父类的
子父类中一样是子的
就近原则:谁离近就用谁
如果有局部变量就用局部,若没有,有子类的就用子类的,若都没看父类父类有用父类
啥都没就出错了
super 可以获取父类的成员变量和方法,用法和this一样
继承中成员方法的特点:
子类没有这个方法调用父类
子类重写了这个方法,掉子类
方法的重写:在子父类中,子类和父类方法完全一样(覆盖),重写后调用就是子类的
override 、重载overload
重写应用场景:父类方法不能完全满足子类使用,并可以用关键字super调用父类的方法
注意事项:
不能重写父类私有的方法,
权限必须大于等于父类权限
注解:@
继承中构造方法的执行顺序
在有子父类继承关系的类中,创建子类的对象,调用子类构造方法,若子类第一行没有调用父类则默认调用父类无参
可以用super()在子类第一行调用父类有参
肯定会先执行父类的构造,因为要先给父类的成员变量初始化,子类可能用到
this super 的区别
this:当前对象的引用
调用子类成员变量和方法
在子类构造方法第一行调用子类其他方法
super:子类对象的父类引用
匿名对象,没有变量引用的对象
应用场景,当方法只调用一次时
final 修饰符 可以修饰类成员方法和变量
final所修饰的类不能被继承,不能有子类
final所修饰的方法不能被重写
变量不能被修改,是常量,自定义常量:字母全大写不同单词-分开
抽象
abstract 关键字 用于修饰方法和类
抽象方法:不同类的方法是相似,但是具体内容又不太一样
抽象类:有抽象方法的类必须是抽象类
注意:一个类继承了抽象类必须重写它的抽象方法否则这个类就地是抽象类
抽象类的成员特点:
可以有成员变量、常量
可以有抽象方法、非抽象
可以有构造方法的,需要对抽象类的成员变量进行初始化
Day 3
接口
接口是一个比抽象类还抽象的类,接口里所以方法都是抽象方法,接口和类的关系是实现 implements
interface
格式 权限修饰符 interface 接口名{
}
接口成员特点:
只能有抽象方法,
默认使用public&abstract修饰方法(建议手动给上默认
只能有常量
默认使用public static final修饰
注意:接口不能创建对象(不能实例化)
类与接口关系是实现关系,一个类实现一个接口必须实现它所有的方法
类与类:继承关系,单一 多层继承
类与接口:实现关系,多实现
接口与接口:继承关系,多继承
接口的优点:
1.打破了继承的局限性
2.对外提供规则(USB接口)
3.降低了程序的耦合性(可以实现模块化开发,定好规则,每个人实现自己的模块,提高了开发效率)
接口和抽象类区别:
共性,不断的抽取,抽取出抽象的概念
区别 1:类与接口是实现关系
2:类与抽象类是继承关系
成员区别:
1:抽象类可以有成员变量和常量
接口只能有常量
成员方法:
抽象类可以有抽象方法,和非抽象
接口只能有抽象方法,而且方法有默认修饰负
构造方法
抽象类有,接口没有
多态
前提:有子父类继承关系,
方法的重写
父类引用指向子类对象
动态绑定:运行期间调用的方法,是根据其具体的类型
多态的成员特点:
成员变量 编译时看左边,运行看左边
成员方法:编译时看左边,运行看右边
静态方法:编译左运行左
多态中的向上转型和向上转型:
引用类型之间的转换
向上转换:由小到大(子类转换成父类)
向下转型:由大到小
多态的优点:
缺点:无法直接访问子类持有的成员
优点:可以提高可维护性(多态前提所保证的),提高代码可扩展性
Day4
包的特点:
可以有多层,
不同包下的文件名可以重复
包的声明必须是第一行代码
不同包之间的相互访问:
使用类的全名
使用关键字import将类导入
*代表通配符,代表导入了这个报下所以类,并没导入子包下的类
类的全名:包名.类名
权限修饰符:
public 当前类,相同包下不同类,不同包下的类
default(不写)当前类,相同包下不同类
private 当前类
protected 当前类,相同包下不同类
default当前包下使用 protected 子类
成员内部类:
在类的成员位置,
局部内部类
在方法中,出了就不行了
匿名内部类:
一个没有名字的局部内部类
必须在定义匿名内部类时创建对象
格式: new 类/接口(){
};
原理:而是创建了继承这个类的子类对象伙食创建了实现这个接口的子类对象
匿名内部类应用场景:
作为参数进行传递
Day5
获取字节码对象方式
1 通过Object类的getClass()方法获取
2 通过类名调用属性class
通过class类的静态方法forName()来获取
System 包含一些游泳的类字段和方法怒能被实例化
复制数组
放回当前系统时间 毫秒返回 至今过了多少毫秒
终止虚拟机运行
Date 表示特定的瞬间,紧缺到毫秒,通过方法来设定自己所表示的时间可以表示任意时间
构造方法:
Date() 创建的是表示当前系统时间的
Date(long date) 根据指定时间创建Date对象
Date的常用方法
毫秒值----Date
设置
返回值是void,参数long
void setTime(long time)
Date----毫秒值
获取
返回long,无参
long getTime()
SimpleDateFormat:
格式化 DAte---String
String format(Date date)
解析 String----Date
Date parse(String source)
Calender 日历 ,提供了年月日时的方法
字符:
x: 一个字符x
\\: 表示\反斜杠.
为什么有2个? 第一个\是转义的作用
[abc]: a或b或c, 即中括号字母中的其中一个
[^abc]: 除a, b, c之外的任何字符.
^表示否定
[a-zA-Z]: 小写英文a到z, 以及大写英文A到Z.
-表示范围
预定义字符
.: 任何字符(对于行结束符, 可能匹配, 也可能不匹配)
\d: 数字0-9. 相当于[0-9]
d是digital的缩写
\D: 非数字. 相当于[^0-9]
\s: 空白字符. 相当于[ \t\n\x0b\f\r], 包括空格(第一个空就是空格)
s是space的缩写
\S: 非空白字符. 相当于[^\s]
\w: 单词字符. 相当于[a-zA-Z_0-9]
w是word的缩写
\W: 非单词字符. 相当于[^\w]
Greedy数量词
X?: X这个字符出现一次或零次
X*: X这个字符出现零次或多次, 包括一次
X+: X这个字符出现一次或多次
X{n}: X这个字符恰好出现n次
X{n, }: X这个字符至少出现n次
X{n, m}: X这个字符至少出现n次, 但不超过m次
Day 6
Collection 接口 ,不能实例化
Collection c=new ArrayList()多态,父类引用指向子类对象
c.clear()清空
isEmpty()是否为空
int size()返回集合中元素个数
集合的便利方式
1 toArray(),可以把集合转换成数组,然后遍历
2 iterator(),可以返回一个迭代器,通过迭代器对象来迭代集合
Interator 可以用于遍历集合
E next 返回下一个元素
boolean hasNext() 判断是否有元素可获取
迭代器是依赖于集合的,相当于集合一个副本,操作时若发现和集合不一样则会出现异常
泛型,是一种广泛的类型,把我明确类型的工作提前到了编译时期,借鉴了数组的特点
好处: 避免了类型转换问题
可以减少黄色警告
简化代码书写
看到<E> 就可以使用泛型了
foreach 增强for循环,一般用于遍历集合或数组
for(元素的类型 变量 :集合或者数组对象){
可以直接使用变量;
}
注意 在增强for循环中不能修改集合,否则会出现并发修改异常
常见的数据结构:
数组 :查找快,增删慢
链表: 尤连子连接起来的一堆结点
结点:地址值,值,下一个结点地址值
特点:查询慢,增删快
栈&队列
栈:先进后出
队列:先进先出
List:
有序的(存储和读取的顺序是一致的)
有整数索引
允许重复的
功能:增删改查
List的常用子类
ArrayList
底层是数组结构,
LinkedList
底层是结构链表
LinkedList 的特殊功能
void addLast(E e)添加
addFirst
get 获得
remove 删除并返回
ollection接口(单列集合体系的顶层) | * boolean add(E e): 添加元素, 添加成功返回true, 否则false | * void clear(): 清空集合中的元素 | * boolean contains(Object o): 判断集合中是否包含指定的对象 | * boolean isEmpty(): 判断集合中是否没有元素. 与null区分 | * boolean remove(Object o): 从集合中删除一个元素, 删除成功返回true, 否则false | * int size(): 获取集合的长度(元素的数量) | * Object[] toArray(): 将集合转换为Object[]数组 | * Iterator<E> iterator(): 获取集合的迭代器对象 |- List接口(有序, 可重复, 有索引) | * void add(int index, E e): 添加元素到指定索引上 | * E remove(int index): 删除索引上的元素, 并返回 | * E set(int index, E e): 修改指定索引上的元素, 并返回被替换的元素 | * E get(int index): 获取指定索引上的元素 | * ListIterator listIterator(): 获取List特有的迭代器对象 |- ArrayList类(底层是数组, 查询快, 增删慢) |- LinkedList类(底层是链表, 查询慢, 增删快) * void addFirst(E e): 添加元素到集合的开头 * void addLast(E e): 添加元素到集合的末尾 * E getFirst(): 获取集合开头的元素 * E getLast(): 获取集合末尾的元素 * E removeFirst(): 删除开头的元素, 并返回 * E removeLast(): 删除末尾的元素, 并返回Iterator接口 | * boolean hasNext(): 判断是否有下一个元素 | * E next(): 获取下一个元素 | * void remove(): 删除迭代器返回的最后一个元素 |- ListIterator接口 * void add(E e): 使用迭代器添加元素到集合 * void remove(): 使用迭代器删除元素
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2