大家好,欢迎来到IT知识分享网。
Java中存在多态的前提条件
- 要有继承关系
- 要有方法重写
- 要有父类引用指向子类对象
多态中的成员访问特点
- 成员变量:编译看左边(父类),运行看左边(父类)
- 成员方法:编译看左边(父类) ,运行看右边(子类)
- 静态方法:编译看左边(父类) ,运行看左边(父类)
总结:只有非静态的成员方法,编译看左边,运行看右边
成员变量:
public class Tset01 {
public static void main(String[] args) {
/* * 多态中的成员变量 * 编译看左边,运行也看左边,与子类无关 */
Father f1 = new Son();
System.out.println(f1.num);
Son f2 = new Son();
System.out.println(f2.num);
}
}
class Father{
int num = 10;
}
class Son extends Father{
int num = 20;
}
========================================
输出:
10
20
成员方法:
public class Tset01 {
public static void main(String[] args) {
/* * 多态中的成员方法特点: * 编译看左边,运行也看右边,与子类无关 * 此方法调用时,父类中一定要有say()方法,不然编译找不到 */
Father f1 = new Son();
f1.say();
}
}
class Father{
int num = 10;
public void say() {
System.out.println("fffffff");
}
}
class Son extends Father{
int num = 20;
public void say() {
System.out.println("sssssss");
}
}
========================================
输出:
sssssss
静态方法
public class Tset01 {
public static void main(String[] args) {
/* * 多态中的静态方法特点: * 编译看左边,运行也看左边,与子类无关 * 虽然是通过对象来调用方法,其实内部还是通过类名来调用方法 Father.class() */
Father f1 = new Son();
f1.say();
}
}
class Father{
int num = 10;
public static void say() {
System.out.println("fffffff");
}
}
class Son extends Father{
int num = 20;
public static void say() {
System.out.println("sssssss");
}
}
========================================
输出:
fffffff
多态中向上转型和向下转型
-
向上转型:父类指向子类对象 Father f = new Son();
-
向下转型:子类指向父类对象 Son s = (Son)f;
-
向下转型,也就是子类指向父类时要注意:
父类的真实指向的对象必须是子类对象,否则会有问题
//向下转型
Father f = new Son();//父类真实指向的是子类对象
Son s = (Son)f;
//错误的向下转型
Father f1 = new Father();//父类指向父类对象,向下转会有问题
Son s = (Son)f;
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/10975.html