多态
父类引用(实现多态) | 传入父类对象的地址指针 | 执行父类的功能。 | |
父类引用(实现多态) | 传入子类对象的地址 | 执行子类中的部分功能; 可以访问的是父类中已定义的成员:重写的和没重写的都可。 对于重写的成员,访问的是子类的;没重写的当然是… | |
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(); } } |