第五章.面向对象高级特性
主要内容:1.继承与派生 2.this和super 3.final修饰符 4.多态 5.接口、接口回调 6.匿名类、内部类7.异常类
5.1——继承
一、继承的概念:继承是利用已有的基类(父类)派生出新的派生类(子类),对基类进行功能的扩充,派生类可以不用定义而直接使用继承基类中的属性和方法,当然在此基础上派生类通常要添加一些新的属性和方法,以满足新的设计需求。
二、继承的目的:程序代码重用,面向对象程序设计方法的核心思想就是利用已存在的类的属性和方法,通过继承创建出功能更为强大的新类,这样会节省程序开发的时间,加快开发进度,降低代码的出错率。
三、Java的特性:
1.Java的单继承性:Java不支持多重继承,只支持单继承,也就是说Java的类只能有一个父类。Java支持多层继承。
2.软件复用: 软件复用(SoftWare Reuse)是将已有软件的各种有关知识用于建立新的软件,以缩减软件开发和维护的花费。软件复用是提高软件生产力和质量的一种重要技术。
3.增强程序的易维护性:继承通过软件设计的一致性减少了软件模块间的接口和界面的设计工作量,增强了程序的易维护性。
四、子类对象的内存构造
子类继承的私有成员在子类中是不可见的,但会分配内存空间。不能直接访问,但可通过对外接口成员方法来访问。
五、父类与子类的同名成员
父类和子类的方法可以构成方法重载
class A{
int f(int x,int y){
// public int f(int x,int y){
return x+y;
}
}
class B extends A{
double f(int x,double y){
return x+y;
}
}
5.2——关键字this和super
一、this的概念:this表示当前正在创建的对象本身,通常使用this来引用本类中定义的成员变量或成员方法,用以区别同名的形参变量、同名的局部变量等。
super的概念super表示当前类的父类,用以引用父类中和子类同名的成员变量和成员方法、以及构造方法等。
二、注意:
1.Static修饰的方法是静态方法,在静态方法中不能引用this。 :
2.this()和super()都可以调用构造方法,this()调用本类中的其他构造方法,而super()是调用父类中的构造方法。
3.this()和super()调用构造方法时,不能同时出现,因为this()和super()都需要放在构造方法体中的首行。
三、在构造方法和实例方法中使用this
class CRect57{
int width,length;
CRect57(){//无参构造方法
width=length=0;}
CRect57(int width){一个参数的构造方法
this();//调用无参构造方法
this.width=width;}
CRect57(int width,int length){//两参构造方法
this(width);//调用一参构造方法
this.length=length;
}}
四、super调用父类中指定的构造方法
要调用父类的构造方法必须在子类的构造方法中使用关键字super,且super语句必须放置在子类构造方法体中的第一条。
5.3——final关键字
一、final的基本知识:
1.final的本义是“最终”,final可以修饰变量、一般方法和类 。
2.final修饰变量,表示变量一旦获取了初始值就不能被修改;
3.final修饰方法,表示该方法在派生子类中不能被重写,只能引用;
4.final修饰类,表示该类不能派生出子类。
二、final的方法
1.使用final修饰该方法,此方法就不会被重写或覆盖,该方法叫终极方法。如所有Object的派生子类都可以重写toString()方法,但不允许重写getClass()方法。
2.终极方法能够被派生类继承、访问,但不能被重写;
3.Java的方法都是虚方法,在调用方法的时候,都要判断子类是否重写了父类中的同名方法。但是如果一个方法被定义为终极方法,就不需要进行覆盖的判断了,在一定程度上提高了该方法的执行效率。
4.构造方法不能被定义为终极方法。
5.final方法可以实现重载。
5.4——转型与多态
一、转型的特点:
1.上转型的对象可以调用继承的所有成员,也可以调用被隐藏的父类中的成员变量。
2.上转型调用重写方法时,调用的是子类中的重写方法,而不是父类中的同名方法。
3.上转型对象不能调用子类中新增的成员变量和成员方法。
5.5——抽象类和接口
一、抽象类的概念:抽象类通过定义抽象方法既可以不去管方法的实现,又可以实现类的多态。抽象方法只有方法的声明,即方法的方法头,而没有方法的实现,即方法体。
接口的概念:Java通过接口实现多种类别的交叉特性 。新的JDK8中对接口进行了改进,允许接口中定义默认方法,默认方法可以有方法实现。
二、
抽象类
1.抽象类可以包含成员变量、一般方法(有方法体)、抽象方法、构造方法,抽象类拥有构造方法也不能创建实例,只能被其子类调用来初始化继承的父类成员。
2.抽象类对象可以作为上转型对象,实现类的多态机制。
接口
Java接口中的方法都是抽象方法,能将系统的实现细节和接口定义分离,接口是抽象的,不能创建对象,所以接口必须有实现类来实现接口中所有的方法。
接口的特性
1.interface是定义接口的关键字,用来定义一个接口。
2.接口中父接口可以有多个,但都必须是接口类型,不能是类类型。
3.接口中属性默认是public static final修饰的,由于属性是常量,所以在定义时必须赋予一个初值。
4.接口中的方法默认是public abstract,公有且抽象的方法,定义时可以不写。在实现类中实现这些方法时,也必须是公有类型(public),必须写。抽象方法只有方法声明,没有方法体,以分号结束。
5.接口编译后产生它的字节码文件(.class),和普通类一致。
interface interfaceA{
public static final double PI=3.14;//定义常量 public abstract void calArea();//定义抽象方法
}
interface interfaceB{
public abstract void calPerimeter();//抽象方法
}
interface interfaceC extends interfaceA,interfaceB{} //接口的多继承
三、接口回调
接口回调:声明接口的对象变量,然后引用实现该接口的类所创建的对象,那么接口变量就可以调用被类实现的接口中的方法,当接口变量调用接口中的方法时,就是通知相应的实现类对象去调用实现接口中的方法,这一过程就是接口回调。
四、抽象类和接口的相同和不同
相同点有:
1.都包含抽象方法,这些方法在继承抽象类或实现接口的类中都要具体实现,如果有一个不实现,该类就是抽象类,还是不能创建实例对象。
2.抽象类和接口都包含抽象方法,不能用new创建对象实例,两者都可以引用继承抽象类或实现接口的类,调用重写或实现的抽象方法,并通过上转型对象或接口回调方式实现多态机制。
不同点有:
1.声明方式不同,接口使用interface关键字,而抽象类使用abstract class关键字。
2.成员变量不同,接口中只能有静态常量,而抽象类中不受限制。
3.成员方法不同,接口中的方法均是public abstract;而抽象类中抽象方法必须加上修饰符abstract,对于访问权限,要程序员自己加上去。另外,接口中不能定义静态方法,而抽象类可以。
5.6——内部类
内部类的概念:
1.如果一个类A的内部定义了一个类B,那么类A称为外部类或外嵌类,而类B称为内部类或内嵌类 。
2.内嵌类可以定义在类的内部,也可以定义在类成员方法的内部,此时称为局部内部类。
内部类的特性:
1.内部类可以访问所在外部类的所有成员,包括私有成员。
2.外部类必须通过内部类对象可以访问内部中的私有成员。
3.局部内部类也可以访问外部类的所有成员,包括私有成员。
5.7——匿名对象和类
一、概念:匿名对象是指没有栈引用的对象,即创建一个对象,并没有给出名字的对象,匿名对象不分配栈空间,只有堆空间,通过new关键字创建一个对象,但是没有分配栈对象变量来引用该对象的内存空间,所以对象只能使用一次。
二、类的匿名类的特性
1.匿名类一定是一个内部类,匿名类可以访问外嵌类中的成员变量和方法。
2.匿名类创建的匿名对象一般作为一个参数进行传递。
3.匿名类中不能定义静态成员变量和方法。
5.8——异常类
一、概念:异常是指程序运行时可能出现的错误,如试图打开一个不存在的文件,链接一个网页时出现堵塞或中断等。异常出现会破坏程序的正常运行了,通过异常处理改变程序执行的流程,让程序对错误作出处理,使程序回到正常运行轨道上来。
二、异常处理机制
异常处理格式:
try{
可能出现异常的程序代码
}catch(异常类 异常类对象){//catch可以出现多次
出现异常时的处理代码
}
[finally{
回收资源代码块
}]
三、常见的异常类
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
方法未找到异常:NoSuchMethodException
四、异常处理流程
5.9——泛型类
一、泛型类的知识
1.增加泛型(generic)在很大程序上是为了让集合能存放多种数据类型,并在操作过程中记住这些数据类型。
2.用户可以按自己的需求制定集合要操作的数据类型,可以让程序员定义安全的类型,引入泛型使得编程变得更为简单。
3.集合对类型没有限制,这可能引起ClassCastException异常。