自身网站的平台建设,wordpress发展现状,自己怎么做视频收费网站,哪个大学的网站做的最好看文章目录简介演示案例简介
多态#xff0c;多态使 Java 更有生命和鲜活起来。多态指子类对象可以直接赋值给父类变量#xff0c;但在运行时依然表现出子类的特征。Java 引用变量有两种类型#xff0c;分别是编译时类型和运行时类型#xff0c;编译时类型由声明类型决定多态使 Java 更有生命和鲜活起来。多态指子类对象可以直接赋值给父类变量但在运行时依然表现出子类的特征。Java 引用变量有两种类型分别是编译时类型和运行时类型编译时类型由声明类型决定运行时类型由赋值对象的类型决定。如果编译时类型和运行时类型不一致就会出现所谓多态。
演示案例
父类的引用声明成父类型的引用数据类型的变量指向子类的对象
Fu obj new Zi();
int num obj.num;
obj.show();
obj.methodZi();1.如果父类和子类都有成员变量 num请问上面的例子中访问的是谁的成员变量 答看等号左边是谁变量的声明类型则优先用谁的没有则向上。所以访问的是父类的成员变量 num。父类的变量是不能被子类覆盖重写的但是父类的成员变量可以被子类继承也就是说子类对象中存在来自父类的成员变量 num同时还存在一个在子类声明的成员变量 num
2.如果父类和子类都有成员方法 show()请问上面的例子中访问的是谁的成员方法 show() 答看等号右边是谁创建哪个类的实例对象即对象实际所属的类型则优先调用谁的没有则向上。子类有 show()所以就是调用子类的没有就向上在父类中查找。父类的成员方法可以被子类覆盖重写。如果父类的成员方法被子类重写了那么就不会再继承到子类中
3.子类有方法 methodZi()但是父类没有那么通过变量名称调用方法 methodZi() 是否正确呢 答错误。Java 代码在编译的时对于引用类型的变量编译时看的是声明的类型运行时才看对象的实际类型。变量 obj 声明的类型是父类父类根本没有方法 methodZi()所以 obj.methodZi(); 编译会报错。为什么 obj.show(); 不会报错因为父类也有 show() 方法所以编译不会报错但是在运行时看的是右边右边的子类也有方法 show()所以实际调用的是子类的方法 show()
口诀 对于成员方法编译看左边运行看右边。 对于变量成员变量和静态变量编译看左边运行也看左边。
多态的好处 可以创建各种子类对象都不会影响父类变量的方法调用代码因为父类变量是根据父类所声明的方法进行调用的。
注意下面的错误代码
FuInterface obj new FuInterfaceImpl();
obj.staticMethod(); // 编译直接报错原因就是变量obj的声明类型是个接口如果是具体类则不会报编译错误。提示只有含有此静态方法的接口类才能调用此静态方法注staticMethod() 是接口和实现类都有的静态方法
但是下面的代码没有错误
Fu obj new Zi();
obj.staticMethod(); // 编译通过而且只会调用父类的静态方法原因就是obj声明的类型Fu是一个具体类注 1.staticMethod() 是父类和子类都有的静态方法 2.子类不能覆盖重写父类的静态方法但是子类也可以声明定义和父类一模一样的静态方法但不属于覆盖重写 3.obj.staticMethod() 编译时会变成 Fu.staticMethod()为什么因为 obj 声明的类型 Fu 是一个具体类如果 obj 声明的类型是接口则编译器不会将变量名替换成所声明的类型名称
通过父类型的变量去访问静态变量则无论变量的类型是具体类还是接口都是访问父类的静态变量。
public void test6() {Animal animal new Ape();System.out.println(animal.skinColor);}说明 接口 Animal 声明定义了静态变量 skinColor其实是一个常量类 Ape 中声明了静态变量 skinColor。但是编译的时候会查询变量 animal 的声明类型 Animal 中是否声明了变量 skinColor如果没有声明则会报编译错误如果有声明则会将变量名 animal 改成类名 Animal所以说实际访问的是变量 animal 的声明类型中的静态变量 skinColor。这里编译时并不会判断变量 animal 的声明类型是具体类型还是接口。