Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java抽象和接口_Java_Interface_Static_Abstraction - Fatal编程技术网

Java抽象和接口

Java抽象和接口,java,interface,static,abstraction,Java,Interface,Static,Abstraction,我已经有相当长的一段时间没有处理Java抽象和/或接口了,但我现在回到它来做一个项目,有些事情让我感到不安。下面是我的代码片段 public class A { private static String name = "None"; private static String description = "No description"; public A() {} public A(User user) { user.setData(th

我已经有相当长的一段时间没有处理Java抽象和/或接口了,但我现在回到它来做一个项目,有些事情让我感到不安。下面是我的代码片段

public class A {

    private static String name = "None";
    private static String description = "No description";

    public A() {}

    public A(User user) {
        user.setData(this);
    }

    public static String getName() {
        return name;
    }

    public static String getDescription() {
        return description;
    }

}

public class B extends A {

    private static String name = "B";
    private static String description = "This is B";

    public B() {}

    public B(User user) {
        super(user);
    }

}

public class User {

    private A a;

    public void setData(A a) {
        this.a = a;
    }

    public A getData() {
        return a;
    }

}
当我使用
B.getName()
时,我希望它返回
“B”
,但它却返回
“None”

现在我显然做错了什么,四处搜索也没什么帮助。我很肯定这是有可能的,除非我被另一种语言弄糊涂了


有人能给我指一下正确的方向吗?谢谢。

欢迎再次回到Java。 在类A和B中使用静态变量。这些变量和类而不是对象相关联


如果更改方法以从用户处获取名称,它将按预期工作。

欢迎再次使用Java。 在类A和B中使用静态变量。这些变量和类而不是对象相关联


如果更改方法以从用户处获取名称,它将按预期工作。

您在类B上调用了getName方法。B没有名为getName的静态方法,因此它会在超类a中查找它,而超类a中有

也许你认为B的名字会取代A的名字?变量不会被重写。A正在访问A上定义的静态变量名,而该方法最初是在B上调用的,这并不影响


继承和静态方法不能很好地协同工作。像多态性这样的OO概念依赖于运行时调度,单词
static
应该暗示与此相反的含义。使用多态性,程序在高抽象级别工作,通过超类型引用对象,并让子类解决细节问题。对于静态方法,您必须引用希望调用该方法的特定子类,因此您没有该抽象级别。

您在类B上调用了getName方法。B没有名为getName的静态方法,因此它在超类a中查找它,而超类a中有

也许你认为B的名字会取代A的名字?变量不会被重写。A正在访问A上定义的静态变量名,而该方法最初是在B上调用的,这并不影响


继承和静态方法不能很好地协同工作。像多态性这样的OO概念依赖于运行时调度,单词
static
应该暗示与此相反的含义。使用多态性,程序在高抽象级别工作,通过超类型引用对象,并让子类解决细节问题。对于静态方法,您必须引用希望调用该方法的特定子类,因此您没有那种抽象级别。

您需要重写方法getName():


您需要重写getName()方法:


您面临的问题在于方法
getName
getDescription
的定义:它们在类
A
中定义为静态成员。这意味着,即使在调用
B.getName()
时,实际调用也是
A.getName()
,并且
name
的静态成员变量值设置为
None

在考虑继承时,必须小心声明为静态的内容。这与接口或抽象类无关

public class A {

    protected String name = "None";
    protected String description = "No description";

    public A() {}

    public A(User user) {
        user.setData(this);
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

}

public class B extends A {

    public B() {
      name = "B";
      description = "This is B"
    }

    public B(User user) {
        super(user);
    }

}

public class User {

    private A a;

    public void setData(A a) {
        this.a = a;
    }

    public A getData() {
        return a;
    }

}
使用
protected
关键字,您可以从扩展类访问字段

另见:


您面临的问题在于方法
getName
getDescription
的定义:它们在类
A
中定义为静态成员。这意味着,即使在调用
B.getName()
时,实际调用也是
A.getName()
,并且
name
的静态成员变量值设置为
None

在考虑继承时,必须小心声明为静态的内容。这与接口或抽象类无关

public class A {

    protected String name = "None";
    protected String description = "No description";

    public A() {}

    public A(User user) {
        user.setData(this);
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

}

public class B extends A {

    public B() {
      name = "B";
      description = "This is B"
    }

    public B(User user) {
        super(user);
    }

}

public class User {

    private A a;

    public void setData(A a) {
        this.a = a;
    }

    public A getData() {
        return a;
    }

}
使用
protected
关键字,您可以从扩展类访问字段

另见:


    • 在课堂上要注意以下几点:

    • 名称和描述在A和B中都是静态变量
    • getName是应用程序中的静态方法

    • 静态变量绑定到类,静态方法不能被重写

      在类中需要注意的几点:

    • 名称和描述在A和B中都是静态变量
    • getName是应用程序中的静态方法

    • 静态变量绑定到类,无法重写静态方法这是预期的行为,因为类A的getName()方法可以访问其自身类的成员变量“name”它是,因为名称是静态的,即使您将其设置为非静态的,并且按照下面的代码段所示访问它,它也会返回“无”。记住,只有方法被重写,而不是成员变量。所以B类的“名称”并没有覆盖A类的“名称”


      另外,如果您想将“B”作为输出,请在类B中重写类A的getName()方法,并使方法和变量非静态。

      这是预期的行为,因为类A的getName()方法可以访问其自身类的成员变量“name”它是,因为名称是静态的,即使您将其设置为非静态的,并且按照下面的代码段所示访问它,它也会返回“无”。记住,只有方法被重写,而不是成员变量。所以B类的“名称”并没有覆盖A类的“名称”


      另外,如果要将“B”作为输出,请重写类B中类A的getName()方法,并使方法和变量成为非静态的。

      静态字段不是这样工作的。静态字段不是这样工作的。
          B b = new B();
          System.out.println(b.getName()); --> "None" ("name" is non-static)
        ----------------------------------------------
          System.out.println(B.getName()); --> "None"  ("name" is static)