artace.ru - творческий сектор

Название: Шаг 1: Введение в классы и методы на примере L2j_Mobius [Версия для печати]

Автор: Astraliya    Время: 2024-10-16 21:14
Название: Шаг 1: Введение в классы и методы на примере L2j_Mobius
Последний раз это сообщение было отредактировано Astraliya в 2024-10-21 18:00
% h  k; x: D' |+ I4 ?1 I1 Q1 g' h, z; L& l
" h, J) h  T+ k, q
Шаг 1: Введение в классы и методы на примере L2j_Mobius
9 M) q5 I2 A7 y' b2 F7 c( \4 dС статьёй можно ознакомится в разделе Обучение > Читать% Z7 t" N3 k' b, P9 O
9 w/ t3 ^+ r0 `5 \7 o, p' Z
Добро пожаловать в обсуждение первого шага нашего цикла образовательных статей по Java для разработки серверов Lineage 2 на основе сборки L2J_Mobius! В этой ветке вы можете задать любые вопросы по теме классов и методов в Java, обсудить примеры из статьи и поделиться своими наблюдениями.) d; ~: A2 R: l5 f3 c

' S& r2 W; o& C5 I* JОбсуждаем:
+ `1 q) A6 \8 S2 V) v0 u/ b% vНе стесняйтесь задавать вопросы, делиться опытом и помогать другим изучать Java и разработку серверов Lineage 2!
. b- s# s6 n! n' _2 o5 J) J0 S4 f+ K7 r

: y/ `) z4 p9 `$ ]
И помните, если код не работает — значит, это он проверяет, насколько вы упорны! ? Но мы вместе разберемся!6 a$ V9 c- E8 O" b* [
- v1 O/ S! U- Z1 q* k; X, V

& T( i* F* l8 k% T0 s) ~# ]. h7 y$ s+ }9 Q: J( U' e
! I: q" v) b2 d3 t6 B/ `
! D+ y  L& O4 c$ }

Автор: Mike123    Время: 2024-10-17 01:17
Почему мы используем ключевое слово this для ссылки на поля класса?" @' r, T7 v9 I6 s

Автор: Astraliya    Время: 2024-10-17 01:29
Mike123 опубликовал в 2024-10-17 01:172 F. w4 U/ S6 y% Y0 f- k  G: {6 _
Почему мы используем ключевое слово this для ссылки на п ...

, ^2 L: S( D* J% [1 X. YКлючевое слово this в Java используется для ссылки на текущий объект класса. Оно необходимо в тех случаях, когда имена параметров метода совпадают с именами полей класса.1 u1 q! O. w# E+ s& y( C& |# m4 N
Представим, что у нас есть класс Player, у которого есть поле name. Когда мы передаем значение этому полю через конструктор или метод, можно столкнуться с ситуацией, когда параметр метода или конструктора имеет то же имя, что и поле класса.5 _6 E) @# e9 T6 L; B

8 N; _5 @& ^  {; z4 zВот пример:0 V: K8 ?. z& @( {! M7 q4 {
  1. public class Player {
    ; Q2 h) q) J! _! ~
  2.     private String name;
    7 z* M7 R4 ~0 Q# I# C. M
  3. # m9 M. M* ^5 v' P
  4.     // Конструктор: E. {1 E5 V' x
  5.     public Player(String name) {
    " r6 I3 f! U! Z. @% _! q4 f# h
  6.         this.name = name; // Используем this для указания на поле класса$ ]* p+ V1 N) l- R& Z9 w5 m# z
  7.     }# a+ ^: \$ w' c

  8. % K4 Z* P+ C; _1 }+ L
  9.     // Геттер для имени8 Q8 S, v) F; l  s0 L8 E, Y9 D
  10.     public String getName() {2 G1 |0 i6 ~, \5 k: j1 c) M! b$ |3 i: I7 X
  11.         return this.name; // Используем this для обращения к полю класса
    / m( V; l  F! ~7 B! Z9 r
  12.     }6 T3 |# o* P. r: Q1 C
  13. }
    2 w; U) a* L  _; C! I: O& J* c
Скопировать код
В этом примере параметр конструктора и поле класса называются одинаково — name. Чтобы указать, что мы говорим именно о поле класса, а не о параметре метода, мы используем this.name. Это ясно даёт понять компилятору, что мы присваиваем значение параметра name полю класса name., J- I5 n, ?6 N+ u# T

  D) M* L" \8 p7 iКогда необходимо использовать this:8 g# s9 v7 G5 k9 |$ B2 B
Пример передачи this:3 P7 a2 Y( X) p2 s2 @
  1. public class Game {
    9 n( T9 z" C* j( x1 l( j
  2.     public void start(Player player) {
    9 b, W  G6 i6 R/ i1 }
  3.         System.out.println("Игра началась с игроком: " + player.getName());' }. k0 C8 x* q0 q  ?1 s; d- ^
  4.     }7 \! M3 {- y6 \# q/ P8 c3 i
  5. }
    " U7 q( M1 E$ M. R4 D

  6. 9 E; C4 s3 M+ i. `. z$ G" Q
  7. public class Player {( w8 Q( r( O9 S2 C, d; \8 A
  8.     private String name;1 x3 R4 n0 o' B2 x* z
  9. ) w. z+ B0 G! Z$ ]- A4 }! h- A" r
  10.     public Player(String name) {
    3 ^1 E/ Z, W8 r: X5 m. X1 r
  11.         this.name = name;; |- @8 t& x' }
  12.     }. d( ], T3 v, M9 R' h0 k
  13. 6 e3 }! G. s$ A; J
  14.     public void joinGame(Game game) {
    : L, G- i. p7 t! c& R) e; T6 g' P* S, C5 ]7 T
  15.         game.start(this); // Передаем текущий объект Player0 c& T: r$ V1 B# v  i9 ~
  16.     }/ H* C6 Q- ]) c
  17. }/ g7 ^4 B0 l" ?2 h' g9 a( {
Скопировать код
Заключение:Использование this помогает избежать путаницы между параметрами и полями класса и делает код более понятным. Это ключевой инструмент для работы с объектами и методами в Java.& |# Q- F7 K- J. ?


$ Q/ Z5 k! G* A1 Q+ MПомните, если Java кажется сложной, просто представьте, что она — это NPC, которого нужно приручить! ?
* X  [, j$ n3 J" Q- f- _/ ]2 w# H6 U* U. d3 X# S

Автор: Mike123    Время: 2024-10-17 20:05
Добрый день!
" {2 y  r. ]" v+ hКак создаются и вызываются методы в Java? Можешь показать на примере взаимодействия между методами?
Автор: Astraliya    Время: 2024-10-17 20:23
Последний раз это сообщение было отредактировано Astraliya в 2024-10-17 20:24
) V  M6 ]" z3 Z1 t. a% I
Mike123 опубликовал в 2024-10-17 20:05
' A4 t- w' ?1 z& NДобрый день!
# @4 E4 o$ w7 W' `Как создаются и вызываются методы в Java? Мо ...
9 ~/ P9 ~0 u% r" q8 [
Привет, Mike 123! ?. k3 n. j% G& w7 M( q
Отличный вопрос! Давай разберём, как создаются и вызываются методы в Java, на примере из исходников L2J_Mobius. Методы — это один из основополагающих элементов в программировании, и они позволяют нам разбить код на удобные блоки, которые можно многократно использовать.. }9 i$ a) n  O( l- a% N# I6 j0 u- O9 @" f
0 T  v$ s" m( u: W9 J
Для лучшего понимания логики кода и изучения английского языка информация будет подаваться в двуязычном формате. Сначала будет представлен код на английском, а затем — его перевод на русский язык с пояснениями. Такой подход позволит не только разобраться в структуре кода, но и улучшить владение английской технической терминологией.' @, u, h1 R' U3 G; O$ ?
) v' C9 e* v2 p6 H: c
  n3 b7 d9 |. P  r: h) f1 @
Как создаются методы в Java?: s( [% `& c7 ^9 h0 c
5 z8 l) j: x4 X3 ]. |
Методы в Java создаются внутри классов. Вот базовый шаблон метода:
# G  {1 Q' v7 v) I1 F. m3 @' I3 ]" h& B' f4 C
  1. public returnType methodName(parameters) {
      N7 K7 m; _' ?3 `. K: V
  2.     // код метода
    + G) t+ l2 \; |9 p8 U  r) K' c
  3.     return value;
    * o5 F% k* {+ `  m# q
  4. }4 k9 |* ?9 |3 H7 B
Скопировать код
+ w* ~, R) q  S, }" k
Теперь перейдём к примеру.
! g/ Z% s: o$ ^: I5 \: o
1 B$ ]- g% p7 U0 qПример на основе L2J_Mobius с переводомКласс Player.java — создание метода2 ?) F7 M0 U; O9 ?, T" {
  1. public void attack(Npc target) {  // public void атака(Npc цель)
    / y- h. [& ?7 O
  2.     // Вызов метода атаки NPC" z) S0 t7 }) k1 i8 y1 l
  3.     target.receiveDamage(this, calculateDamage());  // цель.получитьУрон(это, рассчитатьУрон());5 H/ K# d9 `' T8 C6 _, s4 F; p
  4. }2 B# L# L' S! {& d, n
Скопировать код
Метод называется attack (атака) и принимает объект Npc в качестве параметра.Внутри метода вызывается другой метод у Npc — receiveDamage (получитьУрон), передавая объект игрока (this — это) и результат расчёта урона (calculateDamage() — рассчитатьУрон()).
: k: Y; ]) R5 ~& ]# s
  F- D& e4 x' v' [4 K( k& e+ s& l% N* v4 M
Класс Npc.java — вызов метода
! D$ }9 e% H  d% O4 y2 f. Y  ]3 p$ U6 o* _" G& O
  1. public void receiveDamage(Player player, int damage) {  // public void получитьУрон(Игрок игрок, int урон)
    1 c5 |) w+ p/ i* @( S$ g
  2.     // Логика получения урона NPC
    , _7 r9 {% j0 f0 v
  3.     this.health -= damage;  // это.здоровье -= урон;
    ; A' N2 z. b# B/ ~
  4.     System.out.println(player.getName() + " нанес " + damage + " урона NPC " + this.getName());  
    9 C" s& c8 R! U: s$ `
  5.     // System.out.println(игрок.получитьИмя() + " нанес " + урон + " урона NPC " + это.получитьИмя());) K( p# L$ t2 B# ~% J+ S
  6.     # o3 r# Z% |: m( N2 W, r" e; ]3 ^4 u
  7.     // Проверка на смерть NPC8 z$ G& x& B2 R) a
  8.     if (this.health <= 0) {  // если (это.здоровье <= 0)
    & a, c# U( `9 x+ ~. `7 ]8 V
  9.         this.die();  // это.умереть();4 V. B$ \8 l/ C, q$ h
  10.     }. W  B* o6 Q0 m. @( Z
  11. }( w' i6 N9 n% d0 m: f) M
Скопировать код
Пример взаимодействия (с переводом)
6 ]) P/ O8 {# J
  1. Player player = new Player("Mike123");  // Игрок игрок = новый Игрок("Mike123");. p7 e0 j' Q6 A9 F3 p! L
  2. Npc goblin = new Npc("Гоблин");  // НПЦ гоблин = новый НПЦ("Гоблин");
    ! o5 q0 e' A* A
  3. , Z+ I9 Y7 W% o* ~4 b) P
  4. // Игрок атакует гоблина
    9 u+ r6 g9 g) h7 K8 P
  5. player.attack(goblin);  // игрок.атаковать(гоблин);$ g9 S/ j6 o7 Q  u2 y5 \0 c) h! v
Скопировать код
акой подход поможет тебе учить английский, а также понять логику кода.
* z) k6 w( m$ {" n7 r: P( ]1 N; L: F1 ^" c

Автор: Mike123    Время: 2024-10-17 20:30
Привет, Астралия! Огромное спасибо за твои разъяснения и помощь! Теперь я начинаю лучше понимать, как работают методы в Java и как они взаимодействуют друг с другом. Мне очень помог твой пример, особенно с переводом на русский — это здорово облегчает процесс изучения.2 P# x! k2 p/ e0 I- [( r& ?
У меня возник ещё один вопрос: какие классы из сборки L2J_Mobius можно использовать для создания базового NPC? Хотелось бы попробовать реализовать простого NPC с минимальным набором функций. Заранее благодарю за ответ!
* T% z7 I' p# q' O. M( U: E
4 z! e: M' M0 T! Q. g; p4 Q
Автор: Astraliya    Время: 2024-10-17 20:57
Mike123 опубликовал в 2024-10-17 20:30
& p2 M( O" B. m7 c& g2 I/ [Привет, Астралия! Огромное спасибо за твои разъяснения ...
- ]% _. `9 r( k* i8 H  h; x
Основные методы, которые используются для NPC в сборке L2J_Mobius, связаны с их взаимодействием с игроками, передвижением, боем и управлением их состоянием. Вот несколько ключевых методов из классов Npc.java и Creature.java, которые ты можешь использовать для создания и управления NPC.; R2 |! I$ R* c7 W. ^- I9 Y& ~
1. getName() и getId()
  1. <blockquote>public String getName() {  // public String получитьИмя()
Скопировать код
2. onAction(Player player)
9 t2 x- ^& Z1 y( E# }; l
  1. public void onAction(Player player) {  // public void наДействие(Игрок игрок)7 |3 p" r* v- r( f3 t# l
  2.     // Логика взаимодействия игрока с NPC( ]7 |* m2 b9 j% E, e# E( K. Z* d( J
  3. }
    / L1 G8 f( f! @; ]& `) X  }1 {, P1 u
Скопировать код
3. moveToLocation(int x, int y, int z)8 w" H2 Y7 k& _: M/ X
  1. public void moveToLocation(int x, int y, int z) {  // public void переместитьсяВ(х, у, z)) v  |, N; J; N7 C& {, t+ {
  2.     // Логика перемещения NPC- ^( F: A4 u' ^2 f+ e0 Y
  3. }7 h& M) E! y5 X( Q- y; o* H- K
Скопировать код
4. attackCharacter(Creature target)6 S0 |4 h, b- p' G# h' r2 `8 l
  1. <blockquote>public void attackCharacter(Creature target) {  // public void атаковатьСущество(Существо цель)
Скопировать код
5. takeDamage(int damage, Creature attacker)
  1. public void takeDamage(int damage, Creature attacker) {  // public void получитьУрон(int урон, Существо атакующий)
    , E( P+ k9 b3 B0 J( h
  2.     this.health -= damage;  // NPC теряет здоровье
    8 ]# @. X& E4 i) F7 M7 m
  3.    
    # B* Z/ V5 b, O; D* }% B# O/ @. s. _
  4.     if (this.health <= 0) {/ M4 Y7 P. q! O
  5.         die();  // Если здоровье упало до 0, NPC умирает
    . J6 v, a) U3 Y* [9 B; E
  6.     }  ]0 Q: U. Y: m$ U
  7. }
    4 C' \1 z- y8 K# h  }6 S
Скопировать код
6. die()
' n& B5 P% X" M# V8 Y0 A! D6 B2 W
  1. public void die() {  // public void умереть()
    8 _, e. x" s% W+ `* s
  2.     // Логика смерти NPC
    5 \7 W7 [9 Z5 @7 v) T9 D
  3. }
    / D! Q6 N# s: ?( |7 w
Скопировать код
7. isDead()
) M; @. T$ g2 A5 b- ~; L2 z! X& [6 l7 ~( e1 t/ |- p
  1. public boolean isDead() {  // public boolean мертв()
    , ~3 r8 T  D$ d6 ], F" D* q$ b
  2.     return this.health <= 0;  // Возвращает true, если здоровье <= 0
    4 S+ y) S9 z/ Y, z% j5 W
  3. }) e" ^& u2 f1 w% g
Скопировать код
8. heal(int amount)
" |$ @# C% y* e# I1 T4 p
  1. public void heal(int amount) {  // public void вылечить(int количество)0 Z2 ^/ D/ W! B+ I& o( {3 j
  2.     this.health += amount;  // Увеличиваем здоровье4 v3 p% O/ ?) c8 H
  3.     4 @5 A5 T8 L6 N0 g" k
  4.     if (this.health > this.maxHealth) {
    8 \* Z& [# x% R( R4 m7 |, j
  5.         this.health = this.maxHealth;  // Здоровье не может быть больше максимального
    2 Y& x+ f: _1 X' i4 V
  6.     }7 _5 x6 Z! I& B1 Z* e& n2 }: N7 @
  7. }
    , k% z/ d9 t+ L7 {# e; D. `
Скопировать код
9. doCast(Skill skill)
  ]9 ?4 T+ B" f$ e0 c) ]
  1. public void doCast(Skill skill) {  // public void использоватьЗаклинание(Умение скилл)
      y* t- _+ n7 u4 U4 j
  2.     // Логика применения скилла NPC5 b: |* X, V$ I. \. k' u2 ^
  3. }
    $ B' P3 r+ _6 c
Скопировать код
10. onInteract(Player player)
9 F1 M% r6 s$ G$ C( s' M
  1. ( t4 t" N$ k' X2 c; D" A; O' `6 K  j
  2. public void onInteract(Player player) {  // public void наВзаимодействие(Игрок игрок)5 R6 L* l! C" n8 `+ G
  3.     // Логика взаимодействия с NPC
    $ S7 Q4 h; z7 e' ?) d. ^% s
  4. }
    1 w+ v# t* B& j5 z' u+ b
Скопировать код
11. showChatWindow(Player player)
5 C+ p( M, }& t2 F: ?- H2 A) X  L, r' M
  1. public void showChatWindow(Player player) {  // public void показатьОкноДиалога(Игрок игрок)
    # G3 t" @. N& E) x2 M# L0 \
  2.     // Логика открытия окна диалога
    & M. I/ C5 W7 v& H& V6 F
  3. }
    1 {, f) b+ K# f6 `0 R6 Q
Скопировать код
ЗаключениеЭти методы помогут тебе создать функционального NPC, который может взаимодействовать с игроками, получать и наносить урон, двигаться, использовать заклинания и вести диалоги. Ты можешь начать с базового NPC и постепенно добавлять ему новые функции, используя указанные методы.
$ ~8 d9 A1 K' c$ s' @' p0 m- o4 g! t0 uЕсли тебе нужны примеры кода или более детальные разъяснения — не стесняйся, спрашивай!
5 g+ E# E, A1 w
8 d, M1 y: |  P' O% {0 K# w" h
. v( P5 g  e- w* |& E# S8 u8 S8 A! q% y, w& G
6 l/ |" T9 D: {6 L- C8 G





Добро пожаловать artace.ru - творческий сектор (https://www.artace.ru/) Powered by Discuz! X3.5