`
阿尔萨斯
  • 浏览: 4109051 次
社区版块
存档分类
最新评论

赵雅智_java多态性

 
阅读更多

多态机制是面向对象技术的精华之一,它是建立在继承基础之上的。

多态(polymorphism):某一类事物的多种存在形态。

思想基础

类的继承中,子类在父类的基础上进行扩充和改造,父类拥有的成员子类中都有,子类的对象应该比父类的对象功能强,因而子类的对象应可以替代父类的对象被使用。

例:人中学生 ,教师, 工人
学生这个对象对应的类型:学生类型
学生 x=new 学生();
同时学生也是人,也可以把学生称为人
人 y = new 学生();

人是学生、教师、工人等具体事物中抽象出来的父类型。

  1. 体现:
    • 父类的引用指向自己的子类对象;
    • 父类的引用可以接收自己的子类对象。
    • 子类的对象可以代替父类的对象使用。 人 y = new 学生();
  2. 前提:要有继承关系,存在覆盖。
  3. 好处:提高程序的扩展性。
  4. 弊端:只能使用父类引用访问父类中的成员。如果想访问子类的特有方法,强制将父类的引用转为子类类型(子类名)父类名
  5. 成员方法:(动态绑定)编译看左边,运行看右边。
  6. 成员变量编译和运行都看左边。
  7. instanceof:检测一个对象的真正类型。
    格式:<变量名> instanceof <类型>
    功能:左侧的变量当前时刻所引用对象的真正类型是其右侧给出的类型、或是其子类,则整个表达式结果为true,否则结果为false。
例1.(456)

class Person
{
	String str = "Person";
	public void print(){
	System.out.println("父类print()方法,对象是:"+this.toString());
	}
}
class Student extends Person
{
	String str = "Student";
	public void print(){
	System.out.println("子类print()方法,对象是:"+this.toString());
	}
	public void display(){
	System.out.println("子类print()方法,对象是:"+this.toString());
	}
}
class StudentTest 
{
	public static void main(String[] args) 
	{
		Person p1 = new Person();
		System.out.println("Person变量p1.str="+p1.str);   //p
		p1.print();                                       //父,p
  
		Student s = new Student();
		System.out.println("Student变量s.str="+s.str);    //s
		s.display();                                      //子,s
		s.print();                                        //子,s

		Person p2 = new Student();                 //类型的提升,向上转型
                System.out.println("Person变量p2.str="+p2.str);   //p
		p2.print();                                       //子,s
		//p1.display();错:person中没有此方法

		Student s1 = (Student) p1;                 //向下转型
		s.display();                                      //子,s
	}
}

例2. (3,7)

class Animal
{
	public void eat(){
		System.out.println("吃");
	}
} 
class Dog extends Animal
{
	public void eat(){
		System.out.println("我爱吃骨头");
	}
	public void say(){
		System.out.println("汪汪汪")
} 
class Cat extends Animal
{
	public void eat(){
		System.out.println("我唉吃鱼");
	}
	public void catMouse(){
		System.out.println("我会捉老鼠");
	}
} 
class Test
{
	public static void funEat(Animal a){
		a.eat();
		if (a instanceof Cat)
		{
				Cat c = (Cat)a;
				c.catMouse();
		}
	}
	public static void main(String[] args) 
	{
		Cat c1 = new Cat();
		funEat(c1);
		Dog d = new Dog();
		funEat(d);
	}
}

程序测试

class A{
	float var=1.1f;
	float method(){	return var;	}
}
class B extends A{
	float var=2.2f;
	float method(){   return var;}
}
若定义A a=new A(),则a.var和a.method()的值是多少? 1.1,1.1
若定义A a=new B(),则a.var和a.method()的值是多少? 1.1,2.2
若定义A a=new B(),B b=(B)a,则b.var和b.method()的值是多少? 2.2,2.2



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics