В вашем примере вы фактически не устанавливаете имя игрока на Джона, вы создаете объект с именем Джон.
Чтобы исправить это, объявите поле в вашем классе Player
:
public class Player {
String name;
public Player(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Теперь вы можете создать столько игроков, сколько захотите, и назвать их:
Player player = new Player("John");
Когда вы хотите получить имя игрока, просто вызовите функцию getName()
.
Если вы хотите установить имя игрока, просто вызовите метод setName()
.
Чтобы напечатать имя игрока на консоли, используйте это:
System.out.println(player.getName());
Или вы можете переопределить метод toString()
из Player
, чтобы предложить текстовое представление объекта, в этом регистр только имя игрока:
@Override
public String toString() {
return "Player[name=" + name + "]";
}
Тогда вы можете использовать:
System.out.println(player); // toString() is called if player != null
Нет никакого различия в способе, которым вызов заданной функции появился бы в коде C. Единственная разница была бы в объявлении функции. Руководство GCC имеет больше деталей.
$ cat fastcall.c
extern void foo1(int x, int y, int z, int a) __attribute__((fastcall));
extern void foo2(int x, int y, int z, int a);
void bar1()
{
foo1(99, 100, 101, 102);
}
void bar2()
{
foo2(89, 90, 91, 92);
}
$ gcc -m32 -O3 -S fastcall.c -o -
.
.
bar1:
.
.
movl $100, %edx
movl $99, %ecx
movl $102, 4(%esp)
movl $101, (%esp)
call foo1
.
.
bar2:
.
.
movl $92, 12(%esp)
movl $91, 8(%esp)
movl $90, 4(%esp)
movl $89, (%esp)
call foo2
Вот несколько ссылок
Действительно ли возможно убедить GCC подражать fastcall соглашению о вызовах?