Java抽象和接口
我已经有相当长的一段时间没有处理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
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)