Instance & Static
Các thành phần có thể có mặt trong code định nghĩa của một class
trong Java
cũng được chia làm hai nhóm giống như đối với JavaScript
và các ngôn ngữ lập trình khác có hỗ trợ OOP
:
Instance Members
– các thuộc tínhproperty
và các phương thứcmethod
thuộc về cácobject
được tạo ra từclass
, hay còn được gọi là cácinstance
.Static Members
– các thuộc tínhproperty
và các phương thứcmethod
không thuộc về cácinstance
mà thuộc vềobject
đại diện choclass
đó, và được tham chiếu từ tênclass
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | <span class="token keyword">class</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span> <span class="token comment">/* Instance Members */</span> <span class="token class-name">String</span> name<span class="token punctuation">;</span> <span class="token keyword">int</span> age<span class="token punctuation">;</span> <span class="token class-name">Person</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>setName <span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>setAge <span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token class-name">Person</span> <span class="token punctuation">(</span> <span class="token class-name">String</span> $name<span class="token punctuation">,</span> <span class="token keyword">int</span> $age <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>setName <span class="token punctuation">(</span>$name<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>setAge <span class="token punctuation">(</span>$age<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">Person</span><span class="token punctuation">.</span>instanceCounter <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">void</span> setName <span class="token punctuation">(</span><span class="token class-name">String</span> $name<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>$name <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> <span class="token string">"Anonymous"</span><span class="token punctuation">;</span> <span class="token keyword">else</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> $name<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">void</span> setAge <span class="token punctuation">(</span><span class="token keyword">int</span> $age<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>$age <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token keyword">this</span><span class="token punctuation">.</span>age <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">else</span> <span class="token keyword">this</span><span class="token punctuation">.</span>age <span class="token operator">=</span> $age<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">void</span> greet <span class="token punctuation">(</span><span class="token class-name">Person</span> $someone<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span>println <span class="token punctuation">(</span><span class="token string">"Hello, "</span> <span class="token operator">+</span> $someone<span class="token punctuation">.</span>name <span class="token operator">+</span> <span class="token string">"!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span>println <span class="token punctuation">(</span><span class="token string">"I'm "</span> <span class="token operator">+</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">+</span> <span class="token string">", "</span> <span class="token operator">+</span> <span class="token keyword">this</span><span class="token punctuation">.</span>age <span class="token operator">+</span> <span class="token string">" year(s) old."</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/* Static Members */</span> <span class="token keyword">static</span> <span class="token keyword">int</span> instanceCounter<span class="token punctuation">;</span> <span class="token keyword">static</span> <span class="token punctuation">{</span> <span class="token class-name">Person</span><span class="token punctuation">.</span>instanceCounter <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">static</span> <span class="token keyword">void</span> printCounter <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span>println <span class="token punctuation">(</span><span class="token string">"Person: Created "</span> <span class="token operator">+</span> <span class="token class-name">Person</span><span class="token punctuation">.</span>instanceCounter <span class="token operator">+</span> <span class="token string">" instance(s)."</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">//. Person</span> |
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">class</span> <span class="token class-name">ClassMembers</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> main <span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> $args<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">Person</span> $me <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Person</span> <span class="token punctuation">(</span><span class="token string">"Semi Dev"</span><span class="token punctuation">,</span> <span class="token number">32</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">Person</span> $someone <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Person</span> <span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">Person</span><span class="token punctuation">.</span>printCounter <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> $me<span class="token punctuation">.</span>greet <span class="token punctuation">(</span>$someone<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">//. ClassMembers</span> |
1 2 3 4 5 6 7 8 | cd learn-java-language && cd class-members javac ClassMembers.java Person.java java ClassMembers Person: Created 2 instance(s). Hello, Anonymous! I'm Semi Dev, 32 year(s) old. |
Overloading Methods
So với JavaScript
thì cú pháp định nghĩa class
của Java
hầu hết là tương đồng, tuy nhiên cũng có một vài điểm khác biệt:
- Các trình khởi tạo là các phương thức không gắn từ khóa
constructor
. - Có thể tồn tại nhiều phiên bản định nghĩa khác nhau của cùng một tên phương thức
method name
.
Điểm khác biệt đầu tiên thì có lẽ là do thiết kế ngôn ngữ ở thời điểm ban đầu, từ khóa constructor
của JavaScript
giúp cho các trình khởi tạo được đánh dấu tách biệt tốt hơn khi đặt cạnh code định nghĩa của các phương thức khác. Hy vọng là cũng có lúc Java
cập nhật một vài đặc điểm nho nhỏ này để thêm phần hoàn hảo.
Điểm khác biệt thứ hai là do đặc trưng định kiểu của Java
là static-typing
. Các ngôn ngữ định kiểu tĩnh luôn cố gắng hỗ trợ tính năng này để giúp người viết code có thể sử dụng lại các tên hàm. Có rất nhiều trường hợp khi chúng ta muốn có nhiều phiên bản định nghĩa của cùng một tên hàm, bởi chức năng tổng quát của hàm thì vẫn vậy, nhưng đối với bộ tham số đầu vào khác nhau thì sẽ có logic xử lý khác nhau đôi chút. Thao tác định nghĩa lại nhiều lần một tên hàm với các bộ chữ ký signature
khác nhau được gọi là overloading methods
.
Trong code ví dụ ở trên, chúng ta có trường hợp overload
trình khởi tạo với một phiên bản không có tham số và một phiên bản có các tham số dữ liệu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token comment">// signature: Person ()</span> <span class="token class-name">Person</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>setName <span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>setAge <span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// signature: Person (String, Int)</span> <span class="token class-name">Person</span> <span class="token punctuation">(</span> <span class="token class-name">String</span> $name<span class="token punctuation">,</span> <span class="token keyword">int</span> $age <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>setName <span class="token punctuation">(</span>$name<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>setAge <span class="token punctuation">(</span>$age<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">Person</span><span class="token punctuation">.</span>instanceCounter <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Một bộ chữ signature
đại diện cho một phiên bản định nghĩa phương thức method
bao gồm: kiểu dữ liệu trả về, tên của phương thức method name
, kiểu dữ liệu của các tham số đầu vào. Do các trình khởi tạo trong Java
không có tên nên chúng ta đang tạm thời có các bộ chữ ký như trên.