- 体现了事物的多态性
- 创建多态的方法: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;
}
// 重写父类中的方法
@Override
public void getFuAge() {
System.out.println("重写了父类的getFuAge方法");
}
@Override
public 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;
}
// 重写父类中的方法
@Override
public void getFuAge() {
System.out.println("重写了父类的getFuAge方法");
}
@Override
public 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);
}
}