java类的特性
类有三大特性:封装、继承、多态
封装
封装就是将类的某些属性隐藏起来,限制在类的外部对类内部成员进行访问,通过接口对外开放,但是在外部不能直接进行查找属性。只通过公共接口来访问类的成员数据。为什么要设置隐藏:
- 隐藏数据是为了限制外界对属性的直接修改
- 通过接口操作可以在接口上附加额外的逻辑处理来控制隐藏数据
封装的实现
- 需要修改属性的访问控制符(修改为private);
- 创建getter/setter方法(用于属性的读写);
- 在getter/setter方法中加入属性控制语句(用于判断属性值的合法性)
继承
继承是复用程序代码的有力手段,当多个类之间存在相同的属性和方法时,可从这些类抽象出父类SuperClass。
[<修饰符>] class <子类名> extends <超类名>{
子类体
}
继承原则:
- 父类中private修饰的私有变量和方法,子类不能继承;
- 父类的构造方法子类不能继承
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展
- 子类可以用自己的方式实现父类的方法
- 子类的成员变量和超类的成员变量同名时,超类的成员变量被隐藏(不能继承)
- 不能被继承的类称为最终类,不能被继承。 如:final class Last;
- 用final说明的成员方法为最终方法,不能被继承。 如:public final void printsuper( )
多态
多态是同一个行为具有多个不同表现形式或形态的能力。多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变。多态有两种表现形式:
-
同一类中的方法多态,称为方法重载overloading(静态多态性):同一类中允许多个同名方法,区分要点:参数的个数不同,或者是参数类型不同,或者是参数的顺序不同
-
子类对父类方法的重新定义,称为方法覆盖overriding (动态多态性) :方法名、返回值和参数形态完全一样。
-
父类的引用变量指向子类的对象(向上转型)
1、子类中重写的方法和父类中被重写的方法要具有相同的名字,相同的参数表和相同的返回类型,只是函数体不同
2、子类方法不能缩小父类方法的访问权限
3、子类方法不能抛出比父类方法更多的异常
4、方法覆盖只存在于子类和父类(包括直接父类和间接父类)之间。在同一个类中方法只能被重载,不能被覆盖。
5、父类的静态方法不能被子类覆盖为非静态的方法,反之亦然;
6、子类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法。
7、父类的私有方法不能被覆盖
8、父类的抽象方法可以被子类覆盖:子类实现父类的方法或重新声明父类的抽象方法。
抽象类
abstract class <类名>{
成员变量;
方法(){ 方法体 }; //定义一般方法
abstract 方法( ); //定义抽象方法
}
abstract关键字:可修饰类和方法,被修饰的类称为抽象类,被修饰的方法称为抽象方法
- 抽象类是专门设计来让子类继承的类。
- 抽象类提供一个类型的部分实现,可以有实例变量,构造方法,抽象方法和具体方法。一个抽象类不会有实例。
- 抽象方法是必须被子类覆盖的方法。如果一个类不具有抽象属性,不能在该类中定义抽象方法。
- 对于成员方法,不能同时用static和abstract说明。对于类,不能同时用final和abstract说明。
接口
[public] interface 接口名 [extends 父接口名列表 ] {
常量的数据类型 常量标识符 = 常量值 ; //常量声明
返回类型 方法名(参数列表) [throws 异常列表]; //抽象方法声明
}
- 在Java中,一个类只能有一个超类。但Java提供了接口用于实现多重继承,一个类可以有一个超类和多个接口
- 接口只包括常量定义和抽象方法。
- 接口具有继承性,一个接口还可以继承多个父接口,父接口间用逗号分隔。
- 系统默认,接口中所有属性的修饰都是 public static final,也就是静态常量。
- 系统默认,接口中所有方法的修饰都是 public abstract。
- 当一个类实现了一个接口,它**必须实现接口中所有的方法,**这些方法都要被说明为public,否则会产生访问权限错误。
接口和抽象类区别
- 接口可以多重继承,抽象类不可以
- 抽象类内部可以有实现的方法,接口则没有实现的方法
- 接口与实现它的类不构成类的继承体系,即接口不是类体系的一部分。因此,不相关的类也可以实现相同的接口。而抽象类是属于一个类的继承体系,并且一般位于类体系的顶层。
- 接口的优势:通过实现多个接口实现多重继承,能够抽象出不相关类之间的相似性。
创建类体系的基类时,若不定义任何变量并无需给出任何方法的完整定义,则定义为接口;必须使用方法定义或变量时,考虑用抽象类。