读书人

7.JAVA中的承继和多态

发布时间: 2012-12-22 12:05:06 作者: rapoo

7.JAVA中的继承和多态
类的继承
1.public类可以被继承。
2.abstract类可以被继承。
3.final类不能被继承。


方法和属性的继承
1.如果子类构造函数没有显式调用超类构造函数,将会自动调用超类的无参构造函 数,若超类没有无参构造函数,子类中又没有显式调用,则编译器报错。
2.private修饰符的数据或方法不能被继承。
3.protected修饰符的数据或方法,可以被同个包中的任何一个类访问(包括子类),也可以被不同包中的的子类访问。
4.static修饰符的数据或方法可以继承,虽static方法可重写,但不支持多态。
5.final修饰符的数据或方法可以继承,但final属性不可二次赋值,final方法不可重写。


public class AAA {static int  a=1;private int b=2;final int c=3;protected int d=4;public int e=5;static final int f=6;static void xxx(){System.out.println("this is aaa static");}public void yyy(){System.out.println("this is aaa");}final void zzz(){System.out.println("this is aaa final");}}public class BBB extends AAA {int a=11;int b=12;int c=13;int d=14;int e=15;int f=16;static void xxx(){System.out.println("this is bbb static");}public void yyy(){System.out.println("this is bbb ");}//final void zzz(){  //final方法不能重写//System.out.println("this is aaa final");//}}public class Test{public static void main(String[] args){BBB bbb=new BBB();System.out.println(bbb.a);System.out.println(bbb.b);System.out.println(bbb.c);System.out.println(bbb.d);System.out.println(bbb.e);System.out.println(bbb.f);bbb.xxx();bbb.yyy();bbb.zzz();System.out.println("----------------------");AAA aaa=new BBB();System.out.println(aaa.a);//System.out.println(aaa.b);// private 不能继承System.out.println(aaa.c);System.out.println(aaa.d);System.out.println(aaa.e);System.out.println(aaa.f);aaa.xxx();aaa.yyy();aaa.zzz();}}


结果为
11
12
13
14
15
16
this is bbb static
this is bbb
this is aaa final
----------------------
1
3
4
5
6
this is aaa static
this is bbb
this is aaa final



可以用super关键字调用父类的可继承属性和方法。

多态
要理解多态性,首先要知道什么是“向上转型”。
定义一个子类Cat,它继承了Animal类,那么后者就是前者是父类。可以通过

  Cat c = new Cat();

实例化一个Cat的对象,这个不难理解。但当这样定义时:

  Animal a = new Cat();//向上转型

这代表什么意思呢?
很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。
所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的。同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用。对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法。
(但是如果强制把超类转换成子类的话,就可以调用子类中新添加而超类没有的方法了。)



对于多态,可以总结它为:
一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
四、变量不能被重写(覆盖),重写的概念只针对方法。


重写与重载
重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

读书人网 >编程

热点推荐