Thắc mắc về public static trong java

package classmethod;

import java.util.Scanner;

public class Student 
{
	//khai báo thuộc tính (danh từ)
	private String name = "Hải Dương";
	private int age = 20;
	
	//khai báo phương thức (động từ)
	public void showStudent()
	{
		/*khai báo public thì có thể sử dụng thuộc tính name và age
		  khai báo static thì không */
		System.out.println("name: " + name);
		System.out.println("age: " + age);
	}
	
	static int AddNumbers(int a, int b)
	{
		int sum = a + b;
		return sum;
	}
	
	public static void main(String[] args) 
	{
		//gọi phương thức có kiểu khai báo public thì phải khởi tạo đối tượng
		Student st = new Student(); //khởi tạo đối tượng
		st.showStudent();
		//gọi phương thức có kiểu khai báo static thì không
		System.out.println("Sum of two numbers : " + AddNumbers(3, 4));
		Student Array [] = new Student [5];
		Scanner sc = new Scanner(System.in);
		for(int i=0; i<Array.length; i++)
			System.out.println(Array[i]);
	}

}

Mình mới bắt đầu học java mọi người cho mình hỏi:

  1. public và static khác nhau chỗ nào
  2. Tại sao Student là tên class mà có thể khởi tạo đối tượng Student Array [] = new Student [5]; vậy ý nghĩa của việc khai báo này như thế nào
1 Like
  • Những hàm hay class được khai báo là public thì có thể được truy cập từ bất cứ đâu trong code. Cùng với nó thì có cả protected , private thì phạm vi truy cập nhỏ hơn, chỉ dùng được trong package chả hạn.
    https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

  • static nghĩa là variable hay method đó được định nghĩa cho bản thân class đó, ngược lại với instance variable, cái này thì được định nghĩa cho các object, là thực thể của class. Class thì chỉ có 1 nhưng thực thể thì có thể có rất nhiều :grin: Một static method thì có thể được gọi mà ko cần dùng tới object của class.

  • Có thể có mảng các string, mảng các số, thì ko có lý do gì ko thể có mảng các Student :grin:

4 Likes

Java vẫn chấp nhận kiểu khai báo như của bạn (kiểu của C). Tuy nhiên, tốt nhất là bạn nên khai báo như sau: Student[] array = new Student[5];
Góp ý một chút: bạn nên chú ý đến các quy tắc đặt tên biến, phương thức.

For a brighter future! http://chingovan.blogspot.com

Mình bổ sung thêm tí, trong Java có một số loại modifier (tiếng việt là định danh thì phải), trong đó 2 cái ta hay gặp nhất là:

  • Access Modifiers
  • Non Access Modifiers

** Access modifiers:
Dùng để thiết lập các quyền hay mức độ được truy nhập tới các class, variable, method hay constructor. Trong đống này thì có default, public, private, protected. Một class có gán định danh public thì ở đâu trong chương trình ta cũng có thể truy cập được nó.

** Non Access modifiers:
Thực hiện một số chức năng khác ngoài cái Access modifiers. Static thuộc thể loại này, có một số người anh em nữa như abstract, final, synchronized. Cụ thể thì TTmagic nói khá chuẩn rồi.
Nhưng thế nào là định nghĩa cho instance, thế nào là cho class, tại sao phải làm vậy. Cái này thì để đơn giản ta mình họa luôn ví dụ về Student.
Student là class và mỗi học sinh A, B, C chính là instance (thể hiện) của nó.

public class Student {
    float score;

    // Getter and Setter
    public float getScore() {
        return score;
    }

    public void setScore(float score) {
        this.score = score;
    }
}

Bình thường thì lúc kiểm tra Toán 3 đứa sẽ tự làm bài của mình, mỗi người sẽ có kết quả riêng, không ai chung ai cả, nên để lưu trữ điểm ta tạo một variable là score. Thì score chính là instance variable.

Nhưng một ngày cô giáo thấy chấm riêng thế này thì mệt quá, 3 đứa này lại còn hay nhìn bài nhau nữa, thôi thì làm chung rồi chấm một bài thôi, điểm thì điểm chung cho nó nhanh :smile_cat:
Có thể hiểu là giờ tất cả Student A, B, C chỉ chung một score, không còn 3 score riêng nữa. Ta sửa đoạn code trên thành như sau:

public class Student {
    static float score;
}

Đây chính là ý nghĩa của static, khi mà các instance đều dùng chung một thuộc tính (variable).
Ngoài ra static nó còn một số ý nghĩa nữa, mình cứ học dần là sẽ ra.

9 Likes

Ví dụ của bạn rất chuẩn :d, like ^^

1 Like

tui thích cái ex của chú

ví dụ có một class học sinh 5a
bọn họ học cùng một trường thì để thuộc tính trường static tức tất cả đối tượng trong cái class đó cùng có, ko phải khai bạn này học trường a, bạn này cũng học trường a.
còn // gọi phương thức có kiểu khai báo static thì không…
bạn thử tạo thêm đối tượng xem vẫn được nhé.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?