2015-04-16 2 views
1

Недавно я задал вопрос о том, почему все мои переменные в порожденных предметах были установлены на одинаковое значение урона (Java switch statements outputting the same numbers), и этот код не был виноват, однако после некоторой глубокой отладки у меня есть обнаружил, что, когда предмет порожден, он рандомизирует повреждение, а затем по какой-то причине устанавливает, что повреждение каждого ранее созданного элемента того же типа.Неизвестная проблема родительской переменной в java

У меня есть классы «кинжал» и «меч», которые расширяют мой класс «предмет». Это, как я установить повреждение:

case 3: {Sword sword = new Sword(); World[X][Y].treasureName = "sword"; sword.setDamage(4); returnItem = sword; break;} 

И это мой деталь класс:

public abstract class Item { 
//How much damage is added to the players attack. 
static int damage = 0; 
static int defence = 0; 

public int getDefence() { 
    return defence; 
} 

public void setDefence(int defenceValue) { 
    defence = defenceValue; 
} 

public int getDamage() { 
    return damage; 
} 

public void setDamage(int damageValue) { 
    damage = damageValue; 
} 
} 

И меч мой класс:

public class Sword extends Item { 
//How much damage is added to the players attack. 
static int damage = 0; 
static int defence = 0; 

public int getDefence() { 
    return defence; 
} 

public void setDefence(int defenceValue) { 
defence = defenceValue; 
} 

public int getDamage() { 
    return damage; 
} 

public void setDamage(int damageValue) { 
    damage = damageValue; 
} 
} 

Я не уверен, что эта проблема и не уверен, что Google еще довольно новичок. Я попытался переопределить класс item, но ничего не изменил, и я прочитал о наследовании, и я не понимаю, какая часть устанавливает каждый экземпляр другого оружия одинаковым образом. Я хотел удалить методы в классе «Item», чтобы убедиться, что это исправит, однако другой код, вызывающий ошибки, помешал мне сделать это при проверке и суммировании ущерба всем детям «Item» - для этого требовалось приведение (Item), и я не уверен, что еще я могу использовать в качестве актера.

Вот направления к методу «Item»:

if (((Item) World[k][i].treasure).getDamage() > 9) 
          { 

Без актерского ошибка является: getDamage() не определено для типа объекта. и:

//Recalculates the players damage for recently equipped items. 
     for (int i = 0; i < numItems; i++) { 
      itemdamage += items[i].getDamage(); 
      System.out.println("You have a " + itemNames[i] + " giving you " + items[i].getDamage() + " extra damage."); 
      } 

Что случилось? Я хочу понять это, поэтому ссылки на полезную информацию о том, почему, и что я делаю неправильно, было бы хорошо. Благодарю.

+4

вы знаете, что 'static' на самом деле означает ли? :) –

ответ

5
static int damage = 0; 

Наличие статического члена означает, что все объекты класса имеют одинаковое значение. Если вы удалите ключевое слово static, каждый объект будет иметь другое значение для повреждения.

Что касается требуемого литья, кажется, что World представляет собой массив из Object. Поэтому World[k][i] имеет тип Object, и вы можете вызвать только методы базового класса Object. Если вы хотите вызвать метод, определенный в классе Item, вы должны наложить Object на Item (при условии, что тип времени выполнения Object - это Item).

+0

Это было так просто! Ahh спасибо за помощь там всем. –

2

Вы задаете переменные damage и defence (орфографическая ошибка здесь - между прочим) будет static. Это означает, что для всего класса имеется только одна копия каждой переменной.

Удалить ключевое слово static перед объявлением обеих переменных - и он сделает любой новый экземпляр меча (объект) - нести свои собственные damage и defence.

+0

О, я должен был как-то пропустить это, читая материал: s - Также я австралиец, и так мы заклинаем защиту. : p –

+0

@FluidicIce, тогда я определенно не должен пытаться исправить ваш английский (так как это * не * мой родной язык :) – alfasin

1

По ошибке:

getDamage() не определено для типа объекта

Я думаю, что вы World массив представляет собой массив Object вместо Пункт

Не могли бы вы показать нам, как вы управляете World массив?

+0

Это было что-то еще, что меня смутило, на самом деле массив World настроен так: static MapSquare [] [] World = new MapSquare [mapSizeX] [mapSizeY]; Объект mapsquare имеет переменную: «Treasure», которая хранит добычу в этой комнате. Поэтому я должен был бы назвать World [x] [y] .treasure.getDamage(); Чтобы получить урон от предмета на площади. –

+0

Сокровище расширяет предмет? – Vyncent

+0

Нет, это не сокровище. –

4

Ваши damage и defense переменными не должно быть static. Переменная static привязана ко всему классу, а не к одному экземпляру класса. Таким образом, когда вы вызываете setDamage(), хотя метод является методом экземпляра, он обновляет статическую переменную, которая совместно используется каждым существующим экземпляром.

Удалите static (вы имели в виду использовать protected?), И вы не увидите «по какой-либо причине, который наносит ущерб всем ранее созданным элементам того же типа».

См. What does the 'static' keyword do in a class? для получения дополнительной информации. Вот официальный Java Language Specification on static fields, а также.

2

Heyhey Жидкостная,

Я все еще достаточно новое для Java сам, но я думаю, ваша проблема в том, что ваши переменные повреждения устанавливаются в статическом (и я предполагаю, проблема будет сохраняться по вашей статистике обороны, а также !)

У меня была эта проблема во время обучения на C++. Я бы изменил значение одного из моих конструкторов, который ссылался на статическую переменную, и все экземпляры изменились бы. Это константа, принадлежащая самому классу, а не объекту.

Так что происходит, когда вы меняете значение урона; все ссылки, которые используют эту переменную статического урона, изменяются.

Этот сайт дает представление о статических переменных! http://www.javatpoint.com/static-keyword-in-java

Lemme знает, если это поможет!

Энди

+0

Ах да, спасибо за это, это была действительно проблема, но кто-то избил вас: p) Теперь я знаю, что я использовал GM перед java, поэтому теперь понимаю, что это в основном как глобальная переменная. Спасибо за комментарий. –

Смежные вопросы