Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1899108
  • 博文数量: 606
  • 博客积分: 9991
  • 博客等级: 中将
  • 技术积分: 5725
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-17 19:07
文章分类

全部博文(606)

文章存档

2011年(10)

2010年(67)

2009年(155)

2008年(386)

分类:

2008-07-19 23:05:40

1、重载是在一个类里一系列参数不同名字相同的方法.
      方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成。只要签名不同,就可以在一种类型内定义具有相同名称的多种方法。当定义两种或多种具有相同名称的方法时,就称作重载。
2、重写是继承后重新实现父类的方法.派生类型可以重写继承的虚方法
3、继承是子类获得父类的成员
4、多态则是父类使用子类的方法

下面给出一个例子:
一个父类:test_father,一个子类:test_sub,来说明这几个概念的关系
test_father类:

public class test_father {

public test_father() {
   System.out.println("father");//构造器
}

public void test_father() {
   System.out.println("father");//重载
}
public int test_father(int i) {
   System.out.println("fatherii"+i);
   return i;//重载
}

}

test_sub类:
public class test_sub extends test_father{//继承

public test_sub() {
   System.out.println("test_sub");//构造器
}

public void test_father() {
   System.out.println("sub");//重写父类方法
}
public int test_father(int i) {
   System.out.println("subii"+i);
  
   return i;
}

/**
* @param args
*/
public static void main(String[] args) {
   // TODO Auto-generated method stub
   test_father fa=new test_sub();//多态
   fa.test_father();
   fa.test_father(3);
}

}

输出结果:
father
test_sub
sub
subii3

什么是多态(Polymorphism)?按字面的意思就是“多种形状”。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function) 实现的。

  多态性是允许将父对象设置成为和一个和多个它的子对象相等的技术,比如Parent:=Child;

   赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。

   举个例子:从一个基类中派生,响应一个虚命令,产生不同的结果。

   比如从某个基类继承出多个对象,其基类有一个虚方法Tdoit,然后其子类也有这个方法,但行为不同,然后这些子对象中的任何一个可以附给其基类的对象,这样其基类的对象就可以执行不同的操作了。实际上你是在通过其基类来访问其子对象的,你要做的就是一个赋值操作。

   使用继承性的结果就是可以创建一个类的家族,在认识这个类的家族时,就是把导出类的对象 当作基类的的对象,这种认识又叫作upcasting。这样认识的重要性在于:我们可以只针对基类写出一段程序,但它可以适 应于这个类的家族,因为编译器会自动就找出合适的对象来执行操作。这种现象又称为多态性。而实现 多态性的手段又叫称动态联编(dynamic binding)。

简单的说,建立一个父类的变量,它的内容可以是这个父类的,也可以是它的子类的,当子类拥有和父类同样的函数,当使用这个变量调用这个函数的时候,定义这个变量的类,也就是父类,里的同名函数将被调用,当在父类里的这个函数前加virtual关键字,那么子类的同名函数将被调用

class A {
public:
A() {}

virtual void foo() {
cout << "This is A." << endl;
}
};

class B : public A {
public:
B() {}

void foo() {
cout << "This is B." << endl;
}
};

int main(int argc, char* argv[]) {

A *a = new B();
a->foo();

return 0;
}

这将显示:
This is B.

如果把virtual去掉,将显示:
This is A.   


阅读(587) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~