多态

父类引用(实现多态)

传入父类对象的地址指针

执行父类的功能。

父类引用(实现多态)

传入子类对象的地址

执行子类中的部分功能;

可以访问的是父类中已定义的成员:重写的和没重写的都可。

对于重写的成员,访问的是子类的;没重写的当然是…

Interface引用实现多态

传入使用了该接口的类对象的地址

执行子类中且在接口中定义了的

的部分功能;

例1:

/*______________________________________________________________________________*/

package com.fs.test;

   

public abstract class Animal {

public int age;

public void go() {

System.out.println("go....");

}

public abstract void sleep();

public void eat() {

System.out.println("Animal eat()");

}

}

   

/*______________________________________________________________________________*/

package com.fs.test;

/**

* 1.父类可以引用子类对象

* 2.能访问到的成员是父类中出现过的成员,包括抽象方法

* 3.访问重写的函数时,被访问到的是子类中的.如eat()

* */

public class People extends Animal {

public String name;

@Override

public void sleep() {

System.out.println("sleep()");

}

@Override

public void eat() {

System.out.println("People eat()...");

}

public void 说话() {

System.out.println("说话()");

}

   

public static void main(String[] args) {

Animal p2 = new People();//"能否访问某成员看左边;重写时访问哪个类的方法看右边"

//                p2.name = "fds";//错。

//                p2.说话();                //错。能否访问看左边;通过P2不能访问到子类中的新增类容。

p2.sleep();//sleep()

p2.go();//go....

p2.age = 34;

p2.eat();//People eat()...访问谁看右边

   

People p1 = new People();

p1.name = "fds";//能否访问看左边

p1.说话();                //能否访问看左边

p1.sleep();

p1.go();

p1.age = 34;

}

}

/*______________________________________________________________________________*/

   

例2:类的继承;接口也能实现多态;

/*______________________________________________________________________________*/

package com.test;

   

public interface Ainf {

public void ainfm();

}

package com.test;

   

public interface Binf {

public void binfm();

}

package com.test;

   

public class A {

public int x;

public void m1() {

System.out.println("A m1()");

}

public void m2() {

System.out.println("A m2()");

}

}

package com.test;

   

public class B extends A{

public int y;

public void m3() {

System.out.println("B m3()");

}

public void m1() {

System.out.println("B m1()");

}

public void m2() {

System.out.println("B m2()");

}

public static void main(String[] args) {

A a = new B();

a.x = 34;

a.m1();//B m1()

a.m2();// B m2()//访问谁看的是右边

//         a.y = 34;//错的。不能访问父类中没有的成员

//         a.m3();//错的

}

}

package com.test;

   

   

public class C extends B implements Ainf, Binf {

public void m1() {

System.out.println("C m1()");

}

public void m2() {

System.out.println("C m2()");

}

public void binfm() {

System.out.println("cbinfm()");

}

public void ainfm() {

System.out.println("cainfm()");

}

public static void main(String[] args) {

C c = new C();

Ainf pa = c;

pa.ainfm();//cainfm()//接口Ainf;pa只能使用接口 Ainf中有的这一个函数。

Binf pb = c;

pb.binfm();//cbinfm()//接口Binf

//接口类的引用也可以接受使用了该接口的类的地址;这一点类似于抽象类的抽象方法的继承,规则是类似的。

   

}

}

package com.test;

   

public class Test {

public void t(A a) {//这算是一种回调;传哪个类对象的地址,就执行哪个类的函数

a.m1();                        //A,B,C类中有各自特别定义的m1();m2()

a.m2();

}

public static void main(String[] args) {

Test test = new Test();

A a = new A();

test.t(a);//A m1();A m2()

B b = new B();

test.t(b);//B m1();B m2()

C c = new C();

test.t(c);//C m1();C m2()

Object obj = c;

//Object 可以接受任何类的地址;但是只能执行Object原定义的成员。而这个成员可能被重写。

obj.toString();

}

}

   

posted @ 2013-05-07 19:05  oucaijun  阅读(232)  评论(0编辑  收藏  举报
下载TeamViewer完整版 下载TeamViewer