在多态中的成员特点主要分三点:
(1)非静态成员函数:分为编译时期和运行时期:
A:编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有编译通过,如果没有编译失败。
B:运行时期:参阅对象所属的类中是否有调用的方法。
用下面的代码进行说明:
class Animal
{
public void method1()
{
System.out.println("Animal_method_1");
}
public void method3()
{
System.out.println("Animal_method_3");
}
}
class Cat extends Animal
{
public void method1()
{
System.out.println("Cat_method_1");
}
public void method2()
{
System.out.println("Cat_method_2");
}
}
class DuoTaiDemo3
{
public static void main(String[] args)
{
System.out.println("Hello World!");
Animal a = new Cat();
a.method1();
a.method2();
a.method3();
}
}
编译的时候提示错误:没有找到method2()方法。
将a.method2()注释掉,可以编译通过,运行的结果是:
Cat_method_1
Animal_method_3
(2)静态成员函数
静态成员函数无论是在编译还是在运行的时候都看引用所属的类。
用下面的代码为例说明:
class Animal
{
public void method1()
{
System.out.println("Animal_method_1");
}
public void method3()
{
System.out.println("Animal_method_3");
}
public static void method4()
{
System.out.println("Animal_method_4");
}
}
class Cat extends Animal
{
public void method1()
{
System.out.println("Cat_method_1");
}
public void method2()
{
System.out.println("Cat_method_2");
}
public static void method4()
{
System.out.println("Cat_method_4");
}
}
class DuoTaiDemo3
{
public static void main(String[] args)
{
System.out.println("Hello World!");
Animal a = new Cat();
a.method1();
// a.method2();
a.method3();
a.method4();
}
}
运行的结果为:
Cat_method_1
Animal_mothod_3
Animal_mothod_4
(3)成员变量
无论编译还是运行都参阅引用变量所属的类
用以下的代码说明:
class Animal
{
int sum = 5;
public void method1()
{
System.out.println("Animal_method_1");
}
public void method3()
{
System.out.println("Animal_method_3");
}
public static void method4()
{
System.out.println("Animal_method_4");
}
}
class Cat extends Animal
{
int sum = 8;
public void method1()
{
System.out.println("Cat_method_1");
}
public void method2()
{
System.out.println("Cat_method_2");
}
public static void method4()
{
System.out.println("Cat_method_4");
}
}
class DuoTaiDemo3
{
public static void main(String[] args)
{
System.out.println("Hello World!");
Animal a = new Cat();
a.method1();
// a.method2();
a.method3();
a.method4();
System.out.println(a.sum);
System.out.println(new Cat().sum);
}
}
运行结果是:
Cat_method_1
Animal_method_3
Animal_method_4
5
8
总结:之所以会有这几种情况,是因为在Java中不同的方法和变量的绑定方式是不同的。
在Java中有两种绑定方式,分别是静态绑定和动态绑定
静态绑定:在面向过程中静态绑定又称为前期绑定。即在还没有运行的时候就已经加载到内存中去了。
动态绑定:在面向过程中动态绑定又称为后期绑定。即在运行时才绑定,根据运行时候的实际情况有选择地进行绑定。
从上面的三段代码中可以看出:
static修饰的成员方法和成员变量都是属于静态绑定,而成员方法则是属于动态绑定。