标题: 黑马程序员----类的奇葩-----多态 [打印本页] 作者: 毕延平 时间: 2015-3-8 22:56 标题: 黑马程序员----类的奇葩-----多态 http://bbs.itheima.com/thread-3077-1-1.html
Android 培训-----我的java笔记,期待与您的交流;
(一)多态
1、多态的概念:
1.首先多态一定要在继承的前提下;
2.通常情况下,我们实例化类对象:
class Fu{
}
class Zi extends Fu{
}
class Demo{
main(){
Zi zi = new Zi();
//多态的使用
Fu fu = new Zi();
}
}
一个父类的引用指向了它的一个子类的对象,这种情况就叫:多态
2、多态访问成员的特点:
1.成员变量:编译看左边(父类,一定要有),运行时看左边(父类,子类覆盖了父类的成员变量时,打印出的就是父类的变量值)
2.成员方法:编译看左边(父类,一定要有),运行时看右边(子类,子类覆盖了父类的成员方法时,调用的是子类的方法);
3.静态方法:编译看左边(父类,一定要有), 运行时看左边(父类的)
简单说:当多态时,要访问的成员父类中必须要有,否则编译错误;
当子类覆盖父类的成员时,只有当访问是被覆盖的方法时,访问的是子类的,其它都是父类的。
class Person
{
String name="徐";
int age;
public void show(){
System.out.println("p...show");
}
}
class Student extends Person
{
String name = "xi";
// public void show(){
// System.out.println("stu...show");
// }
}
class Teacher extends Person
{
}
class Demo
{
public static void main(String[] args)
{
//多态:父类的引用指向了子类的对象
Person p = new Student();
System.out.println(p.name);
p.show();
Student a = (Student)p;
System.out.println(p.name);
Person p2 = new Teacher();
//不可以
// Student stu = new Teacher();//编译错误,不兼容的类型;
}
}
3、多态的好处和弊端:
好处:提高了程序的可维护性和可扩展性;
弊端:1.父类的引用不能访问子类自有的成员;
class Fu
{
void show(){
System.out.println("fu --> show()");
}
}
class Zi extends Fu
{
void show(){
System.out.println("Zi --> show()");
}
void method(){
System.out.println("Zi --> method()");
}
}
class Demo
{
public static void main(String[] args)
{
//使用多态
Fu fu = new Zi();
fu.show();
fu.method();//编译错误。
}
}
4、
当我们使用多态,父类的引用指向了子类的对象,这实际上是将子类的引用向上自动转型为父类的引用类型;
1.向上转型:将子类的对象引用,可以自动转换为父类的引用;
2.向下转型:多态中,可以将父类的引用,强制转换为它所指向的那个子类的类型。
注意:
1).要保证强制转换时,所转换的类型一定要是之前父类所指向那个类型;
2).有没有什么办法,在强制转换之前进行一下判断,如果可以转换,再转,否则就不转换了。
使用关键字:instanceof
双目运算符
使用格式:左操作数 instanceof 右操作数
说明:如果左操作数是右操作数的类型,那么就返回true,否则返回false;
class A
{
void show(){
System.out.println("A-->show()");
}
}
class B extends A
{
void fun(){
System.out.println("B-->fun()");
}
}
class C extends A
{
}
class Demo
{
public static void main(String[] args)
{
A a = new B();//自动的、向上转型
a.show();//访问的是父类的
// a.fun();//编译错误。不能访问子类自有的成员;
//显示的向下转型,强制转换
B b = (B)a;
b.show();//OK
b.fun();//OK
A a1 = new B();
// C c = (C)a1;//运行时异常:java.lang.ClassCastException
if(a1 instanceof C){
System.out.println("a1是C类型");
C c = (C)a1;
}else{
System.out.println("a1不是C类型");
}
if(a1 instanceof B){
System.out.println("a1是B类型");
B b1 = (B)a1;//可以放心的转换了;
}