记录java基础知识!
笔记摘自:黑马课程
准备
新建project - “java基础知识”
- 练习全部放在project下
新建module - “Day01Demo”
- 每天的学习内容,新建一个module来存放。最终所有的学习内容都存放是一个project中的多个module下,方便复习。
什么是抽象类?
父类知道子类一定要完成某个功能,但是每个子类完成的情况是不一样的。
子类以后也只会
抽象类被继承就要被重写全部的抽象方法
什么是接口?
接口更加彻底的抽象,在JDK1.8之前接口中只能是抽象方法和常量
接口体现的是规范思想,实现接口的子类必须重写完接口的全部抽象方法
小结:
接口体现的是规范思想。JDK1.8之前接口中只有抽象方法和常量,除此之外没有其他成分,故修饰符可不写会默认加上。
接口中,抽象方法,可省略public abstract
抽象类中除了抽象方法还能有普通方法,所以不能省略
常量一般修饰符是:public static final
常量的变量名建议字母全部大写,多个单词用“_”连接
接口中常量是可以省去public static final不写,默认会加上
单继承,多实现
extends
implements
类与类是继承的关系,单继承。
类与接口是实现的关系,多实现。
接口与接口是多继承关系
一个类实现接口必须重写完接口中全部的抽象方法,否则这个类要定义成抽象类。
jdk1.8之后
接口中除了抽象方法、常量外,还有:
默认方法
- default
- 只能用接口的实现类的对象来调用
静态方法
- static
- 只能用接口的接口名称来调用
私有方法
- Jdk1.9
- private
- 只能在本接口中访问,通常给私有方法、默认方法调用
/** */
使用文档注释,类、方法、类变量
编译后会保存。
代码块按照有无static修饰可以分为:静态代码块、实例代码块
静态代码块
static{
}
final是“最终”的含义。
final可以用于修饰类,方法,变量。
final修饰类,类不能被继承。
请问abstract和final的关系是什么?
互斥关系,不能同时出现修饰成员
final修饰变量:有且仅能被赋值一次(赋值后不能修改)
final修饰静态成员变量
常量
- public static final修饰,名称字母全大写,多个单词用下划线连接
单例模式
什么是单例?
单例的实现方式目前有两种:
- 饿汉模式
- 提前创建好对象
- 懒汉模式
- 需要的时候才创建对象
多态
polymorphic
多态的形式
父类类型 对象名称 = new 子类构造器
接口 对象名称 = new 实现类构造器
概念:
同一个类型的对象,执行同一个行为,在不同的状态下会表现出不同的行为特征
注意:是行为即成员方法调用子类的,变量会调用父类的
多态的优劣势
- 优势
- 在多态形式下,右边对象可以实现组件化切换,业务功能也随之改变
- 便于扩展和维护,可以实现类与类之间的解耦
- 实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法
- 可以传入一切子类对象进行方法的调用,更能体现多态的扩展性和便利
- 在多态形式下,右边对象可以实现组件化切换,业务功能也随之改变
- 劣势
- 多态形式下,不能直接调用子类特有的功能。编译看左边,左边父类中没有子类独有的功能,所以代码在编译阶段就直接报错了。
- 小结:
- 类与类之间的解耦
- 不能直接调用子类特有功能
在进行类型转换前,最好先使用instanceof进行类型判断。
类的五大成分:成员变量、成员方法、构造器、代码块、内部类
内部类
可以提供更好的封装性,内部类有更多权限修饰符,封装性有更多的控制。
可以体现出组件的思想
定义在一个类里面的类就是内部类
分类:
- 静态内部类
- 实例内部类(成员内部类)
- 局部内部类
- 匿名内部类
匿名内部类
- 简化代码
- 没有名字的内部类
- 一旦写出来,就会立即创建一个匿名内部类的对象返回
- 匿名内部类的对象的类型相当于是当前new的那个类型的子类类型
包
一般是公司域名的倒写+技术名称。
包名建议全部用英文,多个单词用“.”连接,必须是合法标识,不能用关键字
注意:
- 相同包下的类可以直接访问。
- 不同包下的类必须导包,才可以使用。
- 导包格式:
import 包名.类名
- 导包格式:
数组复制
1 |
System.arraycopy(); |
解决数学运算精度问题,使用:BigDecimal
正则表达式
1 |
String str = "我是电话号码13458473958,我是邮箱1134759683@qq.com,我也是电话号码400-100-3243"; |
泛型就是一个标签:<数据类型>
泛型可以在编译阶段约束只能操作某种数据类型
注意:JDK1.7之后,泛型后面的申明可以省略不写。泛型和集合都只能支持引用数据类型(自动装箱),不支持基本数据类型
优点
- 泛型在编译阶段约束了操作的数据类型,从而不会出现类型转换异常。
- 体现了Java的严谨性和规范性,数据类型经常需要进行统一
泛型没有继承关系 –》 泛型通配符;泛型的上下限
- ?,代表任意类型
- ? extends MyObject,?必须是MyObject或其子类(泛型的上限为MyObject)
- ? super MyObject,?必须是MyObject或其父类(泛型的下限为MyObject。不常用)
E、K、T、V,在定义泛型时使用,代表一切类型。
?,在使用泛型时使用,代表一切类型。
- E - Element (在集合中使用,因为集合中存放的是元素)
- T - Type(Java 类)
- K - Key(键)
- V - Value(值)
常见数据结构
如果查询多而增删少用ArrayList集合。(用的最多的)
如果查询少而增删首尾较多用LinkedList集合。
小结:
如果希望set集合认为两个对象只要内容一样就重复了,必须重写对象的hashcode和equals方法。
如果希望元素可以重复,又有索引,查询要快用ArrayList集合。(用的最多)
如果希望元素可以重复,又有索引,增删要快要用Linkedlist集合。(适合查询元素比较少的情况,经
如果希望增删改查都很快,但是元素不重复以及无序无索引,那么用Hashset集合。
如果希望增删改查都很快且有序,但是元素不重复以及无索引,那么用LinkedHashset集合。
Treeset,默认升序排序(小到大)
引用数据类型,排序,需重写接口Comparable的比较方法。(可实现升序、降序)
集合自带比较器对象
如果类和集合都存在大小规则,默认使用集合自带的规则进行大小排序!!
TreeSet集合对自定义引用数据类型排序,默认无法进行(报错)
但是有两种方式可以让程序员自定义大小规则:
- 直接为对象的类实现比较器规则接口Comparable,重写比较方法(扩展方式)
- 直接为集合设置比较器Comparator对象,重写比较方法
- 注意:如果类和集合都带有比较规则,优先使用集合自带的比较规则。
数据存储的常用结构有:栈、队列、一维数组、二维数组、链表、红黑树(二叉树)
P117 00:00
学习ing,持续更新中!