面向对象四大特征
封装
概念
封装细节并且公开接口,将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
好处
只能通过规定的方法访问数据,隐藏类的实例细节,方便修改和实现
四个修饰符
为了实现封装, 设定了四个修饰符,可以修饰类、属性和行为;
这四个访问修饰符为:public、protected、默认不写、private
;
//public:全局都能访问
//protected:仅能在同一个类、包和子类中访问;
//什么都不写:仅能同一个类和包;
//private:仅能再同一个类
特点:
- 一个Java源文件中有且只有一个public类,顶层类只能用public和默认修饰符修饰
- 关于protected的访问权限的进一步解释:子类可以通过继承不同包的父类来获取父类内被protected修饰的成员变量和行为,但不能通过创建实例来访问父类的被
- protected属于子类限制修饰符,而default属于包限制修饰符。
其他修饰
final最终:
修饰属性:该变量不能被修改,即为该变量为常量;
修饰方法:该方法不能被重写;
修饰类:该类不能被继承
abstract:
修饰方法:抽象该方法,该方法只能有方法名,但不能有方法体;abstract read();//没有中括号
修饰类:该类为抽象类;具体见下面介绍
抽象
定义
用abstract修饰的类叫抽象类,在某些情况下,父类只知道子类应该包含哪些方法,而却不知道子类如何实现这些方法,故从多个具有该相同特征的类中抽出一个抽象类,以该类为子类的模版,从而避免子类设计的随意性;
特点
抽象类不能创建对象,只能被子类继承;子类继承一个抽象的父类,要么实现父类中的抽象方法,要么自身也定义为一个抽象类。
抽象类中可以同时拥有普通方法和变量;
含有抽象方法的类称为抽象类,但抽象类不一定只有抽象方法;
继承
定义
继承是类与类的一种关系,为了降低代码的重复率,某些具有相同特点或关键点的类可以由继承一个类来实现这些属性或行为;被继承者称为父类(超类,基类),继承者称为子类(派生类);
特点
继承与拓展
子类继承父类的一切属性和行为,但不能继承父类的构造方法,也不能访问父类的私有属性和行为;即为子类的继承;
子类可以在父类功能不能满足需求的情况下,对父类的行为进行重写,或者定义新的不同于父类的行为和属性,即为子类的拓展;
若子类需要调用父类的私有属性或者行为,则需要通过关键字super来进行调用;
在内存的分配空间中,在初始化子类对象之前,都会先初始化父类,都会先执行父类的构造方法再执行子类的构造方法;
Java中的继承为单继承,任何子类最终都只能继承一个父类;
多态
定义
顾名思义,多态,即为多种状态,允许不同的类的对象对同一事物作出不同响应,接口的多种不同的实现方式即为多态
接口
接口是一种特殊的抽象类,它是对功能的抽象;类是一种具体的实现,而接口定义了某些类所需要遵守的规范;
接口不关心类的内部数据,也不关心类的实现细节,只规定这些类必须拥有某种方法;
和类定义的不同,接口不再需要用class定义,而是用interface关键字定义;
使用接口的时候,不再是用extends,而是用implements使用;
类不能继承接口,但是,接口之间是可以用关键字extends继承。
特点
接口中的所有属性必须是静态常量,即使在定义的时候不加修饰符,系统也会自动添加;
接口中的所有的方法都为抽象方法,即使定义的时候不加修饰符,系统也会自动添加;
因此,接口不能继承父类,因为所有类的父类都为Object,Object中有普通变量和方法,不符合接口定义;
内部类
定义在一个类中的类,内部类的访问权限可以为四种中的任意一种,并且可以访问该外部类中任意私有属性和方法;
匿名内部类
由一个没有名字的内部类产生的对象;通过内部类生成的对象只有一个时,考虑使用匿名内部类对象。
匿名内部类:
1.创建一个父类的引用
2.创建了一个没有名字的类
3.这个没有名字的类继承了接口
4.实现了接口中的抽象方法
5.创建了这个没有名字的类(匿名内部类)的对象
6.父类型的引用指向了子类的空间
泛型
例题引入:
使用多态完成折半查询:折半查询任意引用数据类型数组。
public stiatic public static<T> int binaryQuery(T[] dates,int start,int end,T date,Comparator<T> c) {
int middle = (start-end)/2;
if(start>end) {
return -1;
}
int n = c.compare(dates[middle],date);
if(n<0) {
return binaryQuery(dates, middle+1, end, date,c);
}else if(n==0) {
return middle;
}else {
return binaryQuery(dates, start, middle-1, date, c);
}
}
面向对象高级
异常
在计算机执行程序的过程中,因为人为的因素而造成程序出错,会导致程序被强行停止,该错误也称为异常,而为了跳过这些因素,继续程序的运行,对于异常的处理,Java中设计了两种机制;
异常处理
语法定义
try{
//有可能发生异常的代码块;
}catch(Exception e){
//若上述代码块发生异常,则捕捉异常e,并可在此做出对应操作,并不会导致程序的停止运行;
}finally{
//无论异常是否发生,该代码块都会执行,常用于内存的释放;
}
抛出异常
throws和throw
- throw:指的是在方法中人为抛出一个异常对象(这个异常对象可能是自己实例化或者抛出已存在的);
- throws:在方法的声明上使用,表示此方法在调用时必须处理异常。