30/09/2018, 22:07

Phạm vi truy cập trong Java

e có 1 package là nguoidung, trong package này có 2 class:

// class NguoiDung
package nguoidung;

import java.util.Scanner;

public class NguoiDung{
	static NguoiDung nd = new NguoiDung();
	
	public void init(){
		Scanner sc = new Scanner(System.in);
		
		System.out.println("Nhap ngay: ");
		nd.setNgay(sc.nextLine());
		System.out.println("Nhap ngay: ");
		System.out.println("Nhap ngay: ");
		System.out.println("Nhap ngay: ");
	}
}

// class Ngay

package nguoidung;

public class Ngay {
	private String ngay;
	
	public void setNgay(String ngay){
		this.ngay = ngay;
	}
	
	public String getNgay(){
		return this.ngay;
	}
	
}

cho e hỏi là: trong class NguoiDung, tại hàm init(), e gọi đến phương thức setNgay(), thì nó lại báo lỗi.
có phải là do khai báo sai phạm vi truy cập không ạ ?
theo e thì hàm setNgay() strong class Ngay đã để là public, thì do 2 class này trong cùng package thì trong class NguoiDung cũng có thể dùng được hàm setNgay() chứ nhỉ ?

kongdap viết 00:15 ngày 01/10/2018

Theo mình thì bạn không thể gọi trực tiếp phương thức từ lớp này sáng lớp khác, muốn gọi phương thức thì phải thông qua đối tượng của phương thức đó.
Giống như bạn muốn gọi phương thức setNgay từ lớp Nguoi trong phương thức Init() thì trong Init phải khởi tạo đối tượng của Ngay vd:
Ngay ngay = new Ngay(); ngay.setNgay();

Chi tiết: http://o7planning.org/vi/10319/access-modifier-trong-java

Nguyen Ca viết 00:10 ngày 01/10/2018

nd.setNgay(sc.nextLine());

nd là instance của NguoiDung chứ có phải là của Ngay đâu, lỗi là phải rồi

Xuân Hòa viết 00:22 ngày 01/10/2018

Đơn giản là do phương thức setNgay(String ngay) nó là của class Ngay thì làm sao mà đối tượng NguoiDung gọi như vậy được chứ bạn.

bongtoi viết 00:09 ngày 01/10/2018

@nguyenhuuca @xuho95 vậy làm sao để sử dụng được phương thức setNgay() trong class NguoiDung vậy các bác ?

Xuân Hòa viết 00:13 ngày 01/10/2018

Bạn có thể thêm 1 thuộc tính ngaySinh là instance của class Ngay trong class NguoiDung là được.

public class NguoiDung {
private Ngay ngaySinh;
public void init(){
		Scanner sc = new Scanner(System.in);
		
		System.out.println("Nhap ngay: ");
		ngaySinh.setNgay(sc.nextLine());

	}
}
bongtoi viết 00:15 ngày 01/10/2018

ok b, thông qua VD e cũng đã hiểu thêm phần nào về access modier, cảm ơn b nhiều nhé

Ben Nguyen viết 00:07 ngày 01/10/2018

Hey. Chào bạn. Theo mình biết vấn đề của bạn không hiểu ở đây là cách sử dụng object và class. Không liên quan đến access modifier bạn nhé. 1 lớp là tập hợp những trạng thái và hành vi chung của 1 tập các đối tượng nào đấy. 1 đối tượng là thực thể cụ thể của 1 lớp, vì vậy nó chứa các copy trạng thái và hành vi của lớp chứa nó. Nên phạm vi truy cập của 1 đối tượng là các phương thức và các biến toàn cục trong lớp nó được định nghĩa. Trong trường hợp của bạn, bạn sử dụng đối tượng của lớp NguoiDung truy xuất vào phương thức setNgay của lớp Ngay. Như vậy là vi phạm quy tắc nhé. Xa hơn nữa bạn sẽ được học tính kế thừa, thì với cách truy cập của bạn sẽ được chấp nhận nhé. Khi bạn sử dụng các access moidifier và static hãy tìm hiểu trước khi sử dụng bọn nó nhé, nếu không sẽ xảy ra những lỗi không lường được.

KhanhDinh viết 00:15 ngày 01/10/2018

Cái này bạn nên học lại về kiến thứ OOP và Access modifier là hiểu thôi.

Bài liên quan
0