1 类和对象
类是一个模板,它描述一类对象的行为和状态。
对象是类的一个实例。
面向对象三大特性:封装、继承、多态
1.1 封装
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
实现Java封装步骤:
- 修改属性的可见性来限制对属性的访问(一般为private)
- 对每个属性提供对外的公共方法访问
public class EncapTest{
private String name;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge( int newAge){
age = newAge;
}
public void setName(String newName){
name = newName;
}
}
1.2 继承
继承就是子类继承了父类的行为和特征,使子类对象具有父类的方法。
- 为什么需要继承:可将重复性代码提取出来组成一个父类,降低代码量,提高维护性
- 继承的特性
1.子类拥有父类的非private的属性和方法
2.子类可以拥有自己的属性和方法
3.子类可用自己的方式实现父类的方法
4.java支持单继承,多重继承
5.提高类了之间的耦合性 - 继承关键字
1.extends
2.implements:可通过实现多个接口来达到多重继承
3.super:调用父类的方法
4.this:调用自己的方法 - 构造方法:子类不能继承父类的构造方法,如果父类的构造方法含有参数,则必须在子类的构造方法中显式地通过super调用父类的构造方法并配以适当的参数列表;如果父类总的构造方法无参数,子类的构造方法不需要调用父类的构造方法,系统会自动调用父类的无参构造方法。
1.3 多态
对象多种表现形式的体现,同一个事发生在不同对象上会产生不同效果。多态存在的三个必要条件:继承、重写、父类引用指向子类对象。
- 多态的实现方式
1.重写
2.接口
3.抽象类和抽象方法 - 重写
重写是子类对父类允许访问的方法的方法体进行重新编写,返回值和形参不能改变。 - 方法的重写规则
1.参数列表必须与被重写方法的相同
2.返回类型必须与被重写方法的返回类型相同
3.父类的成员方法只能被它的子类重写
4.声明为final的方法只能被它的子类重写
5.声明为static的方法不能被重写,能被载次声明
6.构造方法不能被重写
7.如果不能继承一个方法,则不能重写这个方法 - 重载
重载在一个类里,方法名相同,参数不同,返回类型可相同也可不同。 - 重载规则
1.被重载的方法必须改变参数列表(参数个数或者类型不一样)
2.被重载的方法可以改变返回类型
3.被重载的方法可以改变访问修饰符
4.被重载的方法可以声明新的或更广的检查异常
5.方法能在同一个类或子类中被重载 - 重写与重载间的区别
区别点 | 重写 | 重载 |
---|---|---|
参数列表 | 一定不能修改 | 必须修改 |
返回类型 | 一定不能修改 | 可以修改 |
异常 | 可减少或删除,不能抛出新的或更广的异常 | 可以修改 |
访问 | 不能更严格的限制,可以降低限制 | 可以修改 |
1.4抽象类
用abstract来声明
- 抽象类不能被实例化,只有抽象类的非抽象子类可以创建对象
- 抽象类中不一定包含抽象方法,含有抽象方法的类一定是抽象类
- 抽象类中的抽象方法只是声明,不含方法体
- 构造方法、类方法不能声明为抽象方法
- 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类
1.5 接口
用interface来声明
- 接口特性
1.接口中的每个方法是隐式抽象的,接口中的方法会被隐式指定为public abstract,并且只能是public abstract修饰。
2.接口中可以含有变量,但接口中的变量会被隐式指定为public static final变量,并且只能只public。
3.接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。 - 接口与抽象类的区别
1.抽象类中的方法可以有方法体,而接口中不行。
2.抽象类中成员变量可以是各种类型,而接口中成员变量只能是publi static final类型。
3.接口中不能含有静态代码块,抽象类中可以有。
4.一个类只能继承一个抽象类,可以实现多个接口。
1.6 枚举与泛型
- 枚举适用于一个类的对象是有限且固定的。
package enumcase;
public enum SeasonEnum {
SPRING,SUMMER,FALL,WINTER;
}
- 泛型3种使用方式:泛型类、泛型方法、泛型接口
泛型只在编译阶段有效,在编译时检测非法类型
List<User> list = user3Repository.findAll();
Optional<User> findByNickName(String nickName);
- 泛型使用最佳实践
1.在代码中避免泛型类和原始类型的混用。比如List<String>和List不应该共同使用。这样会产生一些编译器警告和潜在的运行时异常。
2.在使用带通配符的泛型类的时候,需要明确通配符所代表的一组类型的概念。由于具体的类型是未知的,很多操作是不允许的。
3.泛型类最好不要同数组一块使用。
4.不要忽视编译器给出的警告信息。
1.7 集合类
image.png- List、Set、Map是集合体系中最主要的三个接口,其中List、Set继承自Collection接口。
- Set不允许元素重复,HashSet、TreeSet是两个主要实现类。
- List有序且允许元素重复,ArrayList、LinkedList、Vector是三个主要实现类。
- Map也属于集合系统,但与Collection不同,Map是key对value的映射,其中key列就是一个集合,key不能重复,value可以重复,HashMap、TreeMap、Hashtable是三个主要实现类。
1.7.1 List
具体实现类常用的有ArrayList和LinkedList
- ArrayList和LinkedList区别
1.ArrayList基于动态数据的数据结构,LinkedList基于链表的数据结构
2.随机访问get和set,ArrayList比LinkedList更快,因为LinkedList需要移动指针
3.新增和删除操作add和remove,LinkedList更好,因为ArrayList需要移动数据
1.7.2 Map
- HashMap和TreeMap区别
1.HashMap通过hashcode对其内容快速查找,TreeMap所有元素都保持某种固定顺序
2.在Map中插入、删除、定位元素,HashMap是最好的选择;如果需要按某种顺序遍历键用TreeMap更好
网友评论