01/10/2018, 16:45

Tại sao class cha có thể khởi tạo từ class con?

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import.util.Date;
DateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date =new Date();
String day=dateFormat.format(date);
System.out.println(day);

a chị cho e hỏi với , ở câu lệnh DateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); thì e tra cứu trên Web của Oracle thì cả 2 Class DateFormat và SimpleDateFormat đều là lớp nhưng SimpleDateFormat là Class con của DateFormat . và Class DateFormat không có Constructor
SimpleDateFormat() mà chỉ có Class SimpleDateFormat ms có Constructor
SimpleDateFormat() thôi chứ ạ . nên sao mà Khai báo đối tượng kia được ạ ???
còn ở dòng Code String day=dateFormat.format(date); e không hiểu cú pháp của dòng này ạ ??? nó có nghĩa là j ạ . sao lại viết thế được ạ ?

Trương Tấn Phát viết 18:49 ngày 01/10/2018

Class DateFormat không có Constructor

Có đấy bạn, nhưng nó được bảo vệ (protected) chỉ dành riêng cho các lớp con của nó.
Lớp này cũng là lớp trừu tượng (abstract), có nghĩa là không thể tạo đối tượng trực tiếp của lớp này. Khá giống với lớp giao tiếp (interface), tất nhiên có vài điểm khác.

String day=dateFormat.format(date);

Để định dạng thời gian theo chuỗi khai báo ở SimpleDateFormat
Vd
yyyy-MM-dd HH:mm:ss
=> 2018-07-22 14:28:31

Xem chi tiết về lớp DateFormat: https://docs.oracle.com/javase/7/docs/api/java/text/DateFormat.html

Bùi Gia Anh viết 18:46 ngày 01/10/2018

như vậy thì vì Class DateFormat là lớp trìu tượng nên không thể tạo được đối tượng nên do đó ta phải tạo đối tượng thông qua Contructor của lớp con của nó là Class SimpleDateFormat ạ ?

Trần Hoàn viết 18:48 ngày 01/10/2018

class “con người”

abstract class Human
// lớp trừu tượng hay không cũng không quan trọng, đều có thể xây dựng Contructor.
//Nếu là lớp trừu tượng thì không được gọi trực tiếp
//mà chỉ dùng để super() trong các lớp con.
{
	String Name;
	int Born;
	public Human(String name, int born)
	{
		Name = name;
		Born = born;
	}
}

class "giáo viên:

class Teacher extends Human
{
	String[] Classes;
	public Teacher(String name, int born, String[] classes)
	{
		super(name, born);
		if (classes != null)
		{
			Classes = new String[classes.length];
			for (int i = 0; i < Classes.length; i += 1)
				Classes[i] = classes[i];
		}
	}
}

class "học sinh:

class Student extends Human
{
	String Class;
	public Student(String name, int born, String _class)
	{
		super(name, born);
		Class = _class;
	}
}

Trong căn phòng này có 60 người

Human[] humans = new Human[60];

Người thứ nhất là giáo viên, 59 người còn lại là học sinh

humans[0] = new Teacher("Trần Hoàn", 1995, null);//Coi như thằng này không dạy lớp nào cả

humans có kiểu dữ liệu là Human[] nên human[0] có kiểu dữ liệu là Human, dòng trên tương đương với

Human a = new Teacher("Trần Hoàn", 1995, null);
humans[0] = a;

Và các học sinh:

for (int i = 1; i < 60; i += 1)
	humans[i] = new Student("noz1995", 2000, "12A");
//Coi như 59 thằng đều tên là "noz1995", sinh năm 2000 và học lớp "12A"

Như vậy, biến (reference, con trỏ) humans[i] có kiểu dữ liệu là Human dù đối tượng mà human[i] trỏ vào có thể có kiểu Teacher hoặc Student
Khi muốn biết người thứ 3 sinh năm bao nhiêu:

return Human[2].Born;

Khi muốn biết người thứ 3 học lớp nào, vì humans[2] có kiểu dữ liệu là Human không có field Class nên phải ép kiểu:

return ((Student)humans[2]).Class;
//Nếu thằng này không phải là Student thì IDE không báo lỗi, nhưng khi chạy đến dòng này sẽ bị Exception.
Bài liên quan
0