Java面向对象特性略解
一、封装(Encapsulation)
在面向对象程式设计方法中,封装是指利用抽象数据类型将数据和基于数据的操作合并在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系的一种设计方法。
1.优点
- 减少耦合(功能变化时只需修改自身代码,而不用修改那些调用代码的程序片段)。
- 防止该类的代码和数据被外部类定义的代码随机访问。
- 调用者不需要关心被调用者具体的实现细节,只需了解其功能和传入参数即可。
- 使代码更容易理解与维护,更利于团队协作开发。
2.实现
i.对私有属性的封装
- 设定属性的访问权限
class Example{
private int A;
}
- 设计getter和setter方法
public int getA(){
return this.A;
}
public void setA(int A){
this.A=A;
}
- 在方法中加入限制条件
public void setA(int A){
if(A>0){
this.A=A;
}
else{
this.A=-A;
}
}
一般地,用private去修饰一个变量,用setter方法去设置该变量的值,用getter方法去调用该变量的值,setter和getter都应为public方法。
ii.合理使用访问控制符
- private 仅在当前类中可调用
- default 在当前包内所有类可调用
- protected 当前包内所有类均可调用,当前包外有继承关系的子类可在子类内调用
- public 均可调用
3.解释
- this关键字是什么意思?
有时一个方法需要引用调用它的对象。为此,java定义了this这个关键字。简单地说,this是在对象内部指代自身的引用。
可以直接引用对象,可以解决实例变量和局部变量之间发生的任何同名的冲突。
- 关于构造方法
构造方法负责对象成员的初始化工作,为实例变量赋予合适的初始值。使用new关键字实例化对象的过程实际上就是调用构造方法的过程。
构造方法的语法规则:方法名与类名相同且没有返回类型,可以有参数,可重载。
二、继承(Inheritance)
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
1.类型
- 单继承
- 多重继承
- 不同类继承同一个类
- java不支持多继承
2.实现
在 Java 中通过 extends 关键字可以声明一个类是从另外一个类继承而来的,一般形式如下:
class 父类 {
//代码
}
class 子类 extends 父类(只能有一个) {
//代码
}
也可以通过implements关键字声明一个类实现了某个接口,一般形式如下:
interface 接口{
//
}
class 类名 implements 接口(如果有多个,用逗号分隔) {
//
}
3.解释
- 子类拥有父类非 private 的属性、方法。
- 子类可以重写父类的方法。
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- super关键字
用来引用当前对象的父类,实现对父类成员的访问。
- final关键字
声明类将把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写;声明变量,则该变量为常量。
三、多态(Polymorphism)
1.重载
Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。
调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法。
重载的规则:
- 必须具有不同的参数列表;
- 可以具有相同的返回类型;
- 可以有不同的访问控制符;
- 可以抛出不同的异常;
一般形式如下:
class 类名{
返回类型 方法名(数据类型1 参数名){}
返回类型 方法名(数据类型2 参数名){}
返回类型 方法名(数据类型3 参数名a,数据类型4 参数名b){}
}
示例:
class Example{
public void F(int a){
//
}
public void F(float a){
//
}
public void F(int a,int b){
//
}
}
构造方法没有返回类型,可以重载
2.重写
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。
但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
重写的规则:
- 重写方法只能存在于继承关系中,且只能重写父类非私有的方法。
- 参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
- 返回的类型必须一直与被重写的方法的返回类型相同(或是其返回类型的子类,JDK1.5后),否则不能称其为重写而是重载。
- 访问控制符的权限一定不低于被重写方法的访问权限。
- 重写方法一定不能抛出新的检查异常或者比被重写方法声明更加宽泛的检查异常(只能抛出被重写方法抛出的检查异常的子类异常),可以抛出非检查异常。
一般形式如下:
class 父类{
protected int F(int a){
//
return a;
}
}
class 子类 extends 父类{
public int F(int a){
//
return a;
}
}
3.其他
i.上转型对象
用子类创建一个对象,并把这个对象的引用放到父类的对象中时,称此时的父类对象是其子类对象的上转型对象。
注意事项:
- 如果子类重写了父类的静态方法,那么子类对象的上转型对象不能调用子类重写的静态方法,只能调用父类的静态方法。
- 上转型对象可以强制转换为子类对象,使其重新具有子类所有属性和功能。
- 上转型对象操作子类继承或重写的方法,作用等价于子类对象调用这些方法。
ii.abstract类和abstract方法
用关键字abstract修饰的类和方法称为抽象类和抽象方法
注意事项:
- abstract类中可以有abstract方法和非abstract方法,非abstract类中不可以有abstract方法。
- abstract类不能用new运算符创建对象,不能被关键字final修饰。
- 一个abstract类是abstract类的子类,可以继承或重写其父类的abstract方法。一个非abstract类是abstract类的子类,必须重写其父类的abstract方法。
- abstract类的对象可以作为其子类的上转型对象调用子类重写的方法。
iii.接口回调
把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,则该接口变量可以调用被该类实现的接口方法。