【问题标题】:Java class with Interface member variable and member method behave differently. Please explain具有接口成员变量和成员方法的 Java 类的行为不同。请解释
【发布时间】:2020-06-07 12:25:37
【问题描述】:

接口和一个类Number1,后来的Number2等。 当我尝试在方法add() 中使用成员数据时,它要求我首先将其转换为类类型。 但是,如果我在方法add() 中使用成员方法,则不需要我强制转换为类类型。 任何解释将不胜感激。

附上以下代码。


    package mynums;
//Interface for all my number types, Number1, Number2 (not shown), etc
public interface NumberIF
{

    public int getNum();

    public void setNum(int numx);

    //I will have other types of numbers not just Number1.
    //I will have Number2, etc.
    public void add(NumberIF f1, NumberIF f2);
    public void print();
}


    package mynums;
//There will be other types of numbers Number2, Number3
//all doing these operations but different.
//This is just to test the concept.
//But I have a problem here.
public class Number1 implements NumberIF
{
    private int num;

    public Number1()
    {
        num = 1;
    }

    public Number1(int numx)
    {
        num = numx;
    }

    public int getNum()
    {
        return (num);
    }

    public void setNum(int numx)
    {
        num = numx;
    }

    public void add(NumberIF f1, NumberIF f2)
    {
        int numt;

        /**
         * Why to use member variables I must specify the type of class.
         * Why to use member method I do not have to specify type of class.
         */

        //numt = f1.num + f2.num;  ERROR

        // either one works
        //Why accessing member data is different from accessing member method.
        numt = ((Number1)f1).num + ((Number1)f2).num;
        numt = f1.getNum() + f2.getNum();

        num = numt;

    }

    public void print()
    {
        System.out.println(num);
    }

    static public void main(String[] args)
    {
        Number1 f1, f2, f3;

        f1 = new Number1(1);
        f2 = new Number1(2);
        f3 = new Number1(0);

        f3.add(f1, f2); // 1 + 2= 3
        f3.print();
    }
}

【问题讨论】:

  • f1NumberIF 类型,它没有成员 private int num
  • @markspace 你能否验证我的理解和语言。我不能做 f1.num 因为(NumberIF 类型)没有成员变量 num。但是一旦我将它转换为 Number1,我就可以执行 ((Number1) f1).num, bc Number1 has .num。我可以做f1.getNum(),bc interface NumberIF有getNum() //虽然只是半熟//,即抽象未实现。

标签: java interface polymorphism class-members


【解决方案1】:

Java 是一种静态类型的语言。

静态类型NumberIF 的变量不一定指向Number1 类型的对象,因此这些对象可能没有num 字段。

您只能使用变量的静态类型(及其超类型)的成员。

【讨论】:

  • 感谢它的帮助。我想我不能让你的答案成为“选择的答案”,因为我的声誉很低。两个答案都有帮助。如果您知道我如何选择此作为答案,您可以给我发送私人电子邮件,以便我下次知道。
猜你喜欢
  • 2011-08-04
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 2012-03-07
  • 2011-01-01
  • 1970-01-01
相关资源
最近更新 更多