一、多态性
- 多态性的体现:
- 方法的重载和重写
- 对象的多态性
- 对象的多态性:
- 向上转型:程序会自动完成
父类 父类对象 = 子类实例 - 向下转型:强制类型转换
子类 子类对象 = (子类)父类实例
代码一 : 向上转型
class A2{
public void tell1() {
System.out.println("A2---tell1");
}
public void tell2() {
System.out.println("A2---tell2");
}
}
class B2 extends A2{
public void tell1() {
System.out.println("B2---tell1");
}
public void tell3() {
System.out.println("B2--tell3");
}
}
public class Demo22 {
public static void main(String[] args) {
//向上转型
B2 b = new B2();
A2 a=b;
a.tell1();//tell1是重写的,调用的是重写之后的方法
a.tell2();
}
}
结果:
B2---tell1
A2---tell2
代码二 : 向下转型
class A2{
public void tell1() {
System.out.println("A2---tell1");
}
public void tell2() {
System.out.println("A2---tell2");
}
}
class B2 extends A2{
public void tell1() {
System.out.println("B2---tell1");
}
public void tell3() {
System.out.println("B2--tell3");
}
}
public class Demo22 {
public static void main(String[] args) {
//向下转型
A2 a2 = new B2();
B2 b2 = (B2)a2;
b2.tell1();
b2.tell2();
b2.tell3();
}
}
结果:
B2---tell1
A2---tell2
B2--tell3
代码三 : 类型转换失败
class A2{
public void tell1() {
System.out.println("A2---tell1");
}
public void tell2() {
System.out.println("A2---tell2");
}
}
class B2 extends A2{
public void tell1() {
System.out.println("B2---tell1");
}
public void tell3() {
System.out.println("B2--tell3");
}
}
public class Demo22 {
public static void main(String[] args) {
//向下转型
A2 a2 = new A2(); //将B2改成A2,报错 - 类型转换失败
B2 b2 = (B2)a2;
b2.tell1();
b2.tell2();
b2.tell3();
}
}
结果:
Exception in thread "main" java.lang.ClassCastException: cn.sec.ch02.A2 cannot be cast to cn.sec.ch02.B2
at cn.sec.ch02.Demo22.main(Demo22.java:35)
二、多态性应用
代码
class A3{
public void tell1(){
System.out.println("A3---tell1");
}
}
class B3 extends A3{
public void tell2(){
System.out.println("B3--tell2");
}
}
class C3 extends A3{
public void tell3() {
System.out.println("C3--tell3");
}
}
class D3 extends A3{
}
public class Demo23 {
public static void main(String[] args) {
// TODO Auto-generated method stub
say(new B3());
say(new C3());
say(new D3());
}
/**
* 此方法无论传B3还是C3都要调用到tell1的执行
*/
public static void say(A3 a) {
a.tell1();
}
}
结果:
A3---tell1
A3---tell1
A3---tell1
三、instanceof关键字
在Java中可以使用
instanceof
关键字判断一个对象到底是不是一个类的实例。
代码
class A4{
public void tell1() {
System.out.println("A4---tell1");
}
public void tell2() {
System.out.println("A4---tell2");
}
}
class B4 extends A4{
public void tell1() {
System.out.println("B4---tell1");
}
public void tell3() {
System.out.println("B4--tell3");
}
}
public class Demo24 {
public static void main(String[] args) {
A4 a4 = new A4();
System.out.println(a4 instanceof A4);
System.out.println(a4 instanceof B4);
A4 a = new B4(); //向上转型
System.out.println(a instanceof A4);
System.out.println(a instanceof B4);
}
}
结果:
true
false
true
true