Xu Hướng 3/2024 # Từ Khóa Static Trong Java Và Lập Trình Hướng Đối Tượng # Top 8 Xem Nhiều

Bạn đang xem bài viết Từ Khóa Static Trong Java Và Lập Trình Hướng Đối Tượng được cập nhật mới nhất tháng 3 năm 2024 trên website 2atlantic.edu.vn. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất.

Trong Java, static là một từ khóa mà chúng ta rất hay thường gặp khi lập trình.

Vậy static là gì? Sử dụng chúng trong trường hợp nào? Bài hôm nay mình sẽ giới thiệu với mọi người xung quanh từ khóa này.

Thông thường, mỗi một phương thức hay một thuộc tính nào đó đều gắn chặt với một đối tượng cụ thể. Muốn truy cập tới các biến hay phương thức của đối tượng, ta thường đều phải gọi cho các đối tượng cụ thể.

Tuy nhiên, trong một số trường hợp, ta muốn có dữ liệu nào đó của lớp được chia sẻ giữa tất cả các đối tượng thuộc một lớp, các phương thức của lớp hoạt động độc lập với các đối tượng của lớp đó, thì giải pháp là các biến lớp và phương thức lớp.

1 – Biến của lớp(biến static)

Đôi khi, ta muốn một lớp có những biến dùng chung cho tất cả các đối tượng thuộc lớp đó. Ta gọi các biến dùng chung này là biến của lớp (class variable), hay gọi tắt là biến lớp. Chúng không gắn với bất cứ một đối tượng nào mà chỉ gắn với lớp đối tượng. Chúng được dùng chung cho tất cả các đối tượng trong lớp đó.

Để phân biệt giữa biến thực thể và biến lớp khi khai báo trong định nghĩa lớp, ta dùng từ khóa static cho các biến lớp. Vì từ khóa đó nên biến lớp thường được gọi là biến static.

Lấy ví dụ sau, bên cạnh biến thực thể name, lớp Cow còn có một biến lớp numOfCows với mục đích ghi lại số lượng các đối tượng Cow đã được tạo.

Mỗi đối tượng Cow có một biến name của riêng nó, nhưng numOfCows thì chỉ có đúng một bản dùng chung cho tất cả các đối tượng Cow.

numOfCows được khởi tạo bằng 0, mỗi lần một đối tượng Cow được tạo, biến này được tăng thêm 1 (tại hàm khởi tạo dành cho đối tượng đó) để ghi nhận rằng vừa có thêm một thực thể mới của lớp Cow.

Từ bên ngoài lớp, ta có thể dùng tên lớp để truy nhập biến static. Chẳng hạn, dùng Cow.numOfCows để truy nhập numOfCows:

2 – Phương thức của lớp(hàm static)

Lại xét ví dụ trong phần 1, giả sử ta muốn numOfCows là biến private để không cho phép ai đó sửa từ bên ngoài lớp Cow.

Nhưng ta vẫn muốn cho phép đọc giá trị của biến này từ bên ngoài, nên ta sẽ bổ sung một phương thức, chẳng hạn getCount(), để trả về giá trị của biến đó.

Như các phương thức mà ta đã quen dùng, để gọi getCount(), người ta sẽ cần đến một tham chiếu kiểu Cow và kích hoạt phương thức đó cho một đối tượng Cow.

Tuy nhiên, sẽ có những vấn đề xảy ra như sau:

Cần đến một con bò để biết được có tất cả bao nhiêu con bò? Nghe có vẻ không được tự nhiên lắm.

getCount() không dùng đến một đặc điểm hay dữ liệu đặc thù nào của mỗi đối tượng Cow

Khi còn chưa có một đối tượng Cow nào được tạo thì không thể gọi được getCount()

Phương thức getCount()không nên bị phụ thuộc vào các đối tượng Cow cụ thể như vậy.

Để giải quyết vấn đề này, ta có thể cho getCount() làm một phương thức của lớp (class method), thường gọi tắt là phương thức lớp – hay phương thức static – để nó có thể tồn tại độc lập với các đối tượng và có thể được gọi thẳng từ lớp mà không cần đến một tham chiếu đối tượng nào.

Ta dùng từ khóa static khi khai báo phương thức lớp:

Đặc điểm độc lập đối với các đối tượng của phương thức static chính là lí do ta đã luôn luôn phải khai báo phương thức main() với từ khóa static.

main() được kích hoạt để khởi động chương trình – khi chưa có bất cứ đối tượng nào được tạo – nên nó phải được phép chạy mà không gắn với bất cứ đối tượng nào.

3 – Giới hạn của phương thức lớp

Đặc điểm về tính độc lập đó vừa là ưu điểm vừa là giới hạn cho hoạt động của các phương thức lớp.

Không được gắn với một đối tượng nào, nên các phương thức static của một lớp chạy mà không biết một chút gì về bất cứ đối tượng cụ thể nào của lớp đó.

Như đã thấy trong ví dụ phần 2, getCount() chạy ngay cả khi không tồn tại bất cứ đối tượng Cow nào.

Kể cả khi gọi getCount() từ một đối tượng cụ thể thì getCount() cũng vẫn không biết gì về đối tượng Cow của đối tượng đó.

Vì khi đó, trình biên dịch chỉ dùng kiểu khai báo Cow để xác định nên chạy getCount() của lớp nào, nó không quan tâm tới đối tượng nào.

Nếu một biến thực thể được dùng đến trong một phương thức lớp, trình biên dịch sẽ không hiểu ta đang nói đến biến thực thể của đối tượng nào, bất kể trong heap đang có 10 hay chỉ có duy nhất một đối tượng thuộc lớp đó. Tương tự khi gọi các phương thức của thực thể trong các phương thức static

4 – Khởi tạo biến của lớp

Các biến static được khởi tạo khi lớp được nạp vào bộ nhớ. Một lớp được nạp khi máy ảo Java quyết định đến lúc cần nạp, chẳng hạn như khi ai đó định tạo thực thể đầu tiên của lớp đó, hoặc dùng biến static hoặc phương thức static của lớp đó.

Có hai đảm bảo về việc khởi tạo các biến static:

Các biến static trong một lớp được khởi tạo trước khi bất cứ đối tượng nào của lớp đó có thể được tạo

Các biến static trong một lớp được khởi tạo trước khi bất cứ phương thức static nào của lớp đó có thể chạy

Ta có hai cách để khởi tạo biến static. Thứ nhất, khởi tạo ngay tại dòng khai báo biến

Cách thứ hai: Java cung cấp một cú pháp đặc biệt là khối khởi tạo static (static initialization block) – một khối mã được bọc trong cặp ngoặc { } và có tiêu đề là từ khóa static.

Một lớp có thể có vài khối khởi tạo static đặt ở bất cứ đâu trong định nghĩa lớp. Chúng được đảm bảo sẽ được kích hoạt theo đúng thứ tự xuất hiện trong mã.

Và quan trọng bậc nhất là chúng được đảm bảo sẽ chạy trước khi bất gì biến thành viên nào được truy nhập hay phương thức static nào được chạy.

5 – Tổng kết

Có một vài điểm cần lưu ý mà mình mong muốn các bạn cần nhớ được như sau:

Phương thức lớp hay còn gọi là phương thức static không được gắn với một đối tượng cụ thể nào và không phụ thuộc đối tượng nào, nó chỉ được gắn với lớp

Nên gọi phương thức static từ tên lớp.

Phương thức static có thể được gọi mà không cần có đối tượng nào của lớp đó đang ở trong heap.

Do không được gắn với một đối tượng nào, phương thức static không thể truy nhập biến thực thể hay các phương thức thực thể.

Biến lớp hay còn gọi là biến static là biến dùng chung cho tất cả các đối tượng của lớp. Chỉ có duy nhất một bản cho cả lớp, chứ không phải mỗi đối tượng có một bản.

Phương thức static có thể truy nhập biến static.

Giáo trình Lập trình hướng đối tượng với Java (2010) Trường Đại học Công nghệ – ĐHQGHN

All Rights Reserved

Lập Trình Hướng Đối Tượng Trong Java

Bài tập

Bạn hãy tạo ra lớp Student với thông tin giống như sau:

name, address, gpa là 3 thuộc tính chỉ tên, địa chỉ và điểm GPA của lớp Student.

Student(name: String, address: String, gpa: double) là phương thức khởi tạo có tham số dùng để khởi tạo giá trị cho các thuộc tính.

toString() là phương thức ghi đè từ lớp Object (bạn sẽ hiểu tại sao phương thức này lại ghi đè từ lớp Object ở phần lý thuyết), phương thức này sẽ trả về thông tin của đối tượng dưới dạng String. Ví dụ nếu name = "Kien", address = "Ha Noi", gpa = "6.6" thì phương thức toString() sẽ trả về: "Name: Kien, address: Ha Noi, GPA: 6.6".

Chương trình để test lớp Student:

public class Entry { public static void main(String[] args) { Student s = new Student("Kien", "Ha Noi", 6.6); System.out.println(s); } }

Kết quả khi chạy chương trình:

Name: Kien, addres: Ha Noi, GPA: 6.6 Lý thuyết

Bài này sẽ giúp bạn hiểu rõ hơn về lớp Object. Trước hết bạn hãy xem ví dụ sau:

class Student{ } public class Entry { public static void main(String[] args) { Student s = new Student(); System.out.println(s.hashCode()); System.out.println(s.toString()); System.out.println(s.getClass()); } }

Kết quả khi chạy chương trình:

1554547125 [email protected] class OOP.Student

Nhìn vào ví dụ trên chắc bạn sẽ thắc mắc là tại sao lớp Student lại có những phương thức như hashCode(), toString(), getClass() trong khi bạn không khai báo các phương thức này. Lý do là tất cả các lớp trong Java đều được kế thừa từ lớp Object và trong lớp Object có các phương thức này.

Ngoài các phương thức trên, lớp Object còn có một số phương thức khác, trong đó toString() là phương thức dùng để biểu diễn đối tượng dưới dạng xâu ( String). Trong thực tế bạn sẽ sử dụng phương thức toString() rất nhiều. Ví dụ khi bạn gọi hàm System.out.println() với một đối tượng thì chương trình sẽ hiển thị phương thức toString() của đối tượng đó:

public class Student { private String name; private String address; private double gpa; public Student(String name, String address, double gpa) { chúng tôi = name; this.address = address; chúng tôi = gpa; } @Override public String toString() { return "Name: " + name + ", address: " + address + ", GPA: " + gpa; } }

Kết quả khi chạy chương trình:

Name: Kien, age: 23

Có thể thấy, bạn hoàn toàn có thể sử dụng phương thức toString() để thay thế cho phương thức display() mà bạn đã học ở các bài trước.

Đọc tới đây bạn đã hiểu về phương thức toString(), hãy quay lại phần bài tập và làm thử.

Hướng dẫn

Bạn cần tạo ra lớp Student giống như sau:

public class Student { private String name; private String address; private double gpa; public Student(String name, String address, double gpa) { chúng tôi = name; this.address = address; chúng tôi = gpa; } @Override public String toString() { return "Name: " + name + ", address: " + address + ", GPA: " + gpa; } }

Lập Trình Hướng Đối Tượng(Oops) Trong Java

Khái niệm về lập trình hướng đối tượng trong java

Lập trình hướng đối tượng (OOP-Object-Oriented Programming) là một phương pháp hay mô hình giúp tăng năng suất, đơn giản hóa việc bảo trì, dễ dàng mở rộng trong thiết kế phần mềm bởi việc cung cấp một vài khái niệm như:

Đối tượng (Object)

Lớp (Class)

Kế thừa (Inheritance)

Đa hình (Polymorphism)

Trừu tượng (Abstraction)

Đóng gói (Encapsulation)

Lập trình hướng đối tượng có 4 tính chất:

Đối tượng (Object)

Tất cả những thực thể có trạng thái và hành vi được biết đến như là một đối tượng. Ví dụ: bàn, ghế, bút chì, xe dạp, ô tô…

Lớp (Class)

Tập hợp các đối tượng được gọi là lớp.

Kế thừa (Inheritance)

Khi một đối tượng được truyền lại tất cả các thuộc tính và phương thức của đối tượng cha được gọi là kế thừa. Kế thừa giúp tái sử dụng lại mã nguồn. Nó được sử dụng cho đa hình lúc runtime.

Tìm hiểu thêm về Tính kế thừa (Inheritance) trong java

Đa hình (Polymorphism)

Khi một nhiệm vụ được thực hiện bởi nhiều cách khác nhau, tính chất này được gọi là đa hình. Ví dụ có nhiều các để thuyết phục các khách hàng khác nhau, để vẽ một cái gì đó như hình tròn, hình chữ nhật, …

Trong java, để áp dụng tính đa hình chúng ta sử dụng phương thức orverloading hoặc overriding.

Tìm hiểu thêm về Tính đa hình (Polymorphism) trong java

Trừu tượng (Abstraction)

Trừu tượng là sự ẩn đi những chi tiết bên trong và hiển thị ra các chức năng, tính chất này gọi là trừu tượng. Ví dụ: khi gọi điện thoại chúng ta không biết xử lý nội bộ thế nào, khi đi xe máy cũng vậy, mà chúng ta chỉ biết đến các chức năng thông qua giao tiếp bên ngoài.

Trong java, chúng ta áp dụng tính chất trừu tượng bằng cách sử dụng abstract class và interface.

Tìm hiểu thêm về lớp abstract trong java và interface trong java.

Đóng gói (Encapsulation)

Việc ràng buộc giữa code và data với nhau tạo thành một khối duy nhất được biết đến là đóng gói. Ví dụ: viên thuốc con nhộng được đóng gói với nhiều loại thuốc bên trong.

Một class trong java là một ví dụ về đóng gói. Java bean là một lớp được đóng gói hoàn toàn vì tất cả các dữ liệu thành viên là private.

Tìm hiểu thêm về Tính đóng gói (Encapsulation) trong java.

Thế mạnh của OOPs so với ngôn ngữ lập trình hướng thủ tục

1) Lập trình hướng đối tượng giúp việc phát triển và bảo trì dễ dàng hơn. Trong khi phương pháp lập trình hướng thủ tục là không dẽ dàng quản lý khi code lớn.

2) Lập trình hướng đối tượng có tính năng ẩn dấu thông tin, trong khi hướng thủ tục có thể truy cập dữ liệu toàn cục ở bất kỳ nơi nào

3) Lập trình hướng đối tượng cung cấp khả năng mô phỏng sự kiện thực tế hiệu quả hơn.

Interface Trong Lập Trình Hướng Đối Tượng Java

Dẫn nhập

Ở bài trước, chúng ta đã tìm hiểu về TÍNH TRỪU TƯỢNG trong lập trình hướng đối tượng. Hôm nay, Kteam sẽ giới thiệu cho các bạn về interface để biết về đa kế thừa trong Java.

Nội dung

Để đọc hiểu bài này, tốt nhất các bạn nên có kiến thức cơ bản về các phần sau:

Bài này chúng ta sẽ tìm hiểu những vấn đề sau:

Interface là gì? Tại sao phải sử dụng?

Khai báo và sử dụng interface

Interface là gì? Tại sao phải sử dụng?

Interface là một kiểu dữ liệu tham chiếu trong Java. Nó là tập hợp các phương thức abstract (trừu tượng). Khi một lớp kế thừa interface, thì nó sẽ kế thừa những phương thức abstract của interface đó.

Một số đặc điểm của interface:

Không thể khởi tạo, nên không có phương thức khởi tạo.

Tất cả các phương thức trong interface luôn ở dạng public abstract mà không cần khai báo.

Các thuộc tính trong interface luôn ở dạng public static final mà không cần khai báo, yêu cầu phải có giá trị.

Mục đích của interface là để thay thế đa kế thừa lớp của những ngôn ngữ khác (ví dụ như C++, Python…). Ngoài ra, interface sẽ giúp đồng bộ và thống nhất trong việc phát triển hệ thống trao đổi thông tin.

Khai báo và sử dụng interface Cú pháp:

Bây giờ ta sẽ tạo ra interface IStudy giành riêng cho class Student, ta vẫn tạo file .java như mọi khi và viết chương trình như sau:

interface IStudy { void study(); }

Ta cho class Student kế thừa nó như sau:

public class Student extends Person implements IStudy{

Nếu dùng Eclipse, bạn sẽ thấy IDE yêu cầu override lại phương thức study() của IStudy ngay:

Ta sẽ overriding, thêm đoạn chương trình trong lớp Student như sau:

@Override public void study() {

Một class có thể kế thừa nhiều interface, ta sẽ thử tạo thêm interface ISpeak:

interface ISpeak { void speak(); }

Ta thêm interface ISpeak vào class Student bằng cách sau:

public class Student extends Person implements IStudy, ISpeak{

Hoặc, ta thử thêm ISpeak ở lớp cha Person:

public abstract class Person implements ISpeak{

Bởi vì class Person là lớp ảo, nên Person không cần override phương thức speak(). Ngoài ra, Student là lớp con Person, nên mặc dù Student không kế thừa ISpeak trực tiếp nhưng vẫn phải override phương thức speak(). Ta sẽ thấy Eclipse yêu cầu khai báo:

Ta sẽ hoàn thiện lớp Student như sau:

public class Student extends Person implements IStudy{ public String universityName; public Student(String name, int age, float height, String universityName) { super(name, age, height); this.universityName = universityName; } public void getInfo() { super.getInfo(); System.out.println("University Name:"+this.universityName); } @Override public Object clone() { Student other = new Student(this.name, this.getAge(), this.height, this.universityName); return other; } @Override public void study() { Kết

Như vậy chúng ta đã tìm hiểu interface trong lập trình hướng đối tượng

Ở bài sau, Kteam sẽ giới thiệu đến bạn về PHƯƠNG THỨC MAIN TRONG JAVA

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần BÌNH LUẬN bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện chúng tôi để nhận được sự hỗ trợ từ cộng đồng.

Từ Khóa Static Và Final Trong Java

Bài viết được sự cho phép của tác giả Giang Phan

1. Từ khóa static trong java

Trong Java, từ khóa static được sử dụng để quản lý bộ nhớ tốt hơn và nó có thể được truy cập trực tiếp thông qua lớp mà không cần khởi tạo.

Từ khóa static thuộc về lớp chứ không thuộc về instance (thể hiện) của lớp.

Chúng ta có thể áp dụng từ khóa static với các biến, các phương thức, các khối, các lớp lồng nhau(nested class).

Các trường hợp sử dụng static:

Biến static (static variables): khi bạn khai báo một biến là static, thì biến đó được gọi là biến tĩnh, hay biến static.

Phương thức static (static methods): khi bạn khai báo một phương thức là static, thì phương thức đó gọi là phương thức static.

Khối static (static blocks): được sử dụng để khởi tạo thành viên dữ liệu static.

Lớp static (static class): một class được có thể được đặt là static chỉ khi nó là một nested class. Một nested static class có thể được truy cập mà không cần một object của outer class (lớp bên ngoài).

Import static: từ phiên bản Java 5, cho phép import các thành viên tĩnh (static member) của một class hoặc package vào một class khác bằng cách sử dụng từ khóa import và sau đó sử dụng chúng như là thành viên của lớp đó.

Biến static (static variables) trong Java

Trong Java, biến có thể được khai báo cùng với từ khóa static, và lúc đó nó có thể được gọi là class variable.

Việc cấp phát bộ nhớ cho biến static chỉ xảy ra một lần khi class được nạp vào bộ nhớ

Giá trị mặc định khi khai báo và khởi tạo biến static và non-static là giống nhau, cụ thể:

primitive integers (long, int, short, byte): 0

primitive floating points (double, float): 0.0

boolean: false

object references: null

Biến static có thể được sử dụng làm thuộc tính chung, để dùng chung dữ liệu cho tất cả objects (hoặc instances ) của lớp đó và điều đó giúp cho chương trình tiết kiệm bộ nhớ hơn

Nếu một biến vừa khai báo từ khóa final vừa khai báo từ khóa static thì nó được xem như là một hằng số. Một hằng số nên được viết hoa và nếu có nhiều từ thì phân cách bằng dấu gạch dưới (_)

public static final PI = 3.14;

Trong Interface, mặc định một biến sẽ được khai báo là public static final.

Nếu một biến được khai báo với từ khóa static thì bạn có thể truy cập trực tiếp thông qua lớp.

Ví dụ: Website chúng tôi có rất nhiều bài viết, mỗi bài viết cần hiển thị địa chỉ của website dưới mỗi bài viết, địa chỉ này giống nhau và có nhiều lớp cần sử dụng. Để tiết kiệm bộ nhớ, dễ dàng chia sẻ và sử dụng ở các lớp khác. Chúng ta có thể sử dụng từ khóa static như sau:

MyWebsite.java

public class MyWebsite { public static String WEBSITE = "gpcoder.com"; }

UsingStaticExample.java

public class UsingStaticExample { private String subject; UsingStaticExample (String subject) { this.subject = subject; } public void print() { System.out.println("Subject = " + subject); System.out.println("Website = " + MyWebsite.WEBSITE); } public static void main(String[] args) { UsingStaticExample ex1 = new UsingStaticExample("Core Java"); ex1.print(); UsingStaticExample ex2 = new UsingStaticExample("Object Oriented Programing"); ex2.print(); } }

Kết quả:

Subject = Core Java Website = gpcoder.com ---- Subject = Object Oriented Programing Website = gpcoder.com

Một ví dụ khác thường hay được sử dụng để minh họa cho việc sử dụng từ khóa static là bộ đếm Counter. Bạn có một website và bạn cần đếm số lượt truy cập vào trang. Bạn viết chương trình như sau:

public class Counter { int count = 0; public Counter() { } public void visit() { count++; this.print(); } public void print() { System.out.println("count = " + count); } public static void main(String[] args) { Counter c1 = new Counter(); c1.visit(); Counter c2 = new Counter(); c2.visit(); Counter c3 = new Counter(); c3.visit(); } }

Kết quả thực thi chương trình trên

count = 1 count = 1 count = 1

Bạn thắc mắc tại sao kết quả ra kỳ vậy, rõ ràng là tôi đã tăng số lượng truy cập lên rồi mà. Đó là bởi vì, biến count lấy bộ nhớ tại thời điểm tạo đối tượng, mỗi đối tượng sẽ có bản sao của biến instance, nếu biến count được tăng lên, nó sẽ không ảnh hướng đến các đối tượng khác. Vì thế mỗi đối tượng sẽ có giá trị 1 trong biến count.

Như bạn đã thấy ở trên, biến static sẽ lấy bộ nhớ chỉ một lần, nếu bất cứ đối tượng nào thay đổi giá trị của biến static, nó sẽ vẫn ghi nhớ giá trị của nó.

public class Counter { static int count = 0; public Counter() { } public void visit() { count++; this.print(); } public void print() { System.out.println("count = " + count); } public static void main(String[] args) { Counter c1 = new Counter(); c1.visit(); Counter c2 = new Counter(); c2.visit(); Counter c3 = new Counter(); c3.visit(); } }

Kết quả thực thi chương trình trên

Phương thức static (static methods)

Nếu một phương thức được khai báo với từ khóa static thì phương thức đó được gọi là phương thức static.

Một số đặc điểm:

Một phương thức static thuộc lớp chứ không phải đối tượng của lớp.

Một phương thức static có thể được gọi mà không cần tạo khởi tạo (instance) của một lớp.

Phương thức static có thể truy cập biến static và có thể thay đổi giá trị của nó.

Một phương thức static chỉ có thể gọi một phương thức static khác, không thể gọi được một phương thức non-static.

Một phương thức static không thể được sử dụng từ khóa this và super.

Người dùng không thể override (đè) phương thức static trong Java, bởi vì kỹ thuật đè (overriding) phương thức được dựa trên quá trình gán (binding) động khi khi chương trình đang chạy (runtime) và những phương thức static được gán tĩnh trong thời gian biên dịch. Phương thức tĩnh không ràng buộc với thực thể của lớp nên phương thức tĩnh sẽ không thể override (đè).

Khi nào sử dụng từ khóa static cho một phương thức?

Khi phương thức không phụ thuộc vào trạng thái của đối tượng, nghĩa là không cần sử dụng bất kỳ dữ liệu thành viên nào của đối tượng, mọi thứ được truyền như các tham số (parameter).

Các phương thức tiện ích là một trường hợp thường được sử dụng nhất trong Java vì chúng có thể được truy cập trực tiếp bằng tên lớp mà không cần tạo bất thể hiện nào. Lớp chúng tôi là một ví dụ trường hợp sử dụng static method.

Sử dụng trong các Design Pattern cần truy cập global như Singleton pattern, Factory pattern, …

Ví dụ:

public class UsingStaticExample { private String subject; UsingStaticExample (String subject) { this.subject = subject; } public void print() { System.out.println("Subject = " + subject); System.out.println("Website = " + MyWebsite.WEBSITE); } public static void changeWebsite(String website) { MyWebsite.WEBSITE = website; } public static void main(String[] args) { UsingStaticExample ex1 = new UsingStaticExample("Core Java"); ex1.changeWebsite("abc.com"); ex1.print(); UsingStaticExample.changeWebsite("https://gpcoder.com"); ex1.print(); } }

Kết quả:

Subject = Core Java Website = abc.com ---- Subject = Core Java Website = https://gpcoder.com Khối static (static blocks)

Khối static được dùng để khởi tạo hoặc thay đổi giá trị của các biến static.

Nó được thực thi trước phương thức main tại thời gian tải lớp.

Một class có thể có nhiều static blocks.

Ví dụ:

public class UsingStaticExample { private static String subject; static { System.out.println("Khối static được gọi"); } static { subject = "Khối static (static blocks)"; } UsingStaticExample () { System.out.println("hàm main() được gọi"); System.out.println("Subject = " + subject); } public static void main(String[] args) { UsingStaticExample ex1 = new UsingStaticExample(); } }

Kết quả:

Khối static được gọi hàm main() được gọi Subject = Khối static (static blocks) Lớp static (static class)

Một class được có thể được đặt là static chỉ khi nó là một nested class (tức nằm trong một lớp khác). Một nested static class có thể được truy cập mà không cần một object của outer class (lớp bên ngoài).

Ví dụ:

public class UsingStaticExample { private String subject; UsingStaticExample (String subject) { this.subject = subject; } static class MyWebsite { public static String WEBSITE = "gpcoder.com"; } public void print() { System.out.println("Subject = " + subject); System.out.println("Website = " + MyWebsite.WEBSITE); } public static void main(String[] args) { UsingStaticExample ex1 = new UsingStaticExample("Core Java"); ex1.print(); } }

Kết quả:

Subject = Core Java Website = gpcoder.com Import static trong Java

Java cho phép import các thành viên tĩnh (static member) của một class hoặc package vào một class khác bằng cách sử dụng từ khóa import và sau đó sử dụng chúng như là thành viên của lớp đó.

Ví dụ:

SystemConfig.java

package com.gpcoder; public final class SystemConfig { public static final String USER_NAME = "gpcoder"; public static final String PASSWORD = "123"; public static final String EMAIL = "[email protected]"; private SystemConfig() { } }

StaticImportDemo.java

package com.gpcoder; import static com.gpcoder.SystemConfig.*; public class StaticImportDemo { public static void main(String[] args) { System.out.println("Username: " + USER_NAME); System.out.println("Password: " + PASSWORD); System.out.println("Email: " + EMAIL); } }

Như bạn thấy, khi sử dụng import static chúng ta có thể gọi trực tiếp các thành viên mà không cần phải thông qua tên class, chẳng hạn SystemConfig.USER_NAME

Ý nghĩa của từ khoá static trong Java là gì? Chúng ta có thể override (đè) một hàm private hoặc static trong Java không?

Từ khoá static biểu thị cho biến hoặc phương thức có thể được truy cập (sử dụng) mà không cần tạo ra thực thể của lớp chứa nó. Người dùng không thể override phương thức static trong Java, bởi vì kỹ thuật đè (overriding) phương thức được dựa trên quá trình gán (binding) động khi runtime (khi chương trình đang chạy) và những phương thức static được gán tĩnh trong thời gian biên dịch. Phương thức tĩnh không ràng buộc với thực thể của lớp nên phương thức tĩnh sẽ không thể override.

Chúng ta có thể truy cập một biến không tĩnh(non-static) trong một ngữ cảnh static được không?

Một biến static phụ thuộc vào lớp của nó và giá trị của nó sẽ tồn tại (giữ) cho tất cả các thực thể của lớp đó. Biến static được tạo ra khi lớp chứa đó được tải (load) bởi JVM. Nếu cố gắng truy cập vào một biến non-static (trong hàm static) mà không có trong thực thể (instance) nào thì trình biên dịch sẽ báo lỗi, bởi vì những biến đó (non-static) chưa được khởi tạo và chúng không có ràng buộc với bất kỳ thực thể nào.

Tại sao phương thức main trong Java là static?

Trả lời: Bởi vì không cần thiết phải tạo đối tượng để gọi phương thức static. Nếu nó là phương thức non-static, JVM đầu tiên tạo đối tượng và sau đó gọi phương thức main() mà có thể gây ra vấn đề về cấp phát bộ nhớ bộ nhớ phụ.

Chúng ta có thể thực thi một chương trình mà không có phương thức main()?

Trả lời: Có thể, một trong các cách đó là khối static trong phiên bản trước của JDK 1.7.

Ví dụ:

public class ProgramWithoutMain { static { System.out.println("static block is invoked"); System.exit(0); } }

Kết quả:

Trường hợp chạy ở JDK < 1.7

static block is invoked Error: Main method not found in class com.gpcoder.ProgramWithoutMain, please define the main method as: public static void main(String[] args) or a JavaFX application class must extend javafx.application.Application Từ khóa final trong java

Từ khóa final trong Java được sử dụng để hạn chế thao tác của người dùng.

Các trường hợp sử dụng:

Biến final: khi một biến được khai báo với từ khoá final, nó chỉ chứa một giá trị duy nhất trong toàn bộ chương trình (hay dễ hiểu hơn gọi là biến hằng).

Phương thức final: khi một phương thức được khai báo với từ khoá final, các class con kế thừa sẽ không thể ghi đè (override) phương thức này.

Lớp final: khi từ khoá final sử dụng cho một lớp, lớp này sẽ không thể được kế thừa.

Biến static final trống: Một biến final mà không được khởi tạo tại thời điểm khai báo được gọi là biến final trống.

Từ khóa final có thể được áp dụng với các biến, một biến final mà không có giá trị nào được gọi là biến final trống hoặc biến final không được khởi tạo. Nó chỉ có thể được khởi tạo trong constructor. Biến final trống cũng có thể là static mà sẽ chỉ được khởi tạo trong khối static. Chúng ta sẽ tìm hiểu chi tiết về những điều này.

Biến final trong Java

Trong Java, biến có thể được khai báo cùng với từ khóa static, và lúc đó bạn sẽ không thể thay đổi giá trị của biến final (nó được gọi là hằng số).

Ví dụ: Trình biên dịch sẽ thông báo lỗi khi bạn cố ý thay đổi giá trị của biến này, bởi vì biến final một khi được gán giá trị thì không bao giờ thay đổi được.

Ví dụ:Có thể thay đổi giá trị của thuộc tính của một object là final, nhưng bạn không thể khởi tạo lại object đó một lần nữa.

Ví dụ về không thể ghi đè phương thức final.

Lớp final trong Java

Ví dụ về không thể kế thừa lớp final.

Biến static final trống trong Java

Một biến static final mà không được khởi tạo tại thời điểm khai báo thì đó là biến static final trống. Nó chỉ có thể được khởi tạo trong khối static và một khi nó đã được khởi tạo thì không thể bị thay đổi.

Ví dụ:

Phương thức final có được kế thừa không?

Trả lời: Có, phương thức final được kế thừa nhưng bạn không thể ghi đè nó.

Biến final trống hoặc không được khởi tạo là gì?

Trả lời: Một biến final mà không được khởi tạo tại thời điểm khai báo được gọi là biến final trống. Biến được khởi tạo tại thời điểm tạo đối tượng và một khi nó đã được khởi tạo thì không thể bị thay đổi.

Ví dụ:

Nếu bạn khai báo bất cứ tham số nào là final, thì bạn không thể thay đổi giá trị của nó.

Tài liệu tham khảo:

Cám ơn các bạn đã theo dõi bài viết. Hẹn gặp lại ở bài viết tiếp theo.

Khái Niệm Lập Trình Hướng Đối Tượng Trong Java

Trong bài viết này, chúng ta sẽ tìm hiểu về những khái niệm cơ bản của Lập trình hướng đối tượng (OOPs Concepts).

Lập trình hướng đối tượng là một mô hình cung cấp nhiều khái niệm, chẳng hạn như kế thừa (inheritance), ràng buộc dữ liệu (data binding), đa hình (polymorphism), v.v.

Mô hình lập trình hướng đối tượng là nơi mọi thứ được biểu diễn dưới dạng một đối tượng được gọi là ngôn ngữ lập trình hướng đối tượng thực sự.

Ngày nay Java quá phát triển với mô hình lập trình hướng đối tượng nên có thể sẽ có nhiều người nhầm lẫn.

Java không phải là ngôn ngữ lập trình hướng đối tượng đầu tiên.

Chính Simula mới được coi là ngôn ngữ lập trình hướng đối tượng đầu tiên.

Và Smalltalk là ngôn ngữ lập trình hướng đối tượng thực sự đầu tiên.

Và các ngôn ngữ hướng đối tượng phổ biến là: C #, JAVA, PHP, Python, C ++, v.v.

Mục đích chính của lập trình hướng đối tượng là để thực hiện các thực thể trong thế giới thực vào máy tính thông qua: Object, Class, Abstract, Inheritance, Polymorphism…

I. OOP (Hệ thống lập trình hướng đối tượng)

Đối tượng (Object) có nghĩa là một thực thể trong thế giới thực như bút, ghế, bàn, máy tính, đồng hồ, v.v …

Lập trình hướng đối tượng là một phương pháp hoặc mô hình để thiết kế chương trình bằng cách sử dụng các lớp (class) và đối tượng (object). Nó đơn giản hóa việc phát triển và bảo trì phần mềm bằng cách cung cấp một số khái niệm:

Object: Đối tượng

Class: Lớp

Inheritance: Kế thừa

Polymorphism: Đa hình

Abstraction: Trừu tượng

Encapsulation: Đóng gói

Ngoài các khái niệm này, còn có một số thuật ngữ khác được sử dụng trong thiết kế Hướng đối tượng:

Coupling

Cohesion

Association

Aggregation

Composition

II. Các khái niệm, thuật ngữ của lập trình hướng đối tượng

1) Lập trình hướng đối tượng giúp lập trình và bảo trì dễ dàng hơn, trong khi đó, trong khi đó ngôn ngữ lập trình hướng thủ tục, không dễ quản lý nếu code khi quy mô dự án tăng.

2) OOP cung cấp khả năng ẩn dữ liệu, trong khi đó, trong ngôn ngữ lập trình hướng thủ tục, dữ liệu có thể được truy cập từ bất cứ đâu.

3) OOP cung cấp khả năng mô phỏng sự kiện trong thế giới thực hiệu quả hơn nhiều. Do đó, chúng ta có thể cung cấp giải pháp cho vấn đề từ thực tế.

IV. Sự khác biệt giữa ngôn ngữ lập trình hướng đối tượng và ngôn ngữ lập trình dựa trên đối tượng là gì?

Ngôn ngữ lập trình dựa trên đối tượng (object-based programming language) tuân theo tất cả các tính năng của lập trình hướng đối tượng ngoại trừ Kế thừa (inheritance). JavaScript và VBScript là ví dụ về ngôn ngữ lập trình dựa trên đối tượng.

Lời kết.

JavaDEV

Cập nhật thông tin chi tiết về Từ Khóa Static Trong Java Và Lập Trình Hướng Đối Tượng trên website 2atlantic.edu.vn. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất. Chúc bạn một ngày tốt lành!