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

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

Автор: Astraliya    Время: 2024-10-16 21:14
Название: Шаг 1: Введение в классы и методы на примере L2j_Mobius
Последний раз это сообщение было отредактировано Astraliya в 2024-10-21 18:00 $ ^3 ^* j3 b7 u( ^

9 Q: b, w9 Q4 d' K/ ~0 O# O9 B2 R: N6 c) r
Шаг 1: Введение в классы и методы на примере L2j_Mobius& y# _% x" p' g" ~5 K! F; E
С статьёй можно ознакомится в разделе Обучение > Читать
% n( A8 ~9 t6 J' ~, |: B! N4 G. ]6 l( L
8 |. M( q* L7 BДобро пожаловать в обсуждение первого шага нашего цикла образовательных статей по Java для разработки серверов Lineage 2 на основе сборки L2J_Mobius! В этой ветке вы можете задать любые вопросы по теме классов и методов в Java, обсудить примеры из статьи и поделиться своими наблюдениями.
! ^3 e6 l( w+ J3 I+ e# u6 \: [) s, v
Обсуждаем:/ R3 z  A% b- a$ @5 Z, a
Не стесняйтесь задавать вопросы, делиться опытом и помогать другим изучать Java и разработку серверов Lineage 2!
- e4 ~! J: c% u( z! {: ~) J
6 h4 D% i/ y5 H0 @# @) s. H" |# l

/ v0 b# Z: P* y) ]! k* rИ помните, если код не работает — значит, это он проверяет, насколько вы упорны! ? Но мы вместе разберемся!
/ X' l$ v. V/ W5 U
: I* p! |$ u6 r& @- ~7 W0 h
) E( U) N  b& m0 h( o5 Y7 C
- j3 C: P  M  R* y! d6 F5 k. X- c$ D% B/ j" \$ t# ^# @
' i$ Y* J, {3 s% U9 _# L3 e/ g1 w( [5 F& ~

Автор: Mike123    Время: 2024-10-17 01:17
Почему мы используем ключевое слово this для ссылки на поля класса?, m" p: m. Z: C

Автор: Astraliya    Время: 2024-10-17 01:29
Mike123 опубликовал в 2024-10-17 01:170 Q( X' ~! z/ H% b5 r
Почему мы используем ключевое слово this для ссылки на п ...

  y2 n$ F( D/ @. [. J; RКлючевое слово this в Java используется для ссылки на текущий объект класса. Оно необходимо в тех случаях, когда имена параметров метода совпадают с именами полей класса.
  A  Z- m/ Q: d' FПредставим, что у нас есть класс Player, у которого есть поле name. Когда мы передаем значение этому полю через конструктор или метод, можно столкнуться с ситуацией, когда параметр метода или конструктора имеет то же имя, что и поле класса.  k9 P5 n1 J2 E6 v, c+ k

" k4 h7 v$ l4 XВот пример:, q: V9 z2 H% \0 T
  1. public class Player {
      v3 T& J  w; ]$ m, [9 l+ q, q
  2.     private String name;0 j1 P% ]% S  [  v2 Y0 g: q

  3. # F  e, L. u- j! q4 a5 P2 U+ ~
  4.     // Конструктор% B1 S/ |: P) r( O
  5.     public Player(String name) {
    1 q; f6 y5 k9 V  j" A& X2 e2 h
  6.         this.name = name; // Используем this для указания на поле класса" q8 _' z; x+ e2 D3 H+ X4 e
  7.     }6 n8 \0 X! g; \& P4 K. M: {

  8. # q  O4 Y& ]% P* l* t6 E. U
  9.     // Геттер для имени* P1 h8 o+ r( y
  10.     public String getName() {/ ~& x% R- u$ Q1 d
  11.         return this.name; // Используем this для обращения к полю класса; P* s7 j$ J/ S- j
  12.     }, `: h& V5 G* M$ E$ P/ H0 W" V
  13. }8 N( @) O/ \$ L0 z( x
Скопировать код
В этом примере параметр конструктора и поле класса называются одинаково — name. Чтобы указать, что мы говорим именно о поле класса, а не о параметре метода, мы используем this.name. Это ясно даёт понять компилятору, что мы присваиваем значение параметра name полю класса name.
* G6 y& \% i/ O7 u5 P  c6 P
* d/ b5 D+ s5 _2 Z( x. D, cКогда необходимо использовать this:
6 p3 j! T: g, T/ q& c  N, C0 p! TПример передачи this:+ H9 l/ [. Z  R! Z
  1. public class Game {
    0 Y' H; a, M. o% B
  2.     public void start(Player player) {$ D6 n- A" j3 @8 l+ D  a* _
  3.         System.out.println("Игра началась с игроком: " + player.getName());) L- F% a5 t* d1 Z8 q1 Y
  4.     }
    0 R$ t& F! S$ }# E* F% n
  5. }
    1 D1 j* X& V* H/ v# ]
  6. 8 R; m3 N8 n/ B/ v& H
  7. public class Player {- e$ k; g# l' l- V" `9 U
  8.     private String name;
    - J: j' C/ B6 N* U- s% G: t

  9. & s% J3 b( G5 I5 X% g& q' e
  10.     public Player(String name) {9 L  ?- k, T2 ^. v9 V$ i8 U
  11.         this.name = name;
    & h. I6 ~/ c- _# t( H* j) g
  12.     }( c$ P* K( a0 q$ l

  13. - k' T! L' i( f+ P. a
  14.     public void joinGame(Game game) {
    $ F; N  i# \6 ~! `( \
  15.         game.start(this); // Передаем текущий объект Player( j6 J" G  C( K) e# C# Y0 m4 B
  16.     }! n* ]: g, A. m2 {
  17. }. u( N- h1 R# E2 m+ _
Скопировать код
Заключение:Использование this помогает избежать путаницы между параметрами и полями класса и делает код более понятным. Это ключевой инструмент для работы с объектами и методами в Java.
8 ]. V; Y: E" [, I" D
- l6 r% N+ S; S. j, A( E9 [
Помните, если Java кажется сложной, просто представьте, что она — это NPC, которого нужно приручить! ?0 s1 a; @0 u: v

- x, T& Y+ C$ V0 o
Автор: Mike123    Время: 2024-10-17 20:05
Добрый день!
1 o2 Q1 C" K* z2 |Как создаются и вызываются методы в Java? Можешь показать на примере взаимодействия между методами?
Автор: Astraliya    Время: 2024-10-17 20:23
Последний раз это сообщение было отредактировано Astraliya в 2024-10-17 20:24
8 v# J/ {5 O4 ~9 |
Mike123 опубликовал в 2024-10-17 20:05
' w8 T& k" _  W+ b& N0 a, ~4 SДобрый день!
& u0 f& `1 r3 G9 yКак создаются и вызываются методы в Java? Мо ...

, }% Q# t$ f: A5 r5 gПривет, Mike 123! ?
" s2 q( r9 }8 |+ BОтличный вопрос! Давай разберём, как создаются и вызываются методы в Java, на примере из исходников L2J_Mobius. Методы — это один из основополагающих элементов в программировании, и они позволяют нам разбить код на удобные блоки, которые можно многократно использовать.8 r$ B6 ?- g9 w- X" F
; L0 g' ~2 G) G8 |
Для лучшего понимания логики кода и изучения английского языка информация будет подаваться в двуязычном формате. Сначала будет представлен код на английском, а затем — его перевод на русский язык с пояснениями. Такой подход позволит не только разобраться в структуре кода, но и улучшить владение английской технической терминологией.
! _% X: Y/ A2 h
! F1 Z0 ^# i+ D+ z5 y
6 M; \' d# ^5 y7 B$ p7 {9 }. Q" MКак создаются методы в Java?6 @) I0 d$ k+ ]- u

0 R5 [+ O  T% w. @: D1 y! uМетоды в Java создаются внутри классов. Вот базовый шаблон метода:  s) F: O1 X$ Y, R
, R6 }/ A. r5 Y8 T
  1. public returnType methodName(parameters) {
    0 ~/ T3 K8 a  f$ m
  2.     // код метода( g3 W$ F& M, |1 x- z
  3.     return value;! X; B+ z) L7 W$ i: S7 e
  4. }* W- A" U2 R, j. ?6 O. k
Скопировать код
! L5 \- p8 j% L  R6 o* B
Теперь перейдём к примеру.
. u  U  t' R( h' ]4 s5 V% ]9 B
1 k, j+ f! A- {, K1 n7 N# ]Пример на основе L2J_Mobius с переводомКласс Player.java — создание метода9 v' T. v$ c3 ~: X- R0 W9 s
  1. public void attack(Npc target) {  // public void атака(Npc цель)
      C7 c; _; }9 w, w! D3 {- \' V
  2.     // Вызов метода атаки NPC
    3 w0 w- P0 w( }, L: Z4 a
  3.     target.receiveDamage(this, calculateDamage());  // цель.получитьУрон(это, рассчитатьУрон());, W, p6 ]' w1 e" q8 t
  4. }, C. F% K! g/ m/ {3 y  K' C8 h' T
Скопировать код
Метод называется attack (атака) и принимает объект Npc в качестве параметра.Внутри метода вызывается другой метод у Npc — receiveDamage (получитьУрон), передавая объект игрока (this — это) и результат расчёта урона (calculateDamage() — рассчитатьУрон()).
/ k* W+ v' ^, Y! q" G4 J6 O9 ~1 c$ \7 q

- H( n; j* H$ s; Q% X1 b' CКласс Npc.java — вызов метода( X% R' M1 `& \; }$ G8 m3 C2 J
' F0 u/ D: Q% v' s% a# |/ A
  1. public void receiveDamage(Player player, int damage) {  // public void получитьУрон(Игрок игрок, int урон)4 b& m# a. z) r
  2.     // Логика получения урона NPC
    - X) {2 D0 z" E+ v: P) E/ ^- w" T
  3.     this.health -= damage;  // это.здоровье -= урон;7 _5 |! ^; L/ ^7 k) d" z
  4.     System.out.println(player.getName() + " нанес " + damage + " урона NPC " + this.getName());  4 o7 v, D' I5 S3 G$ N
  5.     // System.out.println(игрок.получитьИмя() + " нанес " + урон + " урона NPC " + это.получитьИмя());
    * K+ p1 O  e8 p, k7 t1 x
  6.    
    . q/ }  d5 @) ]4 G! r
  7.     // Проверка на смерть NPC
    * C3 X" ]0 P! u0 ]( R3 i
  8.     if (this.health <= 0) {  // если (это.здоровье <= 0)4 y0 I, q, c) [/ F7 a& m2 [1 Z1 }
  9.         this.die();  // это.умереть();
    5 ~2 b0 c1 w4 a( U4 v
  10.     }
    & J3 M5 s  B- k" i
  11. }
    ; Y! Z2 [% s6 @* `0 ^  r8 f8 p+ T
Скопировать код
Пример взаимодействия (с переводом)
, p. |5 u6 O/ D- w5 i
  1. Player player = new Player("Mike123");  // Игрок игрок = новый Игрок("Mike123");
    ' `4 C; J! M4 B5 x
  2. Npc goblin = new Npc("Гоблин");  // НПЦ гоблин = новый НПЦ("Гоблин");
    ! D- E% t2 |& |, R, p

  3. $ |. h2 Z8 J- v2 v( R& I. ]8 I
  4. // Игрок атакует гоблина! K  c$ }5 c' l9 D% X9 t- |" |5 }
  5. player.attack(goblin);  // игрок.атаковать(гоблин);/ I0 R1 w" @3 h
Скопировать код
акой подход поможет тебе учить английский, а также понять логику кода. 8 |- y$ A4 G" ^
# r0 w5 X& q- t# ]2 P5 h- r. `

Автор: Mike123    Время: 2024-10-17 20:30
Привет, Астралия! Огромное спасибо за твои разъяснения и помощь! Теперь я начинаю лучше понимать, как работают методы в Java и как они взаимодействуют друг с другом. Мне очень помог твой пример, особенно с переводом на русский — это здорово облегчает процесс изучения.5 ^6 t4 |* o7 W* y
У меня возник ещё один вопрос: какие классы из сборки L2J_Mobius можно использовать для создания базового NPC? Хотелось бы попробовать реализовать простого NPC с минимальным набором функций. Заранее благодарю за ответ!
' M/ B- i' W  c7 N/ D& D
9 ]/ f+ R$ Z  y6 q
Автор: Astraliya    Время: 2024-10-17 20:57
Mike123 опубликовал в 2024-10-17 20:30
" f3 ?7 Q% x5 i* P# e; g% Y3 pПривет, Астралия! Огромное спасибо за твои разъяснения ...
3 E( T- ^  m9 p! _9 ]
Основные методы, которые используются для NPC в сборке L2J_Mobius, связаны с их взаимодействием с игроками, передвижением, боем и управлением их состоянием. Вот несколько ключевых методов из классов Npc.java и Creature.java, которые ты можешь использовать для создания и управления NPC.4 s+ E6 _0 C8 Q7 |% I2 ]
1. getName() и getId()
  1. <blockquote>public String getName() {  // public String получитьИмя()
Скопировать код
2. onAction(Player player)
! G' a6 z( S! x# j7 T
  1. public void onAction(Player player) {  // public void наДействие(Игрок игрок)% E6 u( h: G$ ~
  2.     // Логика взаимодействия игрока с NPC
    $ F0 f* _/ a) ]- A- n
  3. }3 N8 b3 {7 s( ?( _, K! c8 ~
Скопировать код
3. moveToLocation(int x, int y, int z)( Y3 X% D' |& Y" h) c
  1. public void moveToLocation(int x, int y, int z) {  // public void переместитьсяВ(х, у, z)+ N3 r% E+ y& f- W; R/ }  ~: N  R
  2.     // Логика перемещения NPC2 t8 j6 k% `- X2 h3 F- i
  3. }
    $ W5 H) g# U4 f$ ^) g, ]2 b: M. ]0 g
Скопировать код
4. attackCharacter(Creature target)
9 p, r) @% U! d, S
  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 урон, Существо атакующий)
    3 C0 \- p& t4 l0 Y
  2.     this.health -= damage;  // NPC теряет здоровье
    3 {5 O5 x+ T) ]: F0 i. Z
  3.    
    ) B+ v. E; `" \( k! |
  4.     if (this.health <= 0) {% L3 \& u; U3 f! |& g7 l% i0 q' F
  5.         die();  // Если здоровье упало до 0, NPC умирает  ^5 N0 w; I7 F8 D( S! P
  6.     }
    : |" Y$ j0 A7 L
  7. }
    3 A$ n+ f* ~, Z% x( w' @+ x
Скопировать код
6. die()
  s- O) T8 P% E, ?( _1 [! _6 @
  1. public void die() {  // public void умереть()
    ) I6 S9 z5 J, x. u9 J3 n" D' W
  2.     // Логика смерти NPC
    1 a' r6 T2 ^! ?) p* L
  3. }
    ( Y3 y+ W! p9 Q  r
Скопировать код
7. isDead()
" t# T$ h4 H1 r. @
5 {/ p! [4 s+ u: T, C3 K1 J, {
  1. public boolean isDead() {  // public boolean мертв()
    & H# r2 B5 H5 _. c; l% L. A- q, S
  2.     return this.health <= 0;  // Возвращает true, если здоровье <= 0) z3 M/ E6 x6 N# l
  3. }
    2 j( u1 A7 _1 i2 G  F
Скопировать код
8. heal(int amount). X" H/ h, ]; ^3 M+ Z
  1. public void heal(int amount) {  // public void вылечить(int количество)
    ) ~/ S# H& ^4 C/ T8 E& ]; \/ x
  2.     this.health += amount;  // Увеличиваем здоровье
    # x: d! u1 Z- a) F* x* _/ O
  3.     $ }+ i% _" S( K% ]3 W  q; |/ N  s
  4.     if (this.health > this.maxHealth) {
    . {/ Y. O- z  a# X/ n3 ^
  5.         this.health = this.maxHealth;  // Здоровье не может быть больше максимального
    2 |( P7 h  U# [# m
  6.     }
    ( Q$ G2 b5 r2 h7 M1 s2 B. c
  7. }
    1 x% D7 L6 B  V, [2 y: W6 p
Скопировать код
9. doCast(Skill skill)5 ?& l* d& ?, A
  1. public void doCast(Skill skill) {  // public void использоватьЗаклинание(Умение скилл)* a9 [1 y+ x5 C- X' t* x, @* N+ M
  2.     // Логика применения скилла NPC
    ! h1 D0 U3 x( J0 p% q/ E% h
  3. }
    9 g. U( S+ b! m; _
Скопировать код
10. onInteract(Player player)- B7 M% I& e. v* i* j' R
  1. + Z, e# {+ {2 Q  h  b' q
  2. public void onInteract(Player player) {  // public void наВзаимодействие(Игрок игрок)
    ) ^% m6 B1 Q" v. W5 ~' B
  3.     // Логика взаимодействия с NPC, X3 d4 F- |9 e! T0 W
  4. }
    # S5 y1 B& X* f# N- X4 C* H% ~
Скопировать код
11. showChatWindow(Player player)
" h. K5 M. y& N9 |6 ]% C
  1. public void showChatWindow(Player player) {  // public void показатьОкноДиалога(Игрок игрок)
    * L3 z) R- U: K$ U0 E( G) s% V
  2.     // Логика открытия окна диалога
    0 T" J' v. \* Z9 \7 q) k3 d8 l4 b0 d  S
  3. }
    : y; L7 ^" `0 t6 }9 d, e, G
Скопировать код
ЗаключениеЭти методы помогут тебе создать функционального NPC, который может взаимодействовать с игроками, получать и наносить урон, двигаться, использовать заклинания и вести диалоги. Ты можешь начать с базового NPC и постепенно добавлять ему новые функции, используя указанные методы.
0 a+ y/ n- F/ ]: Y2 _5 SЕсли тебе нужны примеры кода или более детальные разъяснения — не стесняйся, спрашивай!6 r, x0 y7 W6 ~% Z" p
" F. G' w& J2 C( q7 `4 `9 N5 {
( q# Y' f9 g7 ]7 T
4 m7 w/ Q# V7 D; D* y
7 S3 ]8 H% D+ [: J% V5 F





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