你可以去看看毕老师第8天第5个视频:多态中成员的特点
在多态中成员函数的特点:
在编译发时期:参阅引用型变量所属的类中时否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行期间:参阅对象所属的类中是否有调用的方法
简单总结就是:成员函数在多态中调用时,编译看左边,运行看右边。
在多态中,静态成员函数的特点:
无论编译和运行,都看左边。
这里面涉及到动态绑定和静态绑定的知识。
class Fu
{
static String age() //静态成员函数
{
return " I am a old man";
}
String name()
{
return "LaoZi";
}
}
class Zi extends Fu
{
static String age()
{
return "I am a young man";
}
String name() //成员函数
{
return "ErZi";
}
}
class Test
{
public static void main(String[] args)
{
Fu s = new Zi();
System.out.println(s.age() + ", " + s.name());
}
}
static 的属性和方法都是不能覆盖的,因为static修饰的部分都是与对象无关的,只与类有关
静态方法是和对象绑定的,也就是说子类覆盖了父类的静态方法,但是父类的静态方法还是和父类绑定的,只不过隐藏起来了.
Fu s = new Zi();//这句话是父类对象指向子类实例,也就是你new了一个父类对象,
age()是静态方法,所以调用的就是父类的
这是子类继承父类的程序。当子类继承父类,沿袭了父类的功能到子类中,子类虽具备该功能,但是功能的内容却和父类不一致,这是,没有必要定义新功能,而是使用覆盖技术,保留父类的功能定义,并重写功能内容。子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败。静态只能覆盖静态。Fu s = new Zi(); 由于是父类创建子类对象,成员函数在多态中调用时,编译看左边,运行看右边。所以结果为 I am a old man Erzi
class Fu
{
static String age() //静态方法
{
return " I am a old man";
}
String name() //非静态方法
{
return "LaoZi";
}
}
class Zi extends Fu
{
static String age() //静态方法
{
return "I am a young man";
}
String name() //非静态方法
{
return "ErZi";
}
}
class Test
{
public static void main(String[] args)
{
Fu s = new Zi(); //多态
System.out.println(s.age() + ", " + s.name());
}
}
Fu s = new Zi();父类引用指向子类对象。
因为name()方法是静态的,所以运行时调用的是父类的方法,
而age()方法是非静态的运行时调用的是对象的覆盖后方法,不是父类的方法。下面附上多态的规则:
多态中非静态成员函数的特点:父类引用子类对象 Fu f = new zi();
在编译时期(只检查语法问题),参阅引用型变量所属类中是否有调用的方法。如果有,编译通过。没有,则报错。
在运行时期,执行的是对象所属类中的方法。
简单的说,非静态成员函数在多态调用时,编译看左边,运行看右边。
多态中静态函数的特点:
无论编译还是运行,都参阅左边。
多态中成员变量的特点:
无论编译还是运行,都参阅左边。即引用型变量所属的类的成员