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

标签 java class compilation extending

我和我的同学(计算机科学第一年)正在努力解决问题类(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/

相关文章:

python - python中的内部类评估顺序

java - 单例类每次都返回新实例

apache-flex - Intellij/Flex 4.91编译问题

Java二维数组乘法错误?

java - 当java编译器输出错误时如何使管道失败

c# - 使用其他类的类字段

gradle - Gradle无法编译。库寻找不相关的可绘制对象

java - 升级和比较

java - 如何通过java程序监控安装过程?

c++ - 新类型可能未在返回类型中定义 - C++