Java示例包含封装,多态和继承?

时间:2013-02-06 21:56:05

标签: java inheritance polymorphism encapsulation

我需要使用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 个答案:

答案 0 :(得分:4)

有几件事:

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

请参阅以下示例。父实现fooMethod()。然后,Parent通过添加fooMethod(String str)来重载fooMethod()。将这些视为两个完全不相关的方法 - 它们恰好具有非常相似的名称。重载与多态无关。

然后Child扩展Parent。 Child最初从Parent继承fooMethod,但是在调用fooMethod()时它需要不同的功能。所以Child用自己的实现覆盖了fooMethod()。现在,当Child的一个对象调用fooMethod()时,将运行子版本的fooMethod(),打印“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()
  }
}

答案 1 :(得分:4)

您的多态示例仅仅是方法重载,实际上并不是面向对象的人通过多态的意思。它们意味着您可以拥有一个公开方法的接口,并且实现classes的各种interface可以实现该方法具有不同的行为。

this。最后一段特别介绍。

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

答案 2 :(得分:1)

你的覆盖示例是不正确的(例如,不表示多态)。

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

如果班级孩子有类似

的话,那就是覆盖
public void setVal(int x){
    a = x+10;
}

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

然而,证明多态性的更好方法将是

Parent guy = new Child();
guy.getVal();

答案 3 :(得分: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();
    }
}