多态
定义和基本使用
父类引用指向子类对象(左父右子)。
父类名称 对象名 = new 子类名称();
或者
接口名称 对象名 = new 实现类名称();
示例代码
Fu.java
package DemoMulti;
public class Fu {
public void method(){
System.out.println("父类方法");
}
public void methodFu(){
System.out.println("父类特有方法");
}
}
Zi.java
package DemoMulti;
public class Zi extends Fu {
@Override
public void method() {
System.out.println("子类方法");
}
}
obj本是子类对象,但是在这里被当作父类对象使用!比如一只猫被当作动物来看待。
package DemoMulti;
public class DemoMulti {
public static void main(String[] args) {
//多态的写法
Fu obj = new Zi();
obj.method();
obj.methodFu();
}
}
输出
子类方法
父类特有方法
多态成员变量的使用规则
成员变量不能被覆盖重写
访问成员变量的两种方式
- 直接通过对象名称访问成员变量,看等号左边是谁,优先用谁,没有则想上找
- 间接通过成员方法访问成员变量,看方法属于谁,优先用谁,没有则想上找
Fu.java
package DemoMulti;
public class Fu {
int num = 1;
public void showNum(){
System.out.println(num);
}
}
Zi.java
package DemoMulti;
public class Zi extends Fu {
int num = 2;
// public void showNum(){
// System.out.println(num);
// }
}
DemoMulti.java
package DemoMulti;
public class DemoMulti {
public static void main(String[] args) {
//多态的写法
Fu obj = new Zi();
System.out.println(obj.num);
obj.showNum();
}
}
注释掉子类的showNum方法,obj.showNum打印的是1,因为showNum方法属于父类;如果子类重写了showNum方法,则打印2
多态成员方法的使用规则
Fu.java
package DemoMulti;
public class Fu {
int num = 1;
public void showNum(){
System.out.println(num);
}
public void method(){
System.out.println("父类方法");
}
public void methodFu(){
System.out.println("父类特有方法");
}
}
Zi.java
package DemoMulti;
public class Zi extends Fu {
int num = 2;
int name = 100;
@Override
public void showNum() {
System.out.println(num);
}
@Override
public void method() {
System.out.println("子类方法");
}
public void methodZi(){
System.out.println("子类特有方法");
}
}
DemoMulti.java
package DemoMulti;
public class DemoMulti {
public static void main(String[] args) {
Fu obj = new Zi();
//父子都有,优先用子,因为new的是谁优先用谁,这点跟继承是一样的
obj.method();
//子类没有,想上找父类
obj.methodFu();
//编译看左边,运行看右边
obj.methodZi();
}
}
成员方法:编译看左边,运行看右边
obj.methodZi();编译不能过,是因为obj左边是父类,父类没有methodZi方法,而methodFu,method两个方法能编译过时因为父类有这两个方法,能运行成功是因为子类有method,子类没有methodFu,想上找到父类有,所以运行成功。
成员变量:编译看左边,运行还看左边。
多态的好处
左边固定,代码更灵活