Java 多态

1.多态:一个对象具备多种形态。(父类的引用类型变量指向了子类的对象).

2.多态的前提:必须存在继承或者实现 关系。

3.多态要注意 的细节:
1. 多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。
2. 多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。
3. 多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。
4. 多态情况下,不能访问子类特有的成员。

总结:多态情况下,子父类存在同名的成员时,访问的都是父类的成员,除了在同名非静态函数时才是访问子类的。

  最重要的用法就是实现与父类相同的非静态方法,从而实现多态.

5------多态的应用:
1. 多态用于形参类型的时候,可以接收更多类型的数据 。
2. 多态用于返回值类型的时候,可以返回更多类型的数据。

 1 /*
 2 需求1: 定义一个函数可以接收任意类型的图形对象,并且打印图形面积与周长。
 3 */
 4 
 5 //图形类
 6 abstract class MyShape{
 7 
 8     public abstract void getArea();
 9 
10     public abstract void getLength();    
11 }
12 
13 
14 
15 class Circle extends MyShape{
16 
17     public static final double PI = 3.14;
18 
19     double r;
20 
21     public Circle(double r){
22         this.r =r ;    
23     }
24 
25     public  void getArea(){
26         System.out.println("圆形的面积:"+ PI*r*r);
27     }
28 
29     public  void getLength(){
30         System.out.println("圆形的周长:"+ 2*PI*r);
31     }
32 }
33 
34 
35 class Rect  extends MyShape{
36 
37     int width;
38 
39     int height;
40 
41     public Rect(int width , int height){
42         this.width = width;
43         this.height = height;
44     }
45 
46     public  void getArea(){
47         System.out.println("矩形的面积:"+ width*height);
48     }
49 
50     public  void getLength(){
51         System.out.println("矩形的周长:"+ 2*(width+height));
52     }
53 }
54 
55 
56 
57 class Demo12 {
58 
59     public static void main(String[] args) 
60     {
61         /*
62         //System.out.println("Hello World!");
63         Circle c = new Circle(4.0);
64         print(c);
65 
66         Rect r = new Rect(3,4);
67         print(r);
68         */
69 
70         MyShape m = getShape(0); //调用了使用多态的方法,定义的变量类型要与返回值类型一致。
71         m.getArea();
72         m.getLength();
73         
74 
75     }
76 
77 
78     //需求1: 定义一个函数可以接收任意类型的图形对象,并且打印图形面积与周长。
79     public static void print(MyShape s){ // MyShpe s = new Circle(4.0);
80         s.getArea();
81         s.getLength();
82     }
83 
84 
85     // 需求2: 定义一个函数可以返回任意类型的图形对象。
86     public static MyShape  getShape(int i){
87         if (i==0){
88             return new Circle(4.0);
89         }else{
90             return new Rect(3,4);
91         }
92     }
93 
94 
95 }
原文地址:https://www.cnblogs.com/bequt/p/5027260.html