对象的多态性:
子类对象与父类对象之间的转换
1、
子类对象向父类对象转换(向上转型)
自动转型(父类对象
=
子类对象)
2、
父类对象向子类对象转换(向下转型)
强制转型(子类对象
=
(子类)父类对象)
多态性:
1、 方法的多态性(重载):同一个方法名称根据传入参数的不同,完成的功能不同
2、 对象的多态性
面向对象程序开发的一个思路:[建议]永远不去继承一个普通类
对象多态性是在继承应用上的一种扩展,所以程序要先有继承关系才能够去使用多态性
class A
{
public void fun1()
{
System.out.println("1、 A ----public void fun1()");
}
public void fun2()
{
this.fun1();
}
}
class B extends A
{
public void fun1()
{
System.out.println("2
、
B ----public void fun2()");
}
public void fun3()
{
System.out.println("3、 B ----public void fun3()");
}
}
public class javaoo04
{
public static void main(String []args)
{
B b = new B();
b.fun2();
b.fun3();
}
}
2、 B ----public void fun2()
3、 B ----public void fun3()
如果一个方法被子类覆写了,则子类与父类之间发生转换时,自动去调用已经补覆写过的方法(子类中的方法)。
class A
{
public void fun1()
{
System.out.println("1、 A ----public void fun1()");
}
public void fun2()
{
this.fun1();
}
}
class B extends A
{
//覆写了fun1()方法
public void fun1()
{
System.out.println("2、 B ----public void fun1()");
}
//增加了一个fun3()方法
public void fun3()
{
System.out.println("3、 B ----public void fun3()");
}
}
public class javaoo04
{
public static void main(String []args)
{
A a = null;
a = new B();
//A a = new B(); //子类对象为父类实例化
B b = (B)a;
a.fun2(); //fun1()中的方法被覆写了。
//a.fun3(); //javaoo04.java:74: 找不到符号
b.fun2();
}
}
2
、
B ----public void fun1()
2
、
B ----public void fun1()
class A
{
public void fun1()
{
System.out.println("1、A----public void fun1()");
}
public void fun2()
{
this.fun1();
}
}
class B extends A
{
public void fun1()
{
System.out.println("2、B----public void fun3()");
}
}
public class javaoo04
{
public static void main(String []args)
{
A a = new A();
a.fun2();
B b = (B)a; //Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B at javaoo04.main(javaoo04.java:107)
}
}
class A
{
public void fun1()
{
System.out.println("1、A ---public void fun1()");
}
public void fun2()
{
this.fun1();
}
}
class B extends A
{
public void fun1()
{
System.out.println("2、B ---public void fun1()");
}
public void fun3()
{
System.out.println("3、B ---public void fun3()");
}
}
public class javaoo04
{
public static void main(String []args)
{
//一个print方法,此方法可以接收A和B类的对象,并调用方法打印
//如果是A类对象,则调用fun2()方法
//如果是B类对象,则调用fun2()和fun3()两个方法
print(new B());
//如果A类还有20个子类,会怎么样? 则此方法 还要写20遍
}
public static void print(A a)
{
a.fun2();
}
public static void print(B b)
{
b.fun2();
b.fun3();
}
}
//2、B ---public void fun1()
//3、B ---public void fun3()
class A
{
public void fun1()
{
System.out.println("1、A ---public void fun1()");
}
public void fun2()
{
this.fun1();
}
}
class B extends A
{
public void fun1()
{
System.out.println("2、B ---public void fun1()");
}
public void fun3()
{
System.out.println("3、B ---public void fun3()");
}
}
public class javaoo04
{
public static void main(String []args)
{
//一个print方法,此方法可以接收A和B类的对象,并调用方法打印
//如果是A类对象,则调用fun2()方法
//如果是B类对象,则调用fun2()和fun3()两个方法
print(new B());
//如果A类还有20个子类,会怎么样? 则此方法 还要写20遍
}
public static void print(A a)
{
a.fun2();
B b = (B)a;
b.fun3();
}
public static void print(B b)
{
b.fun2();
b.fun3();
}
}
//2、B ---public void fun1()
//3、B ---public void fun3()
class A
{
public void fun1()
{
System.out.println("1、A ---public void fun1()");
}
public void fun2()
{
this.fun1();
}
}
class B extends A
{
public void fun1()
{
System.out.println("2、B ---public void fun1()");
}
public void fun3()
{
System.out.println("3、B ---public void fun3()");
}
}
class C extends A
{
public void fun1()
{
System.out.println("4、B---public void fun1()");
}
public void fun4()
{
System.out.println("5、B---public void fun4()");
}
}
public class javaoo04
{
public static void main(String []args)
{
//一个print方法,此方法可以接收A和B类的对象,并调用方法打印
//如果是A类对象,则调用fun2()方法
//如果是B类对象,则调用fun2()和fun3()两个方法
print(new A());
//如果A类还有20个子类,会怎么样? 则此方法 还要写20遍
}
public static void print(A a)
{
a.fun2();
//缺少一个对象是否是某一个类的实例的判断
B b = (B)a;
b.fun3();
}
public static void print(B b)
{
b.fun2();
b.fun3();
}
}
//javaoo04.java:278: 需要为 class、interface 或 enum
两个常见的错误:
ClassCastException(
两个对象之间没有任何关系而进行转换)
、
NullPointerException
Instanceof 关键字
作用: 1、对象instanceof 类
Eg:如果对象a 是类B的例则返回true .反之则返回flase
class A
{
}
class B extends A
{
}
public class javaoo04
{
public static void main(String []args)
{
A a = new A();
System.out.println(a instanceof A); //trie
System.out.println(a instanceof B); //false
}
}
对象多态性最核心的部分就是方法的覆写与继承的关系,只要有继承关系,只要有覆写过的方法,则子类向父类进行转型时,肯定调用被子类覆写过的方法(核心)。
class A
{
public void fun1()
{
System.out.println("1、A --- public void fun1()");
}
public void fun2()
{
this.fun1();
}
}
class B extends A
{
public void fun1()
{
System.out.println("2、B --- public void fun1()");
}
public void fun3()
{
System.out.println("3、B --- public void fun3()");
}
}
class C extends A
{
public void fun1()
{
System.out.println("4、C --- pubic void fun1()");
}
public void fun4()
{
System.out.println("5、C --- public void fun4()");
}
}
public class javaoo04
{
public static void main(String []args)
{
print(new B());
}
public static void print(A a)
{
a.fun2();
if (a instanceof B)
{
B b = (B)a;
b.fun3();
}
if (a instanceof C)
{
C c = (C)a;
c.fun4();
}
}
}
接口与抽象类的实际应用(基础类、封装、继承、覆写、多态性)