我是网站的新手,我也是Java的初学者,我很感谢有人在下面的问题中向我解释一些事情,请原谅我的知识。
哪个语句导致编译错误?
class X{
void f1() { System.out.println("XXX"); }
}
class Y extends X{
void f1() { System.out.println("YYY"); }
}
class Z extends X{
void f1() { System.out.println("ZZZ"); }
}
public class Testing {
static void g(X a)
{ a.f1(); }
public static void main(String args[]){
Y y = new Y(); // s1
g(y); // s2
Object obj = new Y(); // s3
obj.f1(); // s4
X x = new Z(); // s5
x.f1(); // s6
}
}
有些事让我感到困惑:
1- static void g(X a)它是一个名为g的方法,并取X作为第一个类,并将“a”作为参数?他们为什么不被昏迷分开?什么是“a”和a.f1();?
2- g(y);这是将y对象传递给方法g吗?它与挑衅有什么不同?例如y.g();
3-我知道要首先创建一个对象,你需要选择类型(类名),然后选择该对象的名称,然后将其分配给“new”,并在“new”之后再分配相同的类型。为什么这些在“新”之后还有另一种类型?
Object obj = new Y();
X x = new Z();
答案 0 :(得分:0)
1- static void g(X a)它是一个名为g的方法,取X即为 第一类,也把“a”作为参数?为什么不是他们 被昏迷分开?什么是“a”和a.f1();?
static void g(X a)
声明一个方法(称为“g”),它接受一个参数(类X )
名为a
。在该方法中,您将使用其名称引用该对象, “a”,因此a.f1 ();
只是在f1 ()
上调用类X
中定义的a
方法。
克(Y);这是将y对象传递给方法g吗?它有什么不同 从挑衅?例如y.g();
第一部分显然是正确的。它与g ()
上的调用方法y
不同,只有在g ()
类中声明了一个名为Y
的方法,但才会定义g ()
在Testing
班。
3-我知道要先创建一个对象,你需要选择类型 (类名)然后该对象的名称,然后将其分配给“新”和 在“新”之后又是同一类型。为什么这些之后有另一种类型 “新”?
对象obj = new Y();
X x = new Z();
这是由于polymorphism。 Y
是一个Object
(而Z
是一个X
),因此您可以将该引用分配给其超类的对象。
但f1 ()
类中未定义Object
方法,因此即使s4
变量的运行时类型为obj
,您的Y
也不合法}。
你可以写:
((Y) obj).f1();
这是合法的:你将obj转换为类Y
,这将编译,但如果obj
不是Y
类型(或子类),则转换将在运行时失败Y
)。
答案 1 :(得分:0)
static void g(X a)它是一个名为g的方法,它取X作为第一个类,并将“a”作为参数?他们为什么不被昏迷分开?什么是“a”和a.f1();?
g(X a)
是一种将X
的实例作为参数的方法。参数名称为a
,参数类型为X
。
g(y);
这是将y对象传递给方法g吗?它与挑衅有什么不同?例如y.g();
是的,您确实已将y
传递给g
。如果您撰写了y.g()
,则说要调用g
中声明的名为Y
的方法。但g
中没有Y
方法,因此会导致编译错误。
我知道要首先创建一个对象,然后选择类型(类名),然后选择该对象的名称,然后将其分配给“new”,并在“new”之后再分配相同的类型。为什么这些在“新”之后还有其他类型?
第一种类型是变量的类型,是变量声明的一部分。变量声明如下所示:
Type name;
第二种类型(单词new
之后的那个)是构造函数调用的一部分。构造函数调用基本上是告诉计算机“请创建此类型的新实例”。您编写的这两种类型可能不同,如下所示:
X obj = new Y();
因为Y
的实例可以放入X
类型的变量,因为Y extends X
。