黑马程序员技术交流社区

标题: 黑马程序员----类的奇葩-----多态 [打印本页]

作者: 毕延平    时间: 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;//可以放心的转换了;
                }
       
        }
}







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2