- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我和我的同学(计算机科学第一年)正在努力解决问题类(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/
我有这个 html 代码: HELLO WORLD! X V HELLO WORLD! X V 我想按 X(类关闭)将父 div 的高度更改为 20px 并显示 V(类打开),但在每个 d
在会计应用程序的许多不同实现中,有两种主要的数据库设计方法来保存日志和分类帐数据。 只保留 Journal 信息,然后 Ledger 只是 Journal 的一个 View (因为 journal 总
我想在另一个子里面有一个子, sub a { sub b { } } 我想为每次调用 sub b 创建一个新的 sub a 实例。有没有办法在 Perl 中做到这一点? 当我运行上面的
我有一些代码正在查找重复项并突出显示单元格: Private Sub cmdDups_Click() Dim Rng As Range Dim cel As Range Set Rng = ThisW
可能有一个简单的解决方案,但我很难过。 我有一个包含一个 ID 字段的主表。在两个可能的字段中有一个具有该 ID 的子表。想象一个由选手 A 和选手 B 组成的 double 队。Master 表将有
假设我有一个包含对象的数组: [ { "id": "5a97e047f826a0111b754beb", "name": "Hogwarts", "parentId": "
我正在尝试对 MySQL 数据库表执行一对父/子模型的批量插入,但似乎无法使用标准的 ActiveRecord 功能来完成。所以,我尝试了 activerecord-import gem,但它也不支持
我有一个带有多个子类的父抽象类。最终,我希望通过 GUI 中的进度条显示子类中完成的进度。 我目前所做的,我意识到这是行不通的,是在父类中声明为每个子类将覆盖的虚拟方法的事件方法定义。所以像: pub
是否可以通过键数组在对象中设置变量?例如我有这个对象: var obj = {'outer': {'inner': 'value'} }; 并希望设置由键数组选择的值: var keys = ['ou
我有一个名为 companies 的 MySQL 表,如下所示: +---------+-----------+-----------+ | id_comp | comp_name | id_pare
我正在尝试使用 sublime text 在 sublime text 上的 ionic 上打开我的第一个应用程序。它给了我一个“找不到命令”的错误。如何修复? 我试过这些命令: sudo rm -r
不好意思问,但我正在使用 webapp2,我正在设计一个解决方案,以便更容易定义路由 based on this google webapp2 route function .但这完全取决于能够在子级
我有代表树的数字字符串(我不知道是否有官方名称): 012323301212 上面的例子代表了 2 棵树。根用 0 表示。根的直接子代为“1”,“1”的直接子代为“2”,依此类推。我需要将它们分组到由
是否可以在当前 Activity 之上添加 Activity 。例如,假设我单击一个按钮,然后它将第二个 Activity 添加到当前 Activity 。而第二个 Activity 只覆盖了我当前
我很难思考如何为子资源建模。 以作者的书籍为例。你可以有 N 本书,每本书只有一位作者。 /books GET /books POST /books/id PUT /books/id DELETE 到
有人可以向我解释以下内容(python 2.7) 来自已解析文件的两个字符串数字: '410.9''410.9 '(注意尾随空格) A_LIST = ['410.9 '] '410.9' in '41
背景 在 PowerShell 中构建 hash table 是很常见的通过特定属性快速访问对象,例如以 LastName 为基础建立索引: $List = ConvertFrom-Csv @' I
我真的很难弄清楚如何调用嵌套 Polymer Web 组件的函数。 这是标记: rise-distribution组件有 canPlay我想从 rise-playlist
我写了一个小工具转储(以 dot 格式)一个项目的依赖关系图,其中所有位于同一目录中的文件都聚集在一个集群中。当我尝试生成包含相应图形的 pdf 时,dot开始哭: 命令 dot -Tpdf trim
给定一个 CODE ref,是否可以: 访问该 CODE ref 的解析树 通过指定 CODE ref 的解析树来创建一个新的 CODE ref,该解析树可以包含在 1 中返回的解析树的元素 通常我们
我是一名优秀的程序员,十分优秀!