java多态重难点理解

多态定义:子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。

比如你是一个酒神,对酒情有独钟。某日回家发现桌上有几个杯子里面都装了白酒,从外面看我们是不可能知道这是些什么酒,只有喝了之后才能够猜出来是何种酒。你一喝,这是剑南春、再喝这是五粮液、再喝这是酒鬼酒….在这里我们可以描述成如下:

      酒 a = 剑南春

      酒 b = 五粮液

      酒 c = 酒鬼酒

      …

      这里所表现的的就是多态。剑南春、五粮液、酒鬼酒都是酒的子类,我们只是通过酒这一个父类就能够引用不同的子类,这就是多态——我们只有在运行的时候才会知道引用变量所指向的具体实例对象。

      诚然,要理解多态我们就必须要明白什么是“向上转型”。在继承中我们简单介绍了向上转型,这里就在啰嗦下:在上面的喝酒例子中,酒(Win)是父类,剑南春(JNC)、五粮液(WLY)、酒鬼酒(JGJ)是子类。我们定义如下代码:

      JNC a = new  JNC();

      对于这个代码我们非常容易理解无非就是实例化了一个剑南春的对象嘛!但是这样呢?

      Wine a = new JNC();

      在这里我们这样理解,这里定义了一个Wine 类型的a,它指向JNC对象实例。由于JNC是继承与Wine,所以JNC可以自动向上转型为Wine,所以a是可以指向JNC实例对象的。这样做存在一个非常大的好处,在继承中我们知道子类是父类的扩展,它可以提供比父类更加强大的功能,如果我们定义了一个指向子类的父类引用类型,那么它除了能够引用父类的共性外,还可以使用子类强大的功能。

      但是向上转型存在一些缺憾,那就是它必定会导致一些方法和属性的丢失,而导致我们不能够获取它们。所以父类类型的引用可以调用父类中定义的所有属性和方法,对于只存在与子类中的方法和属性它就望尘莫及了---1。


多态表现形式:方法重载,重写,向上向下转型

实现多态有三个必要条件:继承、重写、向上转型。

         继承多态中必须存在有继承关系的子类和父类。

         重写子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。

         向上转型多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。


class BaseClass1{
	public int book = 6;
	public void base(){
		System.out.println("父类的普通方法");
	}
	public void test(){
		System.err.println("父类的被覆盖的方法");
	}
}
public class SubClass1 extends BaseClass1{
    public String book = "Java EE";
    public void test(){
    	System.out.println("子类的覆盖父类的方法");
    }
    public void sub(){
    	System.out.println("子类的普通方法");
    }
    public static void main(String args[]){
    	BaseClass1 p = new SubClass1();//自动向上转型,多态的表现形式
    	//编译时类型为BaseClass1,运行时类型为SubClass1
    	
        p.base();//输出的是:父类的普通方法
    	
        p.test();//输出的是:子类的覆盖父类的方法
    	//其方法行为总是表现出子类的方法的行为特征
        
        System.out.println(p.book);//输出的是:6
        //因为对象的实例变量不具备多态性,所以输出的是编译时类型的值
        
        //p.sub(); 编译错误
        //因为父类没有sub方法,所以sub方法没有被编译,无法运行
    }
}

注意:引用变量在编译阶段只能调用其编译时所具有的方法,但运行时则执行它运行时类型所具有的方法

借鉴博客:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73260878e482a958448e435061e5a37b9ec7b63514fce87616600aa4959e1fa2172405966e8c5dccd179ded9d707ccc7423706d913116c46eaddc3754d653e1&p=882a9645d3df12a05aa7d02a564a8d&newp=9034c54ad5c344f240be9b7c13499e231610db2151d4d4116b82c825d7331b001c3bbfb423241100d9cf7a6d03a54a5ceef43d73360625a3dda5c91d9fb4c57479d53f&user=baidu&fm=sc&query=java+%B6%E0%CC%AC&qid=ef355d7f00020cdb&p1=2

你可能感兴趣的:(面向对象)