6

我需要制作一个项目,其中列出了使用 Java 的面向对象编程的特征。

有人可以查看我的快速示例程序以确认我了解这些特性是如何实现的,并且它们都存在并且正确完成了吗?

package Example;

public class Parent {

    private int a;
    public void setVal(int x){
        a = x;
    }
    public void getVal(){
        System.out.println("value is "+a);
    }
}

public class Child extends Parent{

    //private fields indicate encapsulation
    private int b;
    //Child inherits int a and getVal/setVal methods from Parent
    public void setVal2(int y){
        b = y;
    }
    public void getVal2(){
        System.out.println("value 2 is "+b);
    }
    //having a method with the same name doing different things
    //for different parameter types indicates overloading,
    //which is an example of polymorphism
    public void setVal2(String s){
        System.out.println("setVal should take an integer.");
    }
}
4

4 回答 4

4

有几件事:

  • Getter 方法应该返回值。
  • 重载不同于重载。您可能希望在子类中覆盖 setVal() (或者其他更合适的方法)以演示多态性。

请参见下面的示例。父级实现 fooMethod()。然后,Parent 通过添加 fooMethod(String str) 重载 fooMethod()。将它们视为两个独立的、完全不相关的方法——它们只是碰巧具有非常相似的名称。重载与多态性没有任何关系。

然后子扩展父。Child 最初从 Parent 继承 fooMethod,但在调用 fooMethod() 时它需要不同的功能。所以 Child 用自己的实现覆盖 fooMethod() 。现在当 Child 的对象调用 fooMethod() 时, fooMethod() 的 Child 版本将运行,打印“bar”,而不是“foo”。

public class Parent {
  public void fooMethod() {
    System.out.println("foo");
  }

  public void fooMethod(String str) {  // overloading Parent.fooMethod()
    System.out.println("foo " + str);
  }
}


public class Child extends Parent {
  public void fooMethod() {
    System.out.println("bar");  // overriding Parent.fooMethod()
  }
}
于 2013-02-06T22:02:27.160 回答
4

您的多态性示例只是方法重载,而这实际上并不是面向对象的人们所说的多态性。它们意味着您如何拥有一个公开方法的接口,以及可以实现该方法以具有不同行为 的各种classes实现。interface

看到这个。特别是引言的最后一段。

另外,我建议在代码中展示多态性知识的最佳方式必然包括一些客户端代码,这些代码使用多态性对象来展示它们可以具有不同的,即多态的行为。

于 2013-02-06T22:06:13.227 回答
1

您的覆盖示例不正确(例如,未演示多态性)。

您展示了两个具有不同签名的函数(参数的类型是函数签名的一部分)。仅仅因为它们具有相同的名称并不能使它们成为覆盖的示例。

最重要的是,如果班级孩子有类似的东西

public void setVal(int x){
    a = x+10;
}

这将覆盖其超级(父)类中的 setVal(int) 方法。

然而,展示多态性的更好方法是类似于

Parent guy = new Child();
guy.getVal();
于 2013-02-06T22:02:46.097 回答
1
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
class Parent_1
{
    private int i;//encap
    private int j;

    public  void display() {            
        System.out.println("these are the 2 answer");
    }
}

class child extends Parent_1   //inher
{
    public void display()  //method overiding
    {
        System.out.println("this is for method overriding");
    }

    public void mul(int i, int j)
    {
        int k=i*j;
        System.out.println("mul of 2 int val is:"+k);
    }

    public void mul(double i,double j)  //poly
    {
         double z=i*j;
         System.out.println("mul val of 2 double is:"+z);
    }
}

class Son
{
    public static void main(String args[])
    {
         Parent_1 p=new Parent_1();

         Parent_1 pt=new child();
         child cd=new child();
         p.display();
         cd.mul(2, 20);
         cd.mul(2.2, 1.1);
         pt.display();
    }
}
于 2013-10-17T10:19:25.153 回答