Xem Nhiều 2/2023 #️ Quản Lý Lớp (Class) Và Đối Tượng (Object) # Top 6 Trend | Sansangdethanhcong.com

Xem Nhiều 2/2023 # Quản Lý Lớp (Class) Và Đối Tượng (Object) # Top 6 Trend

Cập nhật thông tin chi tiết về Quản Lý Lớp (Class) Và Đối Tượng (Object) mới nhất trên website Sansangdethanhcong.com. 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.

Object – Instance (đối tượng)

Class (lớp)

Field (trường)

Property (thuộc tính)

Method (phương thức)

Constructor (phương thức khởi tạo)

Các thành phần static

Anonymous class (lớp nặc danh)

Inheritance (thừa kế)

Polymophism (đa hình)

Microsoft .NET Framework chứa hàng ngàn lớp (classes) và chúng ta đã làm quen với một số lớp như Console, Exception, v.v. trong các bài ở trên. Trong bài này chúng ta sẽ tìm hiểu kỹ hơn về cách tạo và quản lý lớp và đối tượng.

Object – instance (đối tượng – thể hiện)

Object là khái niệm cơ bản trong lập trình hướng đối tượng (object oriented programming). Đó là một cấu trúc đóng gói dữ liệu và chức năng như một đơn vị duy nhất và chỉ có thể truy cập đối tượng thông qua giao diện của nó như thuộc tính, phương thức. Quá trình tạo một đối tượng gọi là quá trình thực thể hoá hay thể hiện hoá (instantiating) bằng từ khoá new. Ví dụ tạo các đối tượng từ các lớp (sẽ tìm hiểu chi tiết ngay bên dưới) Calculator hay Integer như sau:

Calculator myCalculator = new Calculator(); int age = new int();

myCalculator và age được gọi là các instance (thực thể hay thể hiện) hay phổ biến hơn là object (đối tượng).

Trước khi có object cần có một định nghĩa chi tiết về object thông qua class.

Class (lớp)

Class giống như một bản kế hoạch chi tiết cho object. Trong ví dụ trên chúng ta đã định nghĩa class Calculator có thể tạo ra nhiều thực thể (instance) hay đối tượng, như myCalculator. Cú pháp tạo một class:

public class Tên_class { }

Các thành phần cơ bản trong class gồm các trường (fields), thuộc tính (properties), phương thức (methods) và phương thức constructor.

Field (trường)

Là các đặc điểm riêng của đối tượng, ví dụ đối tượng SinhVien có các đặc điểm riêng là firstName, lastName, sex,…Định nghĩa field giống như định nghĩa biến theo cú pháp sau:

Phạm_vi_truy_cập Kiểu_dữ_liệu Tên_field;

Phạm_vi_truy_cập là phạm vi truy cập của field (sẽ được đề cập phần tiếp theo), có thể là Private, Public, Protected hay Friend. Ví dụ:

public class Person { private  string firstName; }

Thông thường các field là các đặc điểm (hay dữ liệu) riêng tư của đối tượng và không thể truy cập trực tiếp (phạm vi truy cập private). Do đó, để truy cập các fields, chúng ta dùng các thuộc tính (properties).

Property (thuộc tính)

Cú pháp

public Kiểu_dữ_liệu Tên_thuộc_tính {get; set;}

Có thể dùng khối lệnh get (còn gọi là getter) để lấy dữ liệu từ các trường và khối lệnh set (còn gọi là setter) để gán giá trị cho trường. Cú pháp:

Phạm_vi_truy_cập  Kiểu_dữ_liệu Tên_thuộc_tính { get { } set { } }

Ví dụ thuộc tính FirstName lấy giá trị và gán giá trị cho trường firstName của class Person:

public class Person { private string firstName; public string FirstName { get { return firstName; } set { firstName = value; } } }

Chúng ta không thể truy cập trực tiếp đến field firstName mà phải thông qua thuộc tính FirstName. Cụ thể:

Person myPerson = new Person(); myPerson.FirstName = "Ngoc Minh"; Label1.Text = myPerson.FirstName;

Thuộc tính cũng có thể được khai báo với structure hay interface. Ví dụ khai báo trong structure:

struct ScreenPosition { ... public int X { get { ... } set { ... } } ... }

Khai báo trong interface:

interface IScreenPosition { int X { get; set; } int Y { get; set; } }

Thực thi các properties từ interface

struct ScreenPosition : IScreenPosition { public int X { get { ... } set { ... } } public int Y { get { ... } set { ... } } }

Các khái niệm về structure hay interface được khám phá chi tiết trong các bài kế tiếp.

Thuộc tính chỉ đọc (read only) và thuộc tính chỉ ghi (write only)

* Trong C# việc tạo thuộc tính chỉ đọc đơn giản chỉ là bỏ khối lệnh set, tạo thuộc tính chỉ ghi chỉ cần bỏ khối lệnh get.

Method (phương thức)

Nếu field hay property là đặc điểm của đối tượng thì method là hành vi hay chức năng của đối tượng. Ví dụ đối tượng Person có các đặc điểm là firstName, lastName, dateOfBirth và phương thức là Talk () để giới thiệu bản thân.

Định nghĩa method trong class giống định nghĩa hàm hay thủ tục. Ví dụ khai báo phương thức Talk trong lớp Person:

public class Person { public void Talk() { } }

Phương thức Talk có phạm vi truy cập là public (chi tiết về phạm vi trong phần sau của chương) nên có thể được truy cập trực tiếp bởi các đối tượng:

Person myPerson = new Person(); myPerson.Talk();

Constructor (phương thức khởi tạo)

Là một phương thức đặc biệt, thực thi ngay khi chúng ta tạo một instance và theo sau từ khoá new. Phương thức constructor có tên trùng với tên class. Ví dụ tạo instance của lớp Calculator như sau (constructor được in đậm):

Calculator myCalculator = new Calculator();

Nếu chúng ta không định nghĩa constructor trong class thì trình biên dịch sẽ tạo một constructor mặc định. Mặc định, trong C# phương thức constructor có tên trùng với tên lớp, không có tham số và không có giá trị trả về. Cú pháp:

public class Tên_class { public Tên_class() { } }

Quá tải constructor

Bên cạnh constructor mặc định, chúng ta có thể định nghĩa nhiều constructor trong class và các contructor này phải khác nhau về danh sách các tham số (giống quá tải phương thức). Ví dụ class Person có thể định nghĩa như sau:

public class Person { private string firstName; public Person () { firstName = "Minh"; } public Person (string fName) { firstName = fName; } }

Với cách định nghĩa class Person như trên, chúng ta có thể có hai cách (hai phiên bản) tạo instance cho Person:

Person myPerson = new Person(); Person myPerson = new Person("Minh");

Thỉnh thoảng, biến cục bộ của phương thức trùng với biến của lớp (fields), ví dụ hàm constructor thứ hai trong ví dụ trên có thể viết:

public Person (string firstName) { }

Nếu chúng ta gán firstName đến firstName của lớp, một số người bắt đầu với C# sẽ thường mắc lỗi như sau:

public Person (string firstName) { firstName = firstName; }

Trình biên dịch vẫn thực thi nhưng sẽ không phân biệt được firstName nào là biến cục bộ của phương thức, firstName nào là field của lớp. Giải pháp cho tình huống này là dùng từ khoá this – tham chiếu đến instance hay object hiện tại của lớp, đoạn mã constructor được viết lại như sau:

public Person (string firstName) { this.firstName = firstName; }

.NET cũng cung cấp cho bạn một cách khác để tạo object và khởi tạo giá trị cho thuộc tính. Cách này gọi là object initializer.Ví dụ class Person có thuộc tính FirstName:

public class Person { public string FirstName {get;set;} }

Tạo instance của Person và khởi tạo thuộc tính FirstName:

Person myPerson = new Person(){FirstName = "Minh" }; MessageBox.Show(p.FirstName);// Minh

Các thành phần tĩnh (lớp, phương thức, dữ liệu)

Khi sử dụng một số hàm toán học trong C#, ví dụ tính căn bậc hai của một số number, chúng ta có thể dùng phương thức sqrt của phương thức Math như sau:

x = Math.sqrt(number);

Cho đến thời điểm này, muốn sử dụng các thành phần của một lớp là thông qua các instance hay object của lớp đó. Tuy nhiên, ví dụ trên, chúng ta đã truy cập trực tiếp đến phương thức sqrt bằng tên của lớp (Math). sqrt là phương thức tĩnh (static) – phương thức có thể được truy cập thông qua tên lớp. Các thành phần static trong một lớp có thể được truy cập thông qua tên lớp và cũng có rất nhiều lợi ích.

Tạo ra một field có thể chia sẻ

Bằng cách tạo field kiểu static, chúng ta có thể chia sẻ field này giữa các instance hay object. Ví dụ chúng ta có hai field trong lớp Student là studentName và Count như sau:

public class Student { public static int Count = 0;// static field private string studentName; public Student(string studentName) { this.studentName = studentName; Count++; } }

Tạo 4 đối tượng từ lớp Student:

Student student1 = new Student("Minh"); Student student2 = new Student("Khiem"); Student student3 = new Student("Dung"); Student student4 = new Student("Hoang");

Mỗi lần chúng ta tạo một object, biến tĩnh Count sẽ tăng 1. Bây giờ, nếu chúng ta muốn biết có bao nhiêu đối tượng Student được tạo ra, đoạn mã như sau:

MessageBox.Show("Number of Students: " + Student.Count);

Kết quả:

Từ khoá const

Có hai cách tạo field static là:

– Dùng từ khoá static (như ví dụ trên)

– Dùng từ khoá const (như ví dụ dưới)

Ví dụ tạo field bằng từ khoá const:

public class MyMath { public const double PI = 3.14; }

Hiển thị PI:

MessageBox.Show("PI = " + MyMath.PI);

Các lớp static

C# cho phép tạo các lớp static. Lớp static có các đặc điểm sau:

– Chỉ chứa các thành phần static (field, method,…), ví dụ:

public static class MyMath { public static double Sin(double x) {...} public static double Cos(double x) {...} public static double Sqrt(double x) {...} }

– Không thể tạo các instance (với từ khoá new), ví dụ sau đây sẽ bị lỗi:

MyMath ma = new MyMath();// lỗi

– Không được thừa kế trừ Object:

Kiến thức về thừa kế sẽ được đề cập chi tiết hơn trong phần kế tiếp nhưng ví dụ sau sẽ giúp dễ hiểu hơn về đặc điểm này của lớp static. Chúng ta có lớp MyMath như sau:

public class MyMath { public const double PI = 3.14; }

Lớp MyMath1 được thừa kế từ lớp MyMath:

public class MyMath1 : MyMath { }

Hiển thị PI:

Bây giờ sửa lại lớp MyMath thành lớp static như sau:

public static class MyMath { public const double PI = 3.14; }

Sẽ không xuất hiện PI trong MyMath1:

Nếu bạn cố tình nhập PI thì sẽ báo lỗi:

– Không chứa instance constructor trừ khi dùng static constructor. Chúng ta cần phân biệt instance constructor và static constructor. Chúng ta đã đề cập đến phương thức constructor ở trên và có thể gọi là instance constructor – vì có thể gọi trực tiếp trong quá trình tạo các instance (bằng từ khoá new). Một static constructor có các đặc điểm sau:

+ Không dùng các từ khoá thể hiện phạm vi truy cập (public, private, internal, protected) và không nhận tham số.

Ví dụ lớp static MyMath với một static constructor như sau:

public static class MyMath { public const double PI = 3.14; static MyMath(){ } }

Nếu chúng ta định nghĩa static constructor có tham số sẽ bị lỗi:

Nếu chúng ta định nghĩa static constructor với các từ khoá thể hiện phạm vi truy cập (access modifiers):

+ static constructor được gọi một cách tự động để khởi tạo lớp trước khi instance đầu tiên được tạo hay bất cứ thành viên static nào đó được tham chiếu và nó chỉ thực thi chỉ một lần. Xét ví dụ sau chúng ta sẽ thấy static constructor thực hiện đầu tiên và chỉ một lần:

public class MyMath { public const double PI = 3.14; public static int count = 0; public static int num_ins = 0; static MyMath() { count++; } public MyMath() { num_ins++; } public void show() { MessageBox.Show("Instane " + num_ins + " " + "with count = " + count); } }

Tạo hai instance của lớp MyMath:

MyMath math1 = new MyMath(); math1.show(); MyMath math2 = new MyMath(); math2.show();

Kết quả count = 1 mặc dù tạo 2 instance:

+ Một static constructor không thể được gọi trực tiếp và người dùng không thể kiểm soát khi static constructor được thực thi trong chương trình.

+ Nếu static constructor phát sinh một ngoại lệ thì runtime sẽ không gọi nó lần thứ hai và vẫn giữ trạng thái không khởi tạo trong suốt vòng đời của ứng dụng.

Các lớp nặc danh (anonymous classes)

Một lớp nặc danh là một lớp không có tên. Có thể tạo lớp nặc danh dễ dàng với tử khoá new và một cặp ngoặc chứa các fields với các giá trị khởi tạo như ví dụ tạo một object của một lớp nặc danh:

var myAnonymousObject = new { Name = "John", Age = 44 };

Trong ví dụ trên, lớp nặc danh có hai fields là Name với giá trị khởi tạo John và Age với giá trị khởi tạo là 44. Khi thực thi, trình biên dịch sẽ gán tên cho lớp (và chúng ta không biết) và cũng sẽ gán các kiểu dữ liệu cho các fields tương ứng với giá trị mà nó được khởi tạo (ví dụ Age kiểu string, Age kiểu int).

Có thể truy cập đến các fields như sau:

myAnonymousObject.Name

hay

myAnonymousObject.Age

Lớp nặc danh có một số hạn chế:

Chỉ chứa các field có phạm vi public

Các field phải luôn được khởi tạo

Các field không thể là static

Không thể tạo phương thức

Inheritance (thừa kế)

Một trong những khái niệm quan trọng và rất mạnh của mô hình hướng đối tượng, bên cạnh tính đóng gói đã đề cập ở trên, là khái niệm thừa kế. Thừa kế nhằm tận dụng dữ liệu và chức năng có sẵn để phát triển, mở rộng ứng dụng ở mức cao hơn. Ví dụ các lớp Student hay Employee có thể kế thừa từ lớp Person vì chúng đều cần các đặc điểm như firstName, lastName hay phương Talk()… Lớp Person được gọi là lớp cha, lớp cơ sở (base class), hay lớp được thừa kế; các lớp Student hay Employee được gọi là lớp con hay lớp thừa kế.

Trong .NET, lớp System.Object là lớp cha của mọi lớp.

Tuỳ theo phạm vi truy cập (private, public, protected, internal) mà các thuộc tính hay phương thức của lớp cha sẽ được kế thừa từ lớp con. Một lớp muốn thừa kế một lớp khác phải dùng dấu hai chấm (:) theo cú pháp:

public class Tên_lớp_con : Tên_lớp_cha { }

Ví dụ lớp Student thừa kế từ lớp Person như sau:

public class Student : Person { }

C# chỉ hỗ trợ thừa kế đơn, nghĩa là một lớp không được phép thừa kế từ hai hay nhiều lớp (muốn dùng đa thừa kế chúng ta có thể dùng interface).

Chúng ta có thể gọi phương thức constructor của lớp cơ sở trong lớp thừa kế bằng cách sử dụng từ khoá base. Ví dụ:

class Person { public Person(string name)  { ... } ... } class Student : Person { public Student(string name) : base(name) { ... } ... }

Giả sử chúng ta có lớp Employee cũng thừa kế từ lớp Person. Như vậy, chúng ta có một lớp cha và hai lớp con như sau:

class Person { ... } class Student : Person { ... } class Employee : Person { ... }

Chúng ta không thể gán một đối tượng đến một biến có kiểu dữ liệu khác kiểu của đối tượng, ví dụ sau bị lỗi:

Student st = new Student(); Employee e = st;

Tuy nhiên, chúng ta có thể gán một đối tượng đến biến có kiểu dữ liệu được khai báo là lớp cao hơn lớp, là kiểu của đối tượng, trong cấu trúc thừa kế. Ví dụ sau hợp lệ:

Student st = new Student(); Person p = st;

Trường hợp ngược lại là không đúng như ví dụ sau:

Person p = new Person(); Student st = p;

Điều này cũng tự nhiên bởi vì không phải mọi Person đều là Student (có thể là Employee), nhưng mọi Student phải là Person.

Polymophism (đa hình)

Các phương thức trong lớp cha có thể có thể được thừa kế từ lớp con nếu phạm vi truy cập của nó là public hay protected. Mặc khác, chúng ta có thể định nghĩa lại các phương thức được thừa kế nhờ một tính năng thú vị khác trong mô hình hướng đối tượng là tính đa hình (polymophism). Ví dụ phương thức Talk() của lớp Person có thể được thừa kế và định nghĩa lại trong lớp Student. Muốn vậy, khi định nghĩa phương thức Talk trong Person phải có từ khoá virtual và phương thức Talk trong Student được định nghĩa lại với từ khoá override, cụ thể lớp Person:

Lớp Person

public class Person { public virtual void Talk() { } }

Lớp Student

public class Student : Person { public override void Talk(msg As String) { } }

Phạm vi truy cập (access modifiers)

Các phần trên chúng ta đã đề cập đến phạm vi truy cập của các thuộc tính hay phương thức của đối tượng. Cụ thể có 4 phạm vi truy cập thể hiện qua 4 từ khoá là public, private, protected và internal, có thể được mô tả như sau:

VB C# Mô tả

Public public Thuộc tính, phương thức có thể được truy cập bởi lớp sở hữu và các lớp khác.

Protected protected Thuộc tính, phương thức có thể được truy cập bởi lớp sở hữu và các lớp thừa kế nó.

Friend internal Thuộc tính, phương thức có thể được chia sẻ bởi lớp sở hữu và các lớp thừa kế và các lớp trong cùng một assembly. Một assembly là một tập hợp các files được biên dịch (như exe hay dll) chứa các code .NET có thể dùng lại.

Private private Thuộc tính, phương thức có thể được truy cập chỉ bởi lớp sở hữu.

Ví dụ:

public class A { public int x; private string y; protected double i; protected internal date j; } public class B : A { public void Init() { x = 5; i = 4.5; j = chúng tôi y = "Hello";// phát sinh lỗi vì y là private } } public class C { public void Test() { B myB = new B(); myB.x; myB.Init(); } }

Phương thức mở rộng (extension method)

Thừa kế là tính năng mạnh mẽ giúp chúng ta mở rộng tính năng cho các thành phần sẵn có. Tuy nhiên, trong một vài trường hợp, sử dụng thừa kế là không hợp lệ. Ví dụ chúng ta muốn thêm phương thức Negate() đến kiểu int dùng để hiển thị số nguyên là phủ định của số nguyên hiện tại. Sử dụng thừa kế là không khả thi vì int hay System.Int32 là một structure chứ không phải là một class nên không thể dùng thừa kế. Giải pháp cho các trường hợp này là dùng phương thức mở rộng.

Phương thức mở rộng cho phép chúng ta mở rộng một kiểu có sẵn (lớp hay structure) với các phương thức tĩnh.

Chúng ta định nghĩa một phương thức mở rộng trong một lớp static và xác định kiểu mà chúng ta cần mở rộng cho tham số đầu tiên của phương thức cùng với từ khoá this. Ví dụ chúng ta thêm phương thức Negate() đến kiểu int nên tham số đầu tiên của Negate sẽ có kiểu int và đi kèm từ khoá this như sau:

static class Util { public static int Negate(this int i) { return –i; } } int x = 12; MessageBox.Show(x.Negate().ToString());//-12

Trình biên dịch C# sẽ tự động phát hiện tất cả các phương thức mở rộng trong tất cả các lớp tĩnh nên chúng ta không cần khai báo lớp tĩnh chứa phương thức Negate (Util). Nếu sử dụng lớp Util, chúng ta có thể viết:

int x = 12; MessageBox.Show(Util.Negate(x).ToString());//-12

Đối Tượng Và Lớp (Class) Trong Java

Trong chương này, chúng ta sẽ tìm hiểu về lớp (class) và đối tượng (object) trong Java. Trong kỹ thuật lập trình hướng đối tượng, chúng ta thiết kế một chương trình bởi sử dụng các lớp và các đối tượng.

Đối tượng trong Java

Đó là một thực thể có trạng thái và hành vi, ví dụ như bàn, ghế, xe con, mèo, … Nó có thể mang tính vật lý hoặc logic. Ví dụ về logic đó là Banking system.

Một đối tượng có ba đặc trưng sau:

Ví dụ: Bút là một đối tượng. Nó có tên là Thiên Long, có màu trắng, … được xem như là trạng thái của nó. Nó được sử dụng để viết, do đó viết là hành vi của nó.

Đối tượng là sự thể hiện (Instance) của một lớp. Lớp là một Template hoặc bản thiết kế từ đó đối tượng được tạo. Vì thế đối tượng là Instance (kết quả) của một lớp.

Lớp trong Java

Một lớp là một nhóm các đối tượng mà có các thuộc tính chung. Lớp là một Template hoặc bản thiết kế từ đó đối tượng được tạo. Một lớp trong Java có thể bao gồm:

Cú pháp để khai báo một lớp

class ten_lop{ thanh_vien_du_lieu; phuong_thuc; }

Ví dụ đơn giản về Lớp và Đối tượng trong Java

Trong ví dụ này, chúng ta tạo một lớp Student có hai thành viên dữ liệu là id và name. Chúng ta đang tạo đối tượng của lớp Student bởi từ khóa new và in giá trị đối tượng.

class Student1{ int id; String name; public static void main(String args[]){ Student1 s1=new Student1(); System.out.println(s1.id); System.out.println(s1.name); } }

Một lớp có thể chứa bất kỳ loại biến sau:

Phương thức trong Java

Trong Java, một phương thức là khá giống hàm, được sử dụng để trưng bày hành vi của một đối tượng. Phương thức giúp code tăng tính tái sử dụng và tối ưu hóa code.

Từ khóa new được sử dụng để cấp phát bộ nhớ tại runtime.

Constructor trong Java:

Mỗi khi một đối tượng mới được tạo ra, ít nhất một constructor sẽ được gọi. Quy tắc chính của các constructor là chúng có cùng tên như lớp đó. Một lớp có thể có nhiều hơn một constructor.

public class Xecon{ public Xecon(){ } public Xecon(String ten){

Java cũng hỗ trợ , ở đây bạn sẽ có thể tạo chỉ một instance của một lớp.

Tạo một đối tượng trong Java:

Như đã đề cập trước đó, một lớp cung cấp bản thiết kế cho các đối tượng. Vì thế, về cơ bản, một đối tượng được tạo từ một lớp. Trong Java, từ khóa new được sử dụng để tạo một đối tượng mới.

Có ba bước khi tạo một đối tượng từ một lớp:

public class Xecon{ public Xecon(String ten){

Nếu chúng ta biên dịch và chạy chương trình, nó sẽ cho kết quả sau:

Ten xe la :Toyota

Truy cập các biến instance và các phương thức trong Java

Các biến instance và các phương thức được truy cập thông qua các đối tượng được tạo. Để truy cập một biến instance, path sẽ là như sau:

/* Dau tien, ban tao mot doi tuong */ Doituongthamchieu = new Constructor(); /* Sau do ban goi mot bien nhu sau */ Doituongthamchieu.TenBien; /* Bay gio ban co the goi mot phuong thuc lop nhu sau */ Doituongthamchieu.TenPhuongThuc();

Ví dụ:

Ví dụ này giải thích cách để truy cập các biến instance và các phương thức của một lớp:

public class Xecon{ int Giaxe; public Xecon(String ten){

Biên dịch và thực thi chương trình sẽ cho kết quả sau:

Ten xe la :Toyota Gia mua xe la :1000000000 Gia tri bien :1000000000

Ví dụ đối tượng và lớp mà duy trì bản ghi các sinh viên

Trong ví dụ này, chúng ta tạo hai đối tượng của lớp Student và khởi tạo giá trị của các đối tượng này bằng việc triệu hồi phương thức insertRecord trên nó. Ở đây, chúng ta đang hiển thị trạng thái (dữ liệu) của các đối tượng bằng việc triệu hồi phương thức displayInformation.

class Student2{ int rollno; String name; void insertRecord(int r, String n){ rollno=r; name=n; } void displayInformation(){System.out.println(rollno+" "+name);} public static void main(String args[]){ Student2 s1=new Student2(); Student2 s2=new Student2(); s1.insertRecord(111,"HoangThanh"); s2.insertRecord(222,"ThanhHuong"); s1.displayInformation(); s2.displayInformation(); } }

Ví dụ khác về lớp và đối tượng trong Java

Ví dụ khác duy trì các bản ghi của lớp Rectangle. Phần giải thích tương tự như trên:

class Rectangle{ int length; int awidth; void insert(int l,int w){ length=l; awidth=w; } void calculateArea(){System.out.println(length*awidth);} public static void main(String args[]){ Rectangle r1=new Rectangle(); Rectangle r2=new Rectangle(); r1.insert(11,5); r2.insert(3,15); r1.calculateArea(); r2.calculateArea(); } }

Các cách khác nhau để tạo đối tượng trong Java?

Có nhiều cách để tạo một đối tượng trong Java. Đó là:

Đối tượng vô danh (annonymous) trong Java

Vô danh hiểu đơn giản là không có tên. Một đối tượng mà không có tham chiếu thì được xem như là đối tượng vô danh. Nếu bạn phải sử dụng một đối tượng chỉ một lần, thì đối tượng vô danh là một hướng tiếp cận tốt.

class Calculation{ void fact(int n){ int fact=1; for(int i=1;i<=n;i++){ fact=fact*i; } System.out.println("factorial is "+fact); } public static void main(String args[]){ new Calculation().fact(5); } }

Tạo nhiều đối tượng bởi chỉ một kiểu

Chúng ta có thể tạo nhiều đối tượng bởi chỉ một kiểu như khi chúng ta thực hiện trong các kiểu gốc. Ví dụ:

Rectangle r1=new Rectangle(),r2=new Rectangle();

Ví dụ:

class Rectangle{ int length; int awidth; void insert(int l,int w){ length=l; awidth=w; } void calculateArea(){System.out.println(length*awidth);} public static void main(String args[]){ Rectangle r1=new Rectangle(),r2=new Rectangle(); r1.insert(11,5); r2.insert(3,15); r1.calculateArea(); r2.calculateArea(); } }

Kết quả là:

Output:55 45

Mọi người cho thể tham gia khóa học thứ 6 của vietjackteam (đang tuyển sinh) vào đầu tháng 03/2018 do anh Nguyễn Thanh Tuyền, admin chúng tôi trực tiếp giảng dạy tại Hà Nội. Chi tiết nội dung khóa học tham khỏa link : .Các bạn học CNTT, điện tử viễn thông, đa phương tiện, điện-điện tử, toán tin có thể theo học khóa này. Số lượng các công việc Java hoặc .NET luôn gấp ít nhất 3 lần Android hoặc iOS trên thị trường tuyển dụng.

Các bạn ở xa học không có điều kiện thời gian có thể tham dự khóa Java online để chủ động cho việc học tập. Trong tháng 4/2018, Zaidap khuyến mại giá SỐC chỉ còn 150k cho khóa học, liên hệ facebook admin chúng tôi để thanh toán chuyển khoản hoặc thẻ điện thoại, khóa học bằng Tiếng Việt với gần 100 video, các bạn có thể chủ động bất cứ lúc nào, và xem mãi mãi. Thông tin khóa học tại . Khóa học có rating 4.7/5 trên udemy từ nhận xét của các bạn học viên.

Mọi người có thể xem demo nội dung khóa học tại địa chỉ

Loạt bài hướng dẫn của chúng tôi dựa một phần trên nguồn tài liệu của: Tutorialspoint.com

Follow fanpage của team hoặc facebook cá nhân Nguyễn Thanh Tuyền để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile…. mới nhất của chúng tôi.

Bài học Java phổ biến tại vietjack.com:

Sự Khác Biệt Giữa Class Và Object Trong Java

Class và Object là hai khái niệm quan trọng nhất của ngôn ngữ lập trình hướng đối tượng (OOP), ví dụ Java. Sự khác biệt chính giữa một Class và một Object trong Java đó là Class nó là một bản thiết kế chi tiết để tạo ra các đối tượng khác nhau cùng loại. Điều này có vẻ đơn giản với nhiều bạn nhưng nếu bạn là người mới bắt đầu hoặc chỉ nghe thuật ngữ “Ngôn ngữ lập trình hướng đối tượng” thì có thể không đơn giản như vậy. Tôi đã gặp nhiều sinh viên, người mới bắt đầu và lập trình viên, những người không biết sự khác biệt giữa lớp và đối tượng và thường sử dụng chúng thay thế cho nhau. Ngoài ra API Java có các lớp như java.lang.Object và java.lang.Class cũng gây thêm nhiều nhầm lẫn cho những người mới bắt đầu. Cả hai đều là những thứ hoàn toàn khác nhau, lớp và đối tượng trong OOP là các khái niệm và có thể áp dụng cho tất cả các ngôn ngữ lập trình hướng đối tượng khác, ví dụ như C++ hoặc Scala. Mặt khác, java.lang.Class và java.lang.Object là một phần của API Java. Cùng với các khái niệm OOP khác như Tính trừu tượng, Đóng gói, Kế thừa và Đa hình, đây cũng là một trong những điều cơ bản nhất của lập trình hướng đối tượng cần được hiểu rõ ràng trước khi tiến hành lập trình. Nếu không hiểu rõ về Class và Object, bạn sẽ dễ mắc lỗi hơn, bạn không thể hiểu được chương trình đã viết và bạn sẽ rất khó tìm ra lỗi hoặc sửa lỗi hoặc xử lý các ngoại lệ trong code của bạn. Hơn nữa sự khác biệt giữa lớp và đối tượng cũng là một câu hỏi phỏng vấn lập trình rất phổ biến, thường được hỏi ở các cuộc phỏng vấn.

Sự khác biệt giữa Class và Object trong Java

1) Lớp là bản thiết kế có nghĩa là bạn có thể tạo các đối tượng khác nhau dựa trên một lớp khác nhau.

Xe là tổng quát hơn so với Mercedes, BMW hay Audi có thể được coi là đối tượng vì thực chất chúng là đề là xe nhưng có kích thước, hình dạng, màu sắc và tính năng khác nhau.

2) Một lớp có thể tương tự như cấu trúc (struct) trong ngôn ngữ lập trình C với sự khác biệt duy nhất là cấu trúc không chứa bất kỳ phương thức hoặc hàm nào, trong khi lớp trong Java chứa cả trạng thái và hành vi, trạng thái được biểu thị bằng trường trong lớp. Còn hành vi được điều khiển bởi các chức năng, còn được gọi là các phương thức trong Java, ví dụ start() sẽ thay đổi trạng thái của xe từ dừng sang bắt đầu hoặc chạy và stop() sẽ làm ngược lại.

3) Đối tượng cũng được gọi là cá thể trong Java và mọi cá thể có các giá trị khác nhau.

ví dụ như trong đoạn code sau:

class Person { private String name; public Person(String name) { chúng tôi = name; } public String getName() { return name; }}Person p1 = new Person("Rakesh");Person p2 = new Person("Jimmy");Person p3 = new Person("Peter");

Ở đây Person là một lớp vì nó định nghĩa thiết kế các đối tượng person, tức là lớp Person sẽ quy định một đối tượng person sẽ trông như thế nào, nó sẽ có thuộc tính gì, v.v… Bằng cách đó, lớp được khai báo bởi từ khóa “class” trong Java và p1, p2, p3 là các đối tượng khác nhau của lớp Person . Một điểm khác biệt giữa Class và Object trong Java là chúng ta có từ khóa class để khai báo lớp nhưng không có từ khóa đối với đối tượng. Các đối tượng được tạo đáng chú ý nhất bằng toán tử new(), gọi constructor của lớp để khởi tạo đối tượng trong Java.

Đó là tất cả về sự khác biệt giữa Class và Object trong Java. Như tôi đã nói sự khác biệt chính giữa lớp và đối tượng là Class là một thiết kế của một nhóm các đối tượng mà có các thuộc tính chung trong khi Object là một thực thể là một instance (ví dụ,trường hợp) của một lớp . Lớp sẽ xác định một đối tượng sẽ trông như thế nào và đối tượng thuộc về một lớp cụ thể. Trong ngôn ngữ lập trình hướng đối tượng, bạn có thể tìm thấy các ví dụ thực tế về lớp và đối tượng trong môi trường xung quanh, ví dụ: Nhà có thể là một lớp và nhà của bạn có thể được coi là đối tượng của lớp nhà, vì chúng là nhà nhưng nhà của bạn sẽ khác với các nhà khác.

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

+

+ /* dùng để chú thích theo khối */.

_Chú thích theo dòng bắt đầu từ cặp dấu sổ (//) cho đến dòng cuối cùng.Chú

thích theo khối bắt đầu bằng /* và kết thúc bằng */ và có thể bao gồm nhiều

có nghĩa là bất kỳ một lớp nào khi tính toán trên các đối tượng (ví dụ như các đối tượng trong Tập hợp API) sẽ không làm việc với các kiểu primitive. Các kiểu primitive sẽ phải được ánh xạ (map) thành mô hình đối tượng theo quy định để có thể sử dụng chúng. +Giao diện (interface) là một lớp thuần trừu tượng được tạo ra cho phép cài đặt đa thừa kế Java. Việc truy xất vào vùng nhớ heap chậm hơn truy xất vào vùng nhớ stack tuy nhiên java có cơ chế cho phép truy cập vào vùng nhớ heap với tốc độ xấp xỉ bằng tốc độ truy cập vào vùng nhớ stack. _Trong C++ : các class và struct hầu như đều giống nhau. Mảng chính trong C++ là con trỏ (pointer). Kiểu boolean trong C++ thực chất là một kiểu integer. Trong C++ kiểu int là 16bit và kiểu long là 32 bit. IV)Đổi kiểu : 1)Giống nhau : những đối tượng có kiểu dữ liệu này có thể chuyển đổi thành thông qua một cơ chế chuyển đổi tường minh hay ngầm định. Chuyển đổi ngầm định được hệ thống thực hiện một cách tự động, trình biên dịch sẽ thực hiện công việc này. Còn chuyển đổi tường minh diễn ra khi chúng ta gán ép một giá trị dữ liệu cho kiểu dữ liệu khác. _Chuyển đổi ngầm định : VD { short x=10 ; int y=x ; } { short a=10 ; int y=100 ; a=y ;//báo lỗi } _Ngoài ra ta còn có thể sử dụng các toán tử để chuyển kiểu : 2)Khác nhau : _Trong C++ : việc đổi kiểu được thực hiện 1 cách ngầm định.Khi ta định nghĩa kiểu dữ liệu và khi xuất ra thì chương trình sẽ tự động nhận dạng kiễu dữ liệu ta vừa nhập rồi xuất ra.Cách xuất ra hoàn toàn khác C và C#.VD : { int a ; char b ; cout<<a<<b ;//In ra 2 giá trị a,b vừa nhập. } _Trong C# : cho phép khả năng định nghĩa chuyển đổi kiểu tự tạo cho hai đối tượng bất kỳ. Hai kiểu chuyển đổi là: chuyển đổi tương đối và chuyển đổi tuyệt đối. _Trong Java : thường chỉ thân thuộc với việc chuyển kiểu giữa các kiểu primitive và khi ép kiểu lên cao hơn cho siêu lớp và thấp hơn cho các lớp con. V)Không gian tên: _Trong C# nhằm tránh xung đột giữa việc sử dụng các thư viện khác nhau từ các nhà cung cấp .Ngoài ra không gian tên được xem như là tập hợp các đối tượng và cung cấp duy nhất các định danh cho các kiểu dữ liệu và được đặt trong một cấu trúc phân cấp.Công thức : using .VD: namespace MyLib { using System; public class Tester { public static int Main() { for (int i =0; i < 10; i++) { Console.WriteLine( "i: {0}", i); } return 0; } } } _Trong Java và C++ không hỗ trợ không gian tên như C#. VI)Quản lý và cấp phát vùng nhớ: 1)Giống nhau: Phần lớn các bộ nhớ đều sử dụng cho các biến mảng và các đối tượng khác mà chúng ta khai báo. Kích cỡ của chúng là cố định và không thay đổi trong thời gian chạy chương trình.Nhưng trong trường hợp cần bộ nhớ lớn thì ta vẫn phải thực hiện các thao tác khai báo. 2)Khác nhau: _Trong C++ : sử dụng bộ nhớ động. C++ đã tích hợp 2 toán tử new và delete để thực hiện việc này. +Toán tử new : dùng để cấp phát vùng nhớ.VD: { int* i; i=new int [5]; }//Cấp phát một vùng nhớ cho mảng. { int* i; i=new int; }//Cấp phát một vùng nhớ cho con trỏ. +Toán tử delete : bộ nhớ động chỉ cần thiết trong 1 khoảng thời gian nên sau khi sử dụng ta phải giải phóng vùng nhớ đã cấp phát.Trong C++ không tự động giải phóng mà ta phải tự sử dụng toán tử.VD: delete i; _Trong Java : Do Java không sử dụng con trỏ và các phép toán con trỏ.Java chỉ kiểm tra thông tin tất cả các truy nhập đến mảng, chuổi khi thực thi để đảm bảo.Các lập trình viên không phải bận tâm đến việc cấp phát bộ nhớ . Quá trình cấp phát, giải phóng được thực hiện tự động nhờ dịch vụ thu nhặt những đối tượng không sử dụng nữa ( garbage collector). _Trong C# : quản lý và cấp phát bộ nhớ hoàn toàn giống trong Java đều sử dụng bộ gom rác ( garbage collector). VII)Hàm trùng tên : 1)Giống nhau : đây là trường hợp có 2 hàm hoặc nhiều hơn trùng tên với nhau nhưng lại khác nhau về kiểu dữ liệu hay số khai báo. _Trong C++ : hàm trùng tên còn gọi là chồng hàm (quá tải).Nghĩa là hai hàm có thể cùng tên nếu số khai báo của chúng khác nhau.Vì vậy ta có thể đặt cùng một tên cho nhiều hàm nếu chúng có tham số khác nhau hay kiểu dữ liệu của các tham số khác chúng tôi : #include int divide (int a, int b) { return (a/b); } float divide (float a, float b) { return (a/b); } int main () { int x=5,y=2; float n=5.0,m=2.0; cout << divide (x,y); cout << "n"; cout << divide (n,m); return 0; } _Trong Java : do sử dụng chung cái tên cho nhiều phương thức nên ta phải cho Java biết cần phải gọi phương thức nào để thực hiện, Java dựa vào sự khác nhau về số lượng đối cũng như kiểu dữ liệu của các đối này để phân biệt các phương thức trùng tên.VD : public class OverloadingOrder { static void print(String s, int i) { System.out.println("String: " + s +", int: " + i); } static void print(int i, String s) { System.out.println("int: " + i +", String: " + s); } public static void main(String[] args) { print("String first", 11); print(99, "Int first"); } } 2)Khác nhau : _Trong Java : sẽ thông báo lỗi nếu không tìm thấy hàm tải thích hợp, không thể trả về của hàm để phân biệt sự khác nhau giữa 2 phương thức bội tải. Mất một khoảng thời gian để tìm ra hàm thích hợp, nhiều lúc có thể dẩn đến sai sót. Do không thể định nghĩa toán tử được như trong C++ và đây cũng là một khuyết điểm của Java nhưng nhiều người xem điều này là không cần thiết. _Trong C# : không có chồng hàm mà chỉ có chồng toán tử. Nạp chồng toán tử có thể làm cho mã nguồn trực quan và những hành động của lớp khi xây dựng giống như các lớp được xây dựng sẵn. Tuy nhiên, việc nạp chồng toán tử cũng có thể làm cho mã nguồn phức tạp một cách khó quản lý nếu phá vỡ cách thể hiện thông thường để sử dụng những toán tử. Hạn chế việc sử dụng tùy tiện các nạp chồng toán tử bằng những cách sử dụng mới và những cách đặc trưng. VIII)Nhập xuất : 1)Giống nhau : _Chỉ có cách nhập xuất bằng Console của Java và C# rất giống nhau đều là sử dụng các luồng Stream để nhập xuất (I/O với file). _Về cách nhập xuất thông thường thì Java và C++ tương đối giống nhau (I/O bằng màn phím và màn hình). 2)Khác nhau : _Trong Java : đưa ra mọi lớp luồng để xử lý mọi kiểu dữ liệu. Java chia luồng thành 2 loại : luồng Byte ( By Stream) và luồng ký tự ( Character Stream ). Lớp InputStream và OutputStream là cơ sở cho mọi hướng nhập xuất hướng byte, lớp reader/writer là cơ sở cho việc đọc ghi hướng kí tự.Lớp RandomAccessFile kế thừa từ lớp Object và triển khai giao diện, Inputstream và Outputstream, đây là lớp duy nhất hỗ trợ đọc và ghi.Có thể nhập xuất 4 loại dữ liệu cơ bản sau : text ( tức là I/O dưới dạng đọc ghi các ký tự), byte ( đọc theo từng byte), primitive data ( kiểu dữ liệu nguyên thủy như int,long,float), Object ( các loại đối tượng ). + VD kiểu I/O dạng text : package Basic; import java.io.*; public class passSample { public static void main(String args[]) throws IOExcepti on { InputStreamReader isReader = new InputStreamReader( System.in); BufferedReader br = new BufferedReader(isReader); FileWriter myFile = new FileWriter("E:/test.txt"); BufferedWriter bw = new BufferedWriter(myFile); System.out.println("Nhap vao, go~ 010 de ket thuc." ); String str = new String(); while( !(str = br.readLine()).equalsIgnoreCase("010 ") ) { bw.write(str); bw.newLine(); } bw.flush(); myFile.close(); } } +VD kiểu I/O dùng InputStreamReader : import java.io.*; public class thidu { public static void main(String args[]) throws Exception { BufferedReader in = new BufferedReader(new InputStr eamReader(System.in)); System.out.println("Nhập chuỗi :") ; String VD; VD = in.readLine(); System.out.println("Chuỗi vừa nhập là : " +VD); } } _Trong C# : sử dụng Console, ứng dụng này giao tiếp với người dùng thông qua bàn phím và không có giao diện người dùng ( UI ). Trong hai ứng dụng đơn giản trên ta đã dùng phương thức WriteLine() của lớp Console.Ngoài ra còn sử dụng các luồng để nhập xuất.Có nhiều lớp thừa kế từ lớp Stream như FileSteam, MemoryStream, và NetworkStream.Có thể nhập xuất các dạng tập tin như text, binary, file.Lớp Stream có nhiều phương thức nhưng quan trọng nhất là 5 phương thức Read(), Write(), BeginRead(), BeginWrite(), Flush().Ngoài ra trong C# còn có nhập xuất đồng bộ và nhập xuất không đồng bộ. +VD cài đặt việc đọc và ghi tập tin nhị phân : using System; using System.Collections.Generic; using System.Linq; using System.Text; using chúng tôi namespace StreamReadWrite { class Program { static void Main(string[] args) { drive. DirectoryInfo[] cDirs = new DirectoryInfo(@"c:").GetDirectories(); using (StreamWriter sw = new StreamWriter("CDriveDirs.txt")) { foreach (DirectoryInfo dir in cDirs) { sw.WriteLine(dir.Name); } } string line = ""; using (StreamReader sr = new StreamReader("CDriveDirs.txt")) { while ((line = sr.ReadLine()) != null) { Console.WriteLine(line); } } } } } +VD ứng dụng Console : using System; class ChaoMung { static void Main() { Console.WriteLine("Chao Mung"); } } _Trong C++ : sử dụng 2 toán tử cin/cout để thao tác nhập/xuất. Cin chỉ bắt đầu xử lý dữ liệu từ bàn phím sau khi phím Enter được gõ.Vì vậy dù chỉ nhập một ký tự thì Cin vẫn chờ cho đến khi gõ phím Enter để kết thúc.Trong Cout toán tử << được gọi là toán tử chèn vì nó chèn dữ liệu đi vào sau nó vào dòng dữ liệu đứng trước . +VD :

Bạn đang xem bài viết Quản Lý Lớp (Class) Và Đối Tượng (Object) trên website Sansangdethanhcong.com. 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. Chúc bạn một ngày tốt lành!