关于java的向上转型和多态

结论:向上转型时,声明的是父类的引用,但是执行的过程中调用的是子类的对象,程序会去寻找父类的method方法以及子类的method方法:

1. 如果父类没有,子类有,会报错。

2. 如果父类有,子类没有,调用父类method。

3. 如果父类有,子类也有,调用子类method。


上面是理论,下面看几个示例:

public class Father {   
  public void method() {   
    System.out.println("父类方法,对象类型:" + this.getClass());   
  }   
  
     
public class Son extends Father {   
  public static void main(String[] args) {   
    Father sample = new Son();//向上转型   
    sample.method();   
  }   
  

结果:“父类方法,对象类型:class Son”


public class Son extends Father {   
  public void method() {   
    System.out.println("子类方法,对象类型:" + this.getClass());   
  }   
     
  public static void main(String[] args) {   
    Father sample = new Son();//向上转型   
    sample.method();   
  }   
  
结果:“子类方法,对象类型:class Son”
 
在向上转型的情况下,对象的方法可以找到子类,而对象的属性还是父类的属性。
代码如下:
public class Father {   
   
  protected String name="父亲属性";   
     
  public void method() {   
    System.out.println("父类方法,对象类型:" + this.getClass());   
  }   
  
     
public class Son extends Father {   
  protected String name="儿子属性";   
     
  public void method() {   
    System.out.println("子类方法,对象类型:" + this.getClass());   
  }   
     
  public static void main(String[] args) {   
    Father sample = new Son();//向上转型   
    System.out.println("调用的成员:"+sample.name);   
  }   
  
结果:“调用的成员:父亲属性”


这个结果表明,子类的对象(使用父类的引用)调用到的是父类的成员变量。

那如果需要调用子类的成员变量name,该怎么做?最简单的办法是将该成员变量封装成方法getter形式。
代码如下:
public class Father {   
  protected String name = "父亲属性";   
  public String getName() {   
    return name;   
  }  
 
  public void method() {   
    System.out.println("父类方法,对象类型:" + this.getClass());   
  }   
  
     
public class Son extends Father {   
  protected String name="儿子属性";   
     
  public String getName() {   
    return name;   
  }
   
     
  public void method() {   
    System.out.println("子类方法,对象类型:" + this.getClass());   
  }   
     
  public static void main(String[] args) {   
    Father sample = new Son();//向上转型   
    System.out.println("调用的成员:"+sample.getName());   
  }   
   
结果:“调用的成员:儿子属性”,因为这相当于前面例子的方法重写。


另外,也可以以实现接口的方式进行向上转型

代码如下:

interface A {
    abstract void f();
}
 
class B implements A{
    public void f(){
        System.out.println("bbbbb");
    }
}


class C implements A{
    public void f(){
        System.out.println("ccccc");
    }
}
 
public class Son {
    public static void main(String[] args){
    A[] a = new A[2];
        a[0] = new B();
        a[1] = new C();
        for (int i=0;i<a.length;i++){
        a[i].f();
        }
    }
}

结果:“ bbbbb

             ccccc”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验过程: 1. 首先,我们需要定义一个抽象的“形状”类,其中包含计算面积和周长的抽象方法。 ```java public abstract class Shape { public abstract double getArea(); public abstract double getPerimeter(); } ``` 2. 接着,我们定义具体的“三角形”和“圆”类,这两个类都继承自“形状”类,并实现了其抽象方法。其中,“三角形”类的实现如下: ```java public class Triangle extends Shape { private double a, b, c; public Triangle(double a, double b, double c) { this.a = a; this.b = b; this.c = c; } public double getArea() { double p = (a + b + c) / 2; return Math.sqrt(p * (p - a) * (p - b) * (p - c)); } public double getPerimeter() { return a + b + c; } } ``` “圆”类的实现如下: ```java public class Circle extends Shape { private double r; public Circle(double r) { this.r = r; } public double getArea() { return Math.PI * r * r; } public double getPerimeter() { return 2 * Math.PI * r; } } ``` 3. 在主函数中,我们使用了多态的概念,将“三角形”和“圆”类向上转型为“形状”类。这样,我们就可以使用“形状”类的引用来调用“三角形”和“圆”类的方法。 ```java Shape triangle = new Triangle(3, 4, 5); Shape circle = new Circle(2); double triangleArea = triangle.getArea(); double trianglePerimeter = triangle.getPerimeter(); double circleArea = circle.getArea(); double circlePerimeter = circle.getPerimeter(); ``` 4. 将三角形和圆的面积和周长输出到控制台上 ```java System.out.println("Triangle: area = " + triangleArea + ", perimeter = " + trianglePerimeter); System.out.println("Circle: area = " + circleArea + ", perimeter = " + circlePerimeter); ``` 分析讨论: 本次实验中,我们使用了Java语言中的上转型和多态的概念来实现计算三角形和圆的面积和周长。采用这种方式,我们可以将不同的形状对象向上转型为同一个父类对象,从而实现了代码的复用和扩展性。 具体来说,我们定义了一个抽象的“形状”类,其中包含了计算面积和周长的抽象方法。然后,我们分别定义了“三角形”和“圆”类,这两个类都继承自“形状”类,并实现了其抽象方法。在这个过程中,我们使用了多态的概念,将“三角形”和“圆”类向上转型为“形状”类。这样,我们就可以使用“形状”类的引用来调用“三角形”和“圆”类的方法。 这种方式的优点在于,我们可以将不同的形状对象看作是同一个父类对象,从而实现了代码的复用和扩展性。例如,如果我们需要计算矩形的面积和周长,只需定义一个新的“矩形”类,继承自“形状”类,并实现其抽象方法即可。而不需要重新定义一个新的类来实现这个功能。 总之,本次实验中的上转型和多态的概念是Java语言中非常重要的一部分,它可以提高代码的复用性和扩展性,是Java开发中必须掌握的知识点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值