JAVA是一门面向对象的编程语言,谈起面向对象,就不得不说起面向对象的基本特征。
面向对象编程与面向过程编程,最大的区别在于面向对象把一切都进行了抽象,把所有的事物都封装成了对象。将事物的特征抽象成对象的成员变量,将事物的行为抽象为对象的方法。一切事物都变成了类,变成了对象。封装隐藏了类的内部实现,可以在不影响使用的情况下改变类的内部结构,同是也保护了数据。即对外之暴露接口,不暴露具体的实现细节。
通过JAVA的继承机制,关联起了两个不同的类,被继承的类为父类,继承后的类为子类。因为继承,使得子类拥有了父类的各种属性和方法(可以继承自父类所有的非私有的成员变量和方法)。继承提高了程序的复用性,避免重复代码的出现。
当然子类对于继承父类的方法,可以改变其具体的实现,把子类的这种行为叫做覆写,或者重写。重写父类的方法,必须要满足以下的条件。
(a).重写方法的参数列表必须与父类的相同。
(b).重写方法的返回类型必须与父类的相同。
(c).重写的方法不能比父类的方法有更严格的访问级别。例如,父类中的一个方法被protected所修饰,则在子类中重写的该方法不能用private来修饰,但是可以用public来修饰。(否则编译报错)
(d).重写方法抛出的异常不能比父类方法抛出的异常的类型更大。可以抛出更少的异常,或者不抛出异常。例如,父类的一个方法抛出了IoException,则子类重写的该方法所抛出的异常不能是IoException的父类型,如Exception.可以是子类型,如FileNotFoundException也或者不抛出异常。
(e).如果父类的方法为final的,则不能重写该方法。
(f).不能将父类非static方法重写为static方法。
父类:
public class Parent {
private Stringname = "parent";
protected Stringsex = "man";
protected String getSex(){
return sex;
}
public final String getName() {
return this.name;
}
public String getName(Stringname) {
return name;
}
public void print() throws IOException{
System.out.println("this is parent.");
}
private void run() {
System.out.println("this is the run function.");
}
}
子类:
public classChild extendsParent {
private Stringname="child";
private Stringsex="woman";
//重写父类的final getName()方法,编译错误。
// public String getName() {
// returnthis.name;
// }
//重写父类带参的getName方法。
public String getName(Stringname) {
return this.name;
}
//重写父类方法,访问权限变更严格,编译错误。
private StringgetSex(){
return this.sex;
}
//重写父类方法,抛出异常更广,编译错误。
// public void print() throws Exception{
//
// }
//重写父类方法,重写后方法为static类型,编译错误。
public static void print(){
}
//重写父类private方法,编译不会报错。
protected void run() {
System.out.println("this is child function");
}
public static void main(String[] args) {
Parentchild= newChild();
System.out.println(child.getName());//--parent
System.out.println(child.getName("child"));//--child
//child.run() 编译错误,没有该方法。父类private方法不会被继承。
}
}
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
实现多态的三个必要条件:
(a).继承 (b).重写(c).含有父类对子类的引用
接口类,父类
public interfaceAnimal {
void say();
}
子类1:
public classDog implementsAnimal {
@Override
public void say() {
System.out.println("wang wang wang....");
}
}
子类2:
public classCat implementsAnimal {
@Override
public void say() {
System.out.println("miao miao miao...");
}
}
测试类:
public static void main(String[] args) {
Animalanimal= newDog();
animal.say();//wang wang wang....
animal = new Cat();
animal.say();//miao miao miao...
}
所以多态机制遵循的原则概括为:当超类对象引用变量引用子类对象时,被引用对象调用的方法,必须是在超类中定义过的,也就是说被子类覆盖的方法。