Java多态

Java 多态

刚学完,记录一下,做个笔记

多态的定义

用起来还是比较简单的:

1
2
父类名称 对象名 = new 子类名称();
接口名称 对象名 = new 实现类名称();

原本使用子类或父类的时候,是左右都是子类或者父类名称,这里把左边的名称换成了父类名称
定义很简单,理解后用起来也很简单

子类与父类的变量重名

  • 直接通过对象名称访问成员变量,等号左边是谁,优先用谁,没有则向上找
  • 间接访问成员方法访问成员变量,看方法属于是,优先用谁,没有则向上找
1
2
3
4
5
6
public class father { //父类
int num = 10;
public void show(){
System.out.println(num);
}
}
1
2
3
4
5
6
7
public class child extends father{ //子类
int num = 20;
@Override
public void show(){
System.out.println(num);
}
}
1
2
3
4
5
6
7
public class test{
public static void main(String[] args){
father obj = new child();
System.out.println(obj.num); // ①
obj.show(); // ②
}
}

①处会输出父类的10,而不是子类的20,因为多态是实例化一个子类,但把它当做父类来看,所以num用的是父类里的值
②处会输出子类的20,因为子类对父类的show方法进行了重载,优先使用本类的成员变量,如果没有则向上找

多态方法的使用

1
2
3
4
5
6
7
8
9
public class father { //父类
public void method(){
System.out.println("父类的方法");
}

public void methodFu(){
System.out.println("父类特有的方法");
}
}
1
2
3
4
5
6
public class child{ //子类
@Override
public void method() {
System.out.println("子类方法");
}
}
1
2
3
4
5
6
7
8
public class test{
public void main(String[] args){
father obj = new child();

obj.method(); //父子都有,优先用子
obj.methodFu(); //子类没有,向上找,使用父类的
}
}

obj是父类的东西,但是是由子类new出来的,obj可以使用父类的方法,子类重写了才会在子类中实现,父类中没有的,子类中定义的,obj会找不到

多态的转型

向上转型,就是多态的写法
格式:

1
Father obj = new Child();

创建一个子类对象,把它当做父类来看待使用
向上转型一定是安全的
实例:

1
Animal cat = new Cat();

创建一个猫的子类对象,把它当做动物对象来看待

向下转型类似于数据类型的强制类型转换
格式:

1
子类名称 对象名 = (子类名称) 原对象;

向下转型,其实是一个还原的动作
比如实例了一只猫,把它当做动物看,但猫能干的事动物未必能干,所以要把这个猫还原为猫对象
实例:

1
2
3
4
Animal cat = new Cat();

Cat mao = (Cat) cat;
mao.catMouse(); // 猫抓老鼠的方法

Java 多态刚学感觉好难,但仔细想了一下,思绪理通一下,就差不多理解了
理解了自己之前不懂的东西好有成就感啊 ヾ(≧▽≦*)o