多态
一、定义:
多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。
具体来说说多态就是一个对象具备多种形态。父类的引用类型变量指向了子类的对象,或者是接口的引用类型变量指向了接口实现类的对象。
二、多态的前提:
必须存在继承或者实现关系。
三、多态的实现形式:
父类 对象名 = new 子类();
四、多态要注意的细节:
- 多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。
- 多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。
- 多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。
- 多态情况下,不能访问子类特有的成员。
总结:多态情况下,子父类存在同名的成员时,访问的都是父类的成员,除了在同名非静态函数时才是访问子类的成员。(原因:编译看左边,运行不一定看右边。)
abstract class Animal { //定义一个动物类作为父类
String color = "AnimalColor";
String name;
public Animal(String name){
this.name = name;
}
public void eat(){
System.out.println(this.name+"is eating!");//动物通用的eat方法
}
abstract public void move();
}
class Dog extends Animal {
String color = "黑色";
public Dog(String name){
super(name);
}
@Override
public void move() {
System.out.println(this.name+"is running!");
}
public void wang(){
System.out.println("wangwang!");
}
}
class Cat extends Animal {
String color = "CatColor"; //子类与父类同名的成员变量
public Cat(String name){
super(name);
}
@Override
public void move() {
System.out.println(this.name+"is running!");
}
public void eat(){
System.out.println(this.name+"is eating fish!");//子类中重写的eat方法
}
public void miao(){
System.out.println("miaomiao!");
}
}
public class Mian {
public static void main(String args[]){
Animal d = new Dog("2HA");
System.out.println(d.color+"的"+d.name);
d.eat();
d.move();
((Dog) d).wang();
Animal c = new Cat("Tom");
System.out.println(c.color+"的"+c.name);
c.eat();
c.move();
//c.miao(); error 注意:多态情况下,不能访问子类特有的成员
((Cat) c).miao();
}
}
//AnimalColor的2HA
//2HAis eating!
//2HAis running!
//wangwang!
//AnimalColor的Tom 注意: 多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量
//Tomis eating fish! 注意:多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数
//Tomis running!
//miaomiao!
五、多态的应用:
1.多态用于形参类型的时候,可以接收更多类型的数据 。
public class Mian {
public static void main(String args[]){
Circle c = new Circle(4.0);
print(c);
Rect r = new Rect(3,4);
print(r);
}
public static void print(MyShape s){ // 可以传入各种MyShape的子类
s.getArea();
s.getLength();
}
}
2.多态用于返回值类型的时候,可以返回更多类型的数据。
public class Mian {
public static void main(String args[]){
MyShape m = getShape(0); //调用了使用多态的方法,定义的变量类型要与返回值类型一致。
m.getArea();
m.getLength();
MyShape n = getShape(1);
n.getArea();
n.getLength();
}
public static MyShape getShape(int i){
if (i==0){
return new Circle(4.0);
}else{
return new Rect(3,4);
}
}
}
示例代码的剩余部分
//图形类
abstract class MyShape{
public abstract void getArea();
public abstract void getLength();
}
class Circle extends MyShape{
public static final double PI = 3.14;
double r;
public Circle(double r){
this.r =r ;
}
public void getArea(){
System.out.println("圆形的面积:"+ PI*r*r);
}
public void getLength(){
System.out.println("圆形的周长:"+ 2*PI*r);
}
}
class Rect extends MyShape{
int width;
int height;
public Rect(int width , int height){
this.width = width;
this.height = height;
}
public void getArea(){
System.out.println("矩形的面积:"+ width*height);
}
public void getLength(){
System.out.println("矩形的周长:"+ 2*(width+height));
}
}