Java:传递对象和值

时间:2017-10-21 10:08:36

标签: java oop

我是网站的新手,我也是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();

2 个答案:

答案 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();

这是由于polymorphismY是一个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