1.对象的数据成员没有多态特性
以下实验证明了数据成员不存在多态的特性。
如果是Base指针,就指向Base的数据成员;
如果是Derived的指针,就指向Derived的数据成员。
3.private final方法会影响多态
Java的多态特性依赖于晚绑定(动态、运行时绑定)
并且Java中所有的绑定都是晚绑定
除了final方法和private方法(private是final的一种)
这两种方法采用早绑定,即编译期就确定了运行的方法。
以下实验证明了数据成员不存在多态的特性。
如果是Base指针,就指向Base的数据成员;
如果是Derived的指针,就指向Derived的数据成员。
class Base {
protected int i = 47;
}
class Derived extends Base {
protected int i = 27;
}
public class Test {
public static void main(String[] args) {
Base b = new Derived();
System.out.println(b.i);
Derived d = new Derived();
System.out.println(d.i);
//运行结果:
//47
//27
}
}
下面的例子也说明了同样的问题protected int i = 47;
}
class Derived extends Base {
protected int i = 27;
}
public class Test {
public static void main(String[] args) {
Base b = new Derived();
System.out.println(b.i);
Derived d = new Derived();
System.out.println(d.i);
//运行结果:
//47
//27
}
}
class Base {
int i = 47;
int f() {
return i;
}
}
class Derived extends Base {
int i = 27;
int g() {
return i;
}
}
public class Test {
public static void main(String[] args) {
Derived d = new Derived();
System.out.println(d.f());
System.out.println(d.g());
//运行结果:
//47
//27 }
}
2.只有成员函数存在多态特性int i = 47;
int f() {
return i;
}
}
class Derived extends Base {
int i = 27;
int g() {
return i;
}
}
public class Test {
public static void main(String[] args) {
Derived d = new Derived();
System.out.println(d.f());
System.out.println(d.g());
//运行结果:
//47
//27 }
}
class Base {
int i = 47;
int f() {
return g();
}
int g() {
return i;
}
}
class Derived extends Base {
int i = 27;
int g() {
return i;
}
}
public class Test {
public static void main(String[] args) {
Derived d = new Derived();
System.out.println(d.f()); //运行结果:27
}
}
对象d调用f方法,多态特性导致f调用子类的g方法,而不是父类的g方法,故返回27。int i = 47;
int f() {
return g();
}
int g() {
return i;
}
}
class Derived extends Base {
int i = 27;
int g() {
return i;
}
}
public class Test {
public static void main(String[] args) {
Derived d = new Derived();
System.out.println(d.f()); //运行结果:27
}
}
3.private final方法会影响多态
Java的多态特性依赖于晚绑定(动态、运行时绑定)
并且Java中所有的绑定都是晚绑定
除了final方法和private方法(private是final的一种)
这两种方法采用早绑定,即编译期就确定了运行的方法。
class Base {
int i = 47;
int f() {
return g();
}
private int g() {
return i;
}
}
class Derived extends Base {
int i = 27;
int g() {
return i;
}
}
public class Test {
public static void main(String[] args) {
Derived d = new Derived();
System.out.println(d.f());
//运行结果:47
}
}
因为f函数调用的g函数是私有的,java采用早绑定,所以没有多态特性,直接绑定在了Base的g函数上。int i = 47;
int f() {
return g();
}
private int g() {
return i;
}
}
class Derived extends Base {
int i = 27;
int g() {
return i;
}
}
public class Test {
public static void main(String[] args) {
Derived d = new Derived();
System.out.println(d.f());
//运行结果:47
}
}
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29254281/viewspace-1063748/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29254281/viewspace-1063748/