gpt4 book ai didi

java - 类和子类 - 您如何跟踪它们?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:25:38 26 4
gpt4 key购买 nike

我和我的同学(计算机科学第一年)正在努力解决问题类(class)和子类(class)。我们有一个测试,其中一个问题检查类、子类、它们之间的合法和非法转换等的理解。问题通常是相同的:给定 2-3 个名为 A、B、C 的类,其中一些扩展了其他类,然后是不同的构造函数和 10-15 行非常令人困惑的代码,我们需要在它们中的每一个上判断它是否会导致其中一个下列的:1. 运行时错误。2.编译错误。3. 将运行(将打印出什么)。

测试只是纸质的。问题是,您有跟踪不同类和变量的方法吗?有教授这些科目的网站吗?

这是之前测试的问题:下面哪行代码会导致编译错误,运行时错误,会打印出什么:(我加了解决方法)

A a = new A(1,2); 
B b = new B(1,2,3);
C c = new C(1,2);
A bb = (A) b;
A a1;
A a2 = null;
System.out.println("Hello world"); //"Hello World
System.out.println(Hello world); //Compilation error
System.out.println(1/0); //Runtime Error
a = b; //Will run with no errors
a.equals(a1); //compilation error
System.out.println(a.equals(a2));//will print false.
System.out.println(b.equals(c)); //will print true.
B aa = (B) a; //runtime error.
C bbb = (C) bb; //runtime error
C ccc = (C) b; //compilation error
a.m1(); //will print m2
b.m1(); //will print 3
c.m3(); //will print 2.
a.m5(); //will print false

A 类:

 public class A { 
private int x;
public int y;
private C c = null;
public A(int x,int y){
this.x = x;
this.y = y;
}
public void m1() { m2();}
public void m2() {
System.out.println("m2");
}
public void m3(){ m4(); }
public void m4() {
A tmp = new B(1,2,3);
System.out.println(tmp.y);
}
public void m5() {
System.out.println((new C().equals(c)));
}
public boolean equals(Object other) {
if(!(other instanceof A)) return false;
return (((A)other).x==x &
((A)other).y==y);
}
}

B 类:

public class B extends A { 
public int y;

public B(int x, int y1, int y2){
super(x,y1);
this.y = y2;
}

public void m2(){
m3();
}

public void m4() {
B temp = new B(1,2,3);
System.out.println(temp.y);
}
}

C 类:

public class C extends A { 
public int y;
public C(int x, int y){
super(x,y);
this.y = y;
}

public C(){
this(0,0);
}
}

我知道它很长,但我希望您了解问题的类型...我不是在寻找答案,而是试图帮助我理解概念和思考问题的方法。我们正在努力解决的主要问题是当您扩展一个类,然后在其中调用一个方法时,该方法在子类中调用另一个方法等等……跟踪所有这些都很困难。多谢,巴拉克

最佳答案

编译错误通常发生在您的语法不正确,或者您没有正确实例化对象时。

println(Hello World) 是一个编译错误,因为 Hello 和 World 试图引用尚未实例化的变量 Hello 和 World。要解决这部分,你可以在上面说 String Hello = "Hello"; String World = "世界";那将解决实例化错误。但这在语法上也是不正确的。如果一个函数有多个参数,它们必须用逗号分隔。要更正这部分,println(Hello + World)。这会将 2 个字符串放在一起以构成一个参数“HelloWorld”,该参数在 println() 函数中使用。

a = b 是可以的,因为两者都已经实例化并且因为继承。将继承视为“是一个”,因此当 B 扩展 A 时,您可以说“B 是一个 A”。使用另一个例子,一个形状(A)和一个圆(B)你可以说“圆是一个形状”

a.equals(a1);是一个编译错误,因为 a1 还没有被实例化。实例化一个对象,需要用到“new”这个词

System.out.println(a.equals(a2));为假,因为 equals 函数首先检查 a2 是否"is"A。它是,所以它检查 x 和 y 是否为相同的值。它们不是因为 a 的 x 和 y 已设置,但 a2 只是一个空对象。

System.out.println(b.equals(c));是真的,因为“c 是 A”所以它检查 b 和 c 的 x 和 y。它们是 1 和 2,所以这是真的。

B aa = (B) a; a 已经被实例化,并且它在语法上是正确的,所以它通过了编译。但是,您可以说“B 是 A”,但不能说“A 是 B”,就像您在尝试运行时不能说“Shape is a Circle”一样,它会注意到并给出运行时错误。 C bbb = (C) bb;是一样的,因为 bb 是一个 A 对象。

a.m1();//将打印 m2。函数 m1() 执行的第一个(也是唯一一个)命令是调用 m2()。这打印“m2”。所以当你调用 a.m1() 时,它与直接调用 a.m2() 是一样的。

b.m1();//将打印 3。因为 B 覆盖了 m2() 和 m4() 函数,它调用 m1() -> m2() -> m3() -> m4() 和 m4() 创建一个变量并打印它的 y值(value)。 B(x,y1,y2) 的构造函数设置 x = x; y = y1; (来自 super(x,y1) 函数)然后用 y2 覆盖 y。

c.m3();//将打印 2。这令人困惑。和上一个一样,这个调用 m3() -> m4()。因为 C 不会覆盖它们中的任何一个,所以它使用 A 定义的那些。A 的 m4() 从新的 B(1,2,3) 创建 A。 B 对象的 y 值被 y2(3) 覆盖,但由于 A 的 x 值是私有(private)的,B 构造函数无法触及 A 的 x 值,因此无法覆盖它。

a.m5();//将打印 false 与 "System.out.println(a.equals(a2));"相同多于。 A 的 c 值为 null,并且 C 有一个不带参数的构造函数 C() 调用 C(0,0)。空 C 与已实例化的 C 对象不同。

我希望这至少是您正在寻找的东西的一个良好开端,我希望我的解释是有意义的。有时很难在过度解释(太多的话会造成混淆)和解释不够之间找到平衡点。如果您需要更多说明,请发表评论。

已编辑 - 我在 c.m3() 部分添加了一些关于私有(private)变量 x 的内容

关于java - 类和子类 - 您如何跟踪它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21890497/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com