在面对对象的程序设计中,多态是继数据局抽象和继承之后的第三种基本特征  ----think in Java

 

多态是什么:

多态是一个程序中名称相同但是功能不同的方法,也可以称为一个名称的不同表现状态

多态的出现必伴随着以下两种情况

 ① 重载 : 在一个方法名称相同但是参数列表不同,即参数个数,类型,设计类型时要注意精度匹配的问题

 ② 覆盖 : 伴随继承出现,子类继承父类方法并对其覆盖

(方法名与参数列表是Java区别方法的依据)

向上转型: 

由导出类向基类转型

public class main {
	public static void main(String[] args) throws Exception{
		son p  = new son();
		p.a();
	}
}

class father{
	public void a (){
		System.out.println(\"hello i am father\");
	}
}
class son extends father{
	public void  a(){
		System.out.println(\"i am son\");
	}
	
}

  多态缺陷:域与静态方法

    你可能觉得一切内容都可以有多态,但实际上不是这样的,如:
    ① 域  :

public class main {
	public static void main(String[] args) throws Exception{
		son p  = new son();
		p.a();
		p.a2();
	}
}

class father{
    int a = 10;
	public void a (){
		System.out.println(\"hello i am father\");
	}
}
class son extends father{
	int a = 11;
	public void  a(){
		System.out.println(\"i am son\"+a);
	}
	public void  a2(){
		System.out.println(\"i am son\"+super.a);
	}
}

分析: 在继承中子类会从父类获得父类的所有属性,如a的值。当然你也可以在子类中重新定义一个a,此时子类中将存在2个a,一个为this.a一个为super.a,子类操作a时,会根据作用域由内向外查找a,如果不存在this.a则操作super.a 。但是在向上转型时,子类中的重定义的a无法影响到父类。

②:静态方法

public class main {
	public static void main(String[] args) throws Exception{
		father p  = new son();

		p.b();
	}
}

class father{
    public  static int a = 1;
    public static void b(){
    	System.out.println(\"father-\"+a);
    }
	
}
class son extends father{
	  public  static int a = 1;
	    public static void b(){
	    	System.out.println(\"son-\"+a);
	    }
}

分析:静态方法是类的方法,可以被继承但是是无法被覆盖的,他与域有着相同的理解,即无法通过修改导出类从而引发基类的变化

向上转型只能改变父类中的非private,非static方法,本质是修改了父类中相应方法的引用地址,因此引发作用域的改变

 

收藏 打印