一、类与对象
1.1概念
类是一类事物的抽象概念,它不指代某一个具体的事物,是一种带有范围指向性的范围。对象是指对应的某一个类中的一个具体的实体,一个个体。可以说万事万物皆对象,类和对象是一种相对的概念。
1.2 实体类
1.2.1 方法
概念
方法是一段代码块的封装,方法中的代码应该围绕着某一个功能的实现来写,目标明确,逻辑要清晰。
规范
非静态方法
public class Example01 { //类的入口
//修饰符 返回值类型 方法名(参数类型 参数名1,参数名2......){方法体}
public void demo(String name,int age){//方法的入口
//代码块
}
}
静态方法
public class Example01 { //类的入口
//修饰符 返回值类型 方法名(参数类型 参数名1,参数名2......){方法体}
public static void demo(String name,int age){//方法的入口
//代码块
}
}
非静态方法与静态方法的对比
静态方法 | 非静态方法 | |
---|---|---|
修饰 | static 关键字 | 无static关键字 |
调用 | 调用时无需创建对象 | 调用时要创建对象 |
示例 | 类名.方法名 | 对象名.方法名 |
静态方法是属于类的,可供所有对象使用,在内存中有且只有一个。
非静态的方法是属于对象的,每个对象都有一个,每创建一个对象就多一个新的非静态变量或方法。
参数
形参:形式参数,在声明一个方法时,方法名后面的小括号中,就是形参,格式(参数类型 参数名,…)。
实参:实际参数,在调用一个方法时,方法名后面的小括号中,就是实参,
格式:(参数值或同类型的变量)。
1.2.2 方法的重载
概念
同一个类中同名的方法,形参列表不同(形参的个数或者类型)。
示例
public static void main(String[] args) {
System.out.println(11);
System.err.println("出错");
}
err和out都是printStream类的对象,println都是printStream类中的方法,
符合同一个类中,同名不同参,所以构成重载。
1.2.3 封装和继承
封装
概念
成员属性容易被非法篡改,会有很大的安全隐患,所以可以加上修饰符private,但就无法在其他类中调用,于是就有了getter和setter方法,可以间接访问成员属性.
封装的步骤
- 属性私有化
- 提供公共的访问和赋值方法
封装的优点
- 有效保护了属性,降低了非法篡改和赋值的风险
- 降低了耦合度
继承
概念
两个类之间的关系(父子关系),如果两个类的范围有绝对的包含关系,这两个类就可以构成父类和子类的关系。
继承的特点和本质
特点: 子类在继承父类后,可以使用父类的属性或方法,也可以使用子类特有的方法。
本质: 在调用子类的构造方法时,系统会默认先调用父类的构造方法。
this和super的区别
this: 在本类成员方法中,访问本类的成员属性和另一个成员方法;在本类的构造方法中,访问本类另一个构造方法。
super:在子类的成员方法中,访问父类的成员方法或者成员属性;在子类的构造方法中访问父类的构造方法。
重写
概念
子类覆盖父类的同名方法,参数也要相同,返回值也要相同,访问权限只能大于或者等于父类方法的权限。
优点和缺点
优点:功能的扩展
缺点:父类中被覆盖的方法,不可能被执行,功能的丢失;在被子类继承的过程中,方法容易被恶意覆盖。
风险的预防
- 用final修饰类,该类不能被继承
- 构造方法私有化
- 修饰的变量成为常量,值不能被修改。
多态
- 向上转型
Object o=new Object();
o=new Pet();//用父类类型接受子类对象
o=new Dog();
- 向下转型
Animal animal=new Dog();
if (animal instanceof Dog){
//instanceof 判断某个对象是否由某个类产生
Dog dog=(Dog)animal;
}
加载顺序
加载类的时候,会加载所有静态相关的代码:静态属性,静态方法,静态代码块
注意
java中只支持单继承,一个子类只能有一个直接父类,不支持多继承。
1.3 抽象类
1.3.1 结构
public abstract class 类名{代码块}
1.3.2 抽象方法
public abstract void 方法名();
- 含有抽象方法的类一定是抽象类,但抽象类不一定含有抽象方法。
- 父类是抽象类,作为子类要么继续声明为抽象类,要么就重写父类的所有抽象方法。
- 抽象类不能实例化,不能通过new关键字创建对象.
- 抽象方法不能被直接调用。
- 子类在重写了父类的抽象方法后,可以创建对象,并且会隐式的创建父类的对象。
1.3.3 接口
- 接口可以理解为定义的一组通用的组件,或者功能模块。
- 接口中的属性是公共的静态的常量,不可被修改。
- 接口中的方法可以定义为抽象方法和静态方法。
1.4 内部类
类别 | 内部访问外部 | 外部访问内部 |
---|---|---|
成员内部类 | 可直接访问 | 创建内部类的对象 |
静态内部类 | 可访问静态属性和静态方法,非静态要创建对象 | 不用创建外部对象 |
- 局部内部类定义在方法中,充当内部变量,使用的范围仅限在定义类的方法中。
- 匿名内部类作为传参时使用,用于继承或实现接口时使用。
1.5 包装类
为每种基本数据类型定制的属于自己的类,称之为包装类。类似于码头货轮集装箱的拆箱和装箱的过程。包装类的构造方法一般都有重载。一个构造方法的参数是对应的基本数据类型,另一个则是参数为字符串类型的构造方法。
二、 正则表达式
正则表达式常常用来验证用户输入的数据是否合法,保证和规范数据的正确,便于后台工作人员的维护和统计。
- 字母匹配字母(a-z),数字匹配数字(0-9) , -匹配-
- [ ] 表示匹配中括号中的任意一个字符
- -在中括号外表示 - ,在中括号内表示范围
- ^在中括号外表示开头,在中括号内表示除开括号内的其他字符
- $在中括号内表示结尾
- 小数点表示任意字符
- \d 表示数字(java用 \ \d)
- \w 可匹配字母,数字,下划线(\ \ w)
- [ \u4e00-\u9fa5 ] 匹配汉字
- ?表示出现0或1次
- +表示出现1次或多次
- *表示出现任意次数
- { n }表示出现n次
- { n,m }表示出现n~m次
- { n, }表示出现n次或n次以上
- ( ? !正则表达式) 断言,表示排除正则匹配的情况
三、 集合
3.1 List集合
3.1.1 ArrayList
特点:集合没有固定的长度,没有固定的类型
常用方法:
- add()-------添加元素
- remove()------移除元素
- set()------修改元素
- get()------获取下标元素
- isEmpty()------是否为空
- contains()------是否包含当前元素
循环遍历:fro循环,增强for循环,do-while , while,迭代器Iterator
3.1.2 LinkedList
特点:插入,删除元素的效率比较高,是一种链式的数据集合。
常用方法:
- addFirst()-----添加第一个元素
- addLast()------添加最后一个元素
- removeFirst()------移除第一个元素
- removeLast()------移除最后一个元素
- getFirst()------获取第一个元素
- getLast()------获取最后一个元素
循环遍历: 与ArrayList类似
3.1.3ArrayList与LinkedList的区别
LinkedList在添加与删除时要比ArrayList的效率高很多
ArrayList的底层实现:Object [ ] Arrays.copyof()
LinkedList的底层实现: Node(E e,Node prev,Node next)
3.2 Set集合
特点:唯一(不允许出现重复的元素),无序(没有index下标)
创建对象:HashSet set=new HashSet();
常用方法:
- set.add()-----添加
- set.remove()------移除
由于set集合没有像list集合一样的下标所以查找和修改就没办法通过下标来处理,要想修改就只能重新添加元素。循环遍历也没办法通过下标来循环,只能循环遍历set集合中的元素。
3.3 Map集合
特点:map接口专门处理键值映射,有一个实现类HashMap , map中的key是不允许重复的,一个key只允许对应一个唯一的value。
常用方法:
- put()------增加
- remove()-----删除
- replace()------修改替换
- get()-----获取key所对应的value值
循环遍历map中所有的key:
Set keys = map.keySet();
for(Object key : keys){
System.out.println(key+"--"+map.get(key));
}
循环遍历map中所有的value:
Collection values = map.values();
for(Object value : values){
System.out.println(value);
}
循环遍历map中所有的键值对:
Set entries = map.entrySet();
for(Object entry : entries){
//向下转型 Object---map.Entry;
Map.Entry en = (Map.Entry) entry;
System.out.println(en.getKey()+"--"+en.getValue());
}