- 体现了事物的多态性
- 创建多态的方法:Fu f = new Zi()
- 父类对象指向子类内存地址
多态访问成员方法的特点
1、编译看左,运行看右
2、编译的时候看=左边的类型中,是否定义了该方法,如果有就编译通过,如果没有就编译报错
3、运行的时候看=右边的类型中,对象所属的类中,如果对这个方法提供了新的实现,最终运行的就是子类对这个方法的实现,如果没有因为继承,所以使用父类的实现
注意:子类的特有成员方法是无法调用的
示例:
package com.bxw.demo;import java.io.FileInputStream;public class Class多态 {public static void main(String[] args) {// 创建多态Fu fu = new Zi();// 创建了一个父类指向子类内存的多态// 子类中特有的方法和成员变量是无法被调用的。但是子类中没有重写父类中的方法时,多态对调// 会调用父类的成员方法。注意子类的特有成员方法是无法调用的fu.getFuAge();fu.getFuName();// fu.getZiId(); // 无法调用}}// 创建一个父类class Fu{private String name;private int age;public Fu() {}public Fu(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}// 创建一个获取name父类方法public void getFuName(){System.out.println("父类中方法");}// 创建一个获取age的父类方法public void getFuAge(){System.out.println("父类中的方法");}}// 创建一个子类class Zi extends Fu{private int id;public Zi() {}public Zi(String name, int age, int id) {super(name, age);this.id = id;}public Zi(int id) {this.id = id;}public int getId() {return id;}public void setId(int id) {this.id = id;}// 重写父类中的方法@Overridepublic void getFuAge() {System.out.println("重写了父类的getFuAge方法");}@Overridepublic void getFuName() {System.out.println("重写了父类的getFuName方法");}// 创建一个子类特有的方法public void getZiId() {System.out.println("创建了一个子类特有的方法");}}
向上向下转型
package com.bxw.demo;import java.io.FileInputStream;public class Class多态 {public static void main(String[] args) {// 多态的实现就是向上转型Fu fu = new Zi("jack",12,21);fu.getFuAge();fu.getFuName();// 向下转型Zi zi = (Zi)fu;// 向下转型之后可以调用子类的特有方法了zi.getZiId();System.out.println("name:" + zi.getName() + " age:" + zi.getAge() + " id:" + zi.getId());}}// 创建一个父类class Fu{private String name;private int age;public Fu() {}public Fu(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}// 创建一个获取name父类方法public void getFuName(){System.out.println("父类中方法");}// 创建一个获取age的父类方法public void getFuAge(){System.out.println("父类中的方法");}}// 创建一个子类class Zi extends Fu{private int id;public Zi() {}public Zi(String name, int age, int id) {super(name, age);this.id = id;}public Zi(int id) {this.id = id;}public int getId() {return id;}public void setId(int id) {this.id = id;}// 重写父类中的方法@Overridepublic void getFuAge() {System.out.println("重写了父类的getFuAge方法");}@Overridepublic void getFuName() {System.out.println("重写了父类的getFuName方法");}// 创建一个子类特有的方法public void getZiId() {System.out.println("创建了一个子类特有的方法");}}
- 向上转型:多态的实现就是属于向上转型
- 向下转型:必须是已经经过向上转型的才可以进行向下转型
- 格式:Zi z = (Zi) f
instanceof
这个关键字用与判断多态instanceof指定的数据类型,返回值是一个布尔值
示例:
package com.bxw.demo.demo07;import java.io.FileReader;public class instanceof判断 {public static void main(String[] args) {// 多态实现Fu fu = new Zi();Fu fu1 = new Fu();Zi zi1 = new Zi();// 使用instanceof关键字来判断fu是否之Zi类型System.out.println(fu instanceof Zi);// true 向上转型System.out.println(fu instanceof Fu);// true 对象关系System.out.println(fu1 instanceof Fu);// true 对象关系System.out.println(fu1 instanceof Zi);// false 反了System.out.println(zi1 instanceof Fu); // true 继承关系// instanceof的作用是能更准确的进行向下转型if (fu instanceof Zi == true){System.out.println("已向上转型");Zi zi = (Zi)fu;System.out.println("向下转型成功");}if (fu1 instanceof Zi == false){System.out.println("未向上转型");}}}// 父类class Fu{String name = "jack";public void printName(){System.out.println(this.name);}}// 子类class Zi extends Fu{int age = 18;public void printName_Age(){System.out.println(this.name + "--" + this.age);}}
