# data[].attributes.headline
câu 11  các tính chất  của hướng đối tượng trong java

# data[].attributes.subject
câu 11  các tính chất  của hướng đối tượng trong java

# data[].attributes.body
1. Khái niệm tính kế thừa
Khái niệm "kế thừa" thường được dùng trong các ngôn ngữ lập trình hướng đối tượng để chuyển quan hệ tổng quát hóa và đặc biệt hóa của thế giới thực vào các chương trình máy tính. Tính kế thừa cho phép ta xây dựng một lớp mới dựa trên các định nghĩa của một lớp đã có.

2. Ví dụ về tính kế thừa
Để cài đặt tính kế thừa, chúng ta sẽ sử dụng từ khóa extends. Giả sử chúng ta có 1 lóp A kế thừa từ lớp B thì chúng ta sẽ khai báo lớp B theo cú pháp như sau:

Calculate.java

package vidu;

public class Calculation {

protected int c;

public void phepCongTien(int a, int b) {

c = a + b;

System.out.println("Tổng hai số tiền cho khách hàng = " + c);

}

public void phepTruTien(int a, int b) {

c = a - b;

System.out.println("Trừ  tiền thừa cho khách hàng= " + c);

}

}
MyCalculation.java

package vidu;

public class MyCalculation extends Calculation {

public void phepNhanTien(int a, int b) {

c = a * b;

System.out.println("Nhân 2 số  tiền cho khách hàng = " + c);

}

public static void main(String[] args) {

int a = 12, b = 2;

MyCalculation myCalculation = new MyCalculation();

myCalculation.phepCong(a, b);

myCalculation.phepTru(a, b);

myCalculation.phepNhan(a, b);

}

}

2. Khái niệm tính đóng gói

Đóng gói là sự che giấu bên trong dữ liệu riêng của mỗi đối tượng của lớp được khai báo và chỉ được truy xuất thông qua hệ thống các phương thức có sẵn của lớp (chỉ có thể gọi những phương thức có sẵn của lớp). Vì vậy, nó còn được gọi là data hiding (nghĩa là che giấu dữ liệu).

Tính đóng gói có những đặc điểm như sau:

Tạo ra cơ chế để ngăn ngừa việc gọi phương thức của lớp này tác động hay truy xuất dữ liệu của đối tượng thuộc về lớp khác.

Dữ liệu riêng (khi được khai báo là private) của mỗi đối tượng được bảo vệ khỏi sự truy xuất không hợp lệ từ bên ngoài.

Người lập trình có thể dựa vào cơ chế này để ngăn ngừa việc gán giá trị không hợp lệ vào thành phần dữ liệu của mỗi đối tượng.

Cho phép thay đổi cấu trúc bên trong của một lớp mà không làm ảnh hưởng đến những lớp bên ngoài có sử dụng lớp đó.

Ví dụ tính đóng gói
package vidu;

public class Person {

// khai báo các thuộc tính của đối tượng là private

private String stk;

private String hoTenKhachHang;

// tạo các phương thức getter/setter

// 2 phương thức getCmnd() và getHoTen() là phương thức getter

// dùng để trả về số chứng minh nhân dân và họ tên của đối tượng

// và kiểu trả về của hai phương thức này tương ứng với kiểu dữ liệu của thuộc tính

// 2 phương thức setCmnd() và setHoTen() là phương thức setter

// dùng để gán giá trị cho thuộc tính chứng minh nhân dân và họ tên của đối tượng

// trong đó tham số truyền vào của 2 phương thức này được gọi là tham số (biến cục bộ)

// và có kiểu dữ liệu tương ứng với kiểu dữ liệu của thuộc tính (biến đối tượng)

public String getStk() {

return stk;

}

// this là từ khóa có ý nghĩa là một tham chiếu đặc biệt

// chiếu tới đối tượng chủ của phương thức hiện hành

// this có thể được dùng để truy cập biến đối tượng (instance variable)

// hoặc gọi phương thức đối với đối tượng hiện hành.

// Thông thường, công dụng này của this chỉ có ích

// khi tên biến đối tượng bị trùng với tham số (biến cục bộ - local variable) của phương thức

public void setStk(String stk) {

this.stk = stk;

}

public String getHoTen() {

return hoTen;

}

public void setHoTen(String hoTen) {

this.hoTenKhachHang = hoTenKhachHang;

}

}

TestPerson.java

package vidu;

public class TestPerson {

public static void main(String[] args) {

Person person = new Person();

// gán giá trị họ tên cho đối tượng person vừa tạo thông qua setHoTen()

// và gán số chứng minh nhân dân thông qua setCmnd()

person.setHoTen("Trần Văn Bình");

person.setStk("212321678");

// truy cập đến tên của đối tượng person thông qua phương thức getHoten()

// và số chứng minh nhân dân thông qua phương thức getCmnd()

System.out.println("Tên khách hàng: " + person.getHoTen() + ", số  tài khoản: " + person.getStk());

}

}
kết quả
tên khách hàng : Chương đẹp trai
stk : 087765789

3. Khái niệm tính đa hình

Tính đa hình (Polymorphism) trong Java được hiểu là trong từng trường hợp, hoàn cảnh khác nhau thì đối tượng có hình thái khác nhau tùy thuộc vào từng ngữ cảnh. Đối tượng có tính đa hình được xem như một đối tượng đặc biệt vì có lúc đối tượng này trở thành một đối tượng khác và cũng có lúc đối tượng này trở thành một đối tượng khác nữa (tùy vào từng hoàn cảnh). Sự "nhập vai" vào các đối tượng khác nhau này giúp cho đối tượng đa hình ban đầu có thể thực hiện những hành động khác nhau của từng đối tượng cụ thể.

Để thể hiện tính đa hình, chúng ta cần đảm bảo 2 điều kiện sau:

Các lớp phải có quan hệ kế thừa với 1 lớp cha nào đó.

Phương thức đa hình phải được ghi đè (override) ở lớp con. Tính đa hình chỉ được thể hiện ghi đã ghi đè lên phương thức của lớp cha.

ví dụ
package vidu;

public class Shape {

public void show() {

System.out.println("Đây là phương thức thanh toán của tài khoản 1");

}

}

package vidu;

public class Rectangle extends Shape {

public void show() {

System.out.println("Đây là phương thức thanh toán tài khoản 2");

}

}

package vidu;

public class Square extends Shape {

public void show() {

System.out.println("Đây là phương thức thanh toán của tài khoản 3 ");

}

}

Main.java
package vidu;

public class Main {

public static void main(String[] args) {

Shape shape = new Shape();

shape.show();   // hiển thị dòng "Đây là phương thức  thanh toán của tk1"

// bản chất của shape là Shape, nhưng vì khai báo Rectangle nên chúng ta chỉ nhìn thấy những gì mà Rectangle có

// vì vậy sẽ chạy những hàm của Rectangle

shape = new Rectangle();

shape.show();   // hiển thị dòng "Đây là phương thức thanh toáncủa tk2"

// tương tự lúc này shape sẽ đóng vai trò là 1 Square

shape = new Square();

shape.show();   // hiển thị dòng "Đây là phương thức của tài khoản 3"

}

kết quả

Đây là phương thức  thanh toán của tk1
Đây là phương thức thanh toáncủa tk2
Đây là phương thức của tài khoản 3

4. Khái niệm tính trừu tượng

Tính trừu tượng trong Java là tính chất không thể hiện cụ thể mà chỉ nêu tên vấn đề. Đó là một quá trình che giấu các hoạt động bên trong và chỉ hiển thị những tính năng thiết yếu của đối tượng tới người dùng. Ví dụ: một người sử dụng điện thoại để gửi tin nhắn thì anh ta sẽ nhập nội dung tin nhắn, thông tin người nhận và ấn nút gửi. Khi anh ta bắt đầu gửi tin thì anh ấy không biết những gì diễn ra bên trong quá trình gửi mà chỉ biết được là kết quả của tin nhắn đã được gửi đến người nhận thành công hay chưa. Vì vậy trong ví dụ này, quá trình gửi tin nhắn đã được ẩn đi và chỉ hiển thị những chức năng mà người dùng cần đó là chức năng nhập nội dung tin nhắn, thông tin người nhận, kết quả gửi tin nhắn thành công hay thất bại. Đó chính là tính trừu tượng.

Cú pháp khai báo phương thức trừu tượng:

Cú pháp

1 | [access_modifier] abstract [kiểu_trả_về] [tên_phương_thức_trừu_tượng] [<đối_số_truyền_vào>];

AbstractClassDemo

package vidu;

public abstract class AbstractClassDemo {

public void hienThi() {

System.out.println("Đây là lớp trừu tượng");

}

// khai báo 1 phương thức abstract có tên là hienThi()

// phương thức này không có thân phương thức

// và có kiểu trả về là void

public abstract void show();

}
package vidu;

public abstract class Money {
private String kieuTien;

public abstract void hienThiKieuTien();
}

package vidu;

public class Dola extends Money {

@Override

public void hienThiKieuTien() {

System.out.println("USD");

}

}

package vidu;

public class TienViet extends Money {

@Override

public void hienThiKieuTien() {

System.out.println("VNĐ");

}

}

Main.java
package vidu;

public class Main {

public static void main(String[] args) {

Dola dola = new Dola();

dog.hienThiKieuTien();

Cat cat = new Cat();

cat.hienThiKieuTien();

}

}
kết quả
USD
VNĐ

# data[].attributes.body
-Khái niệm lớp trong Java:
-Lớp là một tập hợp các đối tượng có cùng trạng thái và hành vi, vì vậy nó định nghĩa các tính chất của một tập hợp các đối tượng cùng kiểu.
+VD:
public class Account {

private long soTK;

private String tenTK;

private double soTienTrongTK;

Scanner sc = new Scanner(System.in);

-Lớp được khai báo bằng việc sử dụng từ khóa class

-Thành phần của một lớp(class):
+access_modifier: phạm vi truy cập của lớp, thuộc tính và phương thức.

+Tên lớp (class name): mỗi lớp có một tên duy nhất để phân biệt với các lớp khác trong cùng một phạm vi.

+Các thuộc tính (attributes): mô tả các trường để lưu dữ liệu cho mỗi đối tượng của lớp đang mô tả hay là lưu các tham chiếu đến các đối tượng của lớp khác.

+Hệ thống các phương thức của lớp (methods): mỗi phương thức của lớp thực chất là một hàm được viết riêng cho các đối tượng của lớp, chỉ được phép gọi để tác động lên chính các đối tượng của lớp này.

# data[].attributes.body
-Khái niệm: đối tượng là một khái niệm được dùng để chỉ một thực thể cụ thể có trạng thái và hành vi. Một thực thể sẽ không được gọi là đối tượng nếu thực thể đó không thỏa mãn một trong các điều kiện trên.
-Phân biệt khái niệm lớp và đối tượng:
+Lớp là một kế hoạch chi tiết (blueprint) hoặc nguyên mẫu (prototype) gồm các biến và các phương thức (hàm) chung cho tất cả các đối tượng thuộc cùng một loại.
+Một đối tượng là thực thể cụ thể của lớp. Các đối tượng phần mềm thường được sử dụng để mô hình hoá các đối tượng trong thế giới thực trong cuộc sống hàng ngày.
-Ví Dụ:
public class Main {

static Scanner sc = new Scanner(System.in);

static void nhapTK(Account tk) {

System.out.println("Nhập số tài khoản: ");

tk.setSoTK(sc.nextInt());

sc.nextLine();

System.out.println("Nhập tên tài khoản: ");

tk.setTenTK(sc.nextLine());

tk.setSoTienTrongTK(50);

}

# data[].attributes.body
Phương thức, hay còn gọi là Method. Một số tài liệu khác gọi là Hàm. Các phương thức này là các hành động của một lớp. Sau này khi các đối tượng được tạo ra từ lớp, thì các hành động này cũng chính là các hành động hay các hành vi của đối tượng đó.

❖Cách khai báo và sử dụng phương thức
 trong Java. Cho ví dụ.
 public static int tenPhuongThuc(int a, int b) {
 // phan than phuong thuc
 }
 Ở đây:
 - public static : Là modifier.
 - int: Kiểu trả về
 - tenPhuongThuc: Tên phương thức
 - a, b: Các tham số chính thức
 - int a, int b: Danh sách các tham số

* Để sử dụng một phương thức,có thể được gọi thực hiện thông qua
 tên phương thức. . Có hai cáchgọi một phương thức, phương thức
 trả về một giá trị hoặc phương thức không trả về giá trị nào.Tiến
 trình gọi phương thức là đơn giản. Khi một chương trình gọi phương
 thức, điều khiển chương trình truyền tín hiệu tới phương thức được
 gọi. Phương thức được gọi này sau đó trả về điều khiển tới caller
 trong hai điều kiện, khi:
 +Lệnh return được thực thi.
 +Tiến tới dấu ngoặc đóng ở cuối phương thức.
 Phương thức trả về void được xem như là gọi tới một lệnh.
 VD: class myStore
 static void Hello() {
 System.out.println("Hello guest!");
 }
 public static void main(String[ ] args) {
 Hello();
 }

# data[].attributes.body
1.Để khai báo một thuộc tính thì chúng ta có cú pháp sau.

Sau này khi các đối tượng được tạo ra từ lớp, thì các thuộc tính của lớp lúc này sẽ trở thành các đặc điểm của đối tượng đó.
Cú pháp khai báo chi tiết một thuộc tính trong khi tạo lớp là như sau:
[bổ_từ_truy_cập] kiểu_dữ_liệu tên_thuộc tính;
2
bổ_từ_truy_cập: Là một từ khóa tùy chọn xác định mức độ truy cập của một biến thể hiện, nó có thể là
Các bổ từ truy cập
Trường hợp ta không đưa vào bổ từ truy cập thì bổ từ truy cập mặc định sẽ là package. Xem chi tiết về bổ từ truy cập tại phần
kiểu_dữ_liệu: Xác định kiểu dữ liệu của biến.
tên_thuộc_tính: Xác định tên của biến.
Các thuộc tính được khai báo theo cách tương tự với các biến cục bộ, nhưng phải nằm bên ngoài bất kỳ một định nghĩa phương thức nào.

# data[].attributes.headline
Câu 5. Lớp lồng nhau trong Java là gì? Cho ví dụ.

# data[].attributes.subject
Câu 5. Lớp lồng nhau trong Java là gì? Cho ví dụ.

# data[].attributes.body
1. Khái niệm:

Lớp lồng nhau (inner class) trong java là một lớp được khai báo trong lớp (class) hoặc interface khác.

Chúng ta sử dụng inner class để nhóm các lớp và các interface một cách logic lại với nhau ở một nơi để giúp cho code dễ đọc và dẽ bảo trì hơn.

Thêm vào đó, nó có thể truy cập tất cả các thành viên của lớp bên ngoài (outer class) bao gồm các thành viên dữ liệu private và phương thức.

2. Các ưu điểm của inner class trong java:

Inner class biển diễn cho một kiểu đặc biệt của mối quan hệ đó là nó có thể truy cập tất cả các thành viên (các thành viên dữ liệu và các phương thức) của lớp ngoài bao gồm cả private.

Inner class được sử dụng để giúp code dễ đọc hơn và dễ bảo trì bởi vì nó nhóm các lớp và các interface một cách logic vào trong một nơi.

Code được tối ưu hóa: tiết kiệm code hơn.

3. Các kiểu của lớp lồng nhau trong java:

a. Lớp lồng nhau non-static (inner class):

Member Inner Class: Một lớp được tạo ra bên trong một lớp và bên ngoài phương thức.

Annomynous Inner Class: Một lớp được tạo ra để implements interface hoặc extends class. Tên của nó được quyết định bởi trình biên dịch java.

Local Inner Class: Một lớp được tạo ra bên trong một phương thức.

b. Lớp lồng nhau Static:

Member Inner Class: Một lớp được tạo ra bên trong một lớp và bên ngoài phương thức.

Anonymous Inner Class: Một lớp được tạo ra để implements interface hoặc extends class. Tên của nó được quyết định bởi trình biên dịch java.

Local Inner Class: Một lớp được tạo ra bên trong một phương thức.

Static Nested Class: Một lớp static được tạo ra bên trong một lớp.

Nested Interface: Một interface được tạo ra bên trong một lớp hoặc một interface.

3. Cú pháp:
class Outer {

// code

class Inner {

// code

}

}
4. Ví dụ:
class MemberOuterExample {

private int so_tien = 30;

class Inner {

void msg() {

System.out.println("so tien la " + so_tien "$");

}

}

public static void main(String args[]) {

MemberOuterExample obj = new MemberOuterExample();

MemberOuterExample.Inner in = obj.new Inner();

in.msg();

}

}

Kết quả:
so tien la 30 $

# data[].attributes.body
Phương Nam: 6,7
Nhật: 4, 5
Hiếu: 2, 3
Chương: 10, 11
Hoàng Nam: 8, 9
Đề tài: quản lý tiền trong ngân hàng.

# data[].attributes.body
Nạp chồng là gì?

- Nạp chồng phương thức trong java xảy ra nếu một lớp có nhiều phương thức có tên giống nhau nhưng khác nhau về kiểu dữ liệu hoặc số lượng các tham số.

Các cách sử dụng nạp chồng trong java.

- Có 2 cách nạp chồng:
+ thay đổi số lượng của tham số.
+ thay đổi kiểu dữ liệu của các tham số.

Ví dụ minh họa:

class kh_hang{

void nop_tien(int n){};

void nop_tien(float n){};

void nop_tien(double n, String Date){};

}

# data[].attributes.headline
6. Nêu cách sử dụng biến this trong java? Cho ví dụ.

# data[].attributes.subject
6. Nêu cách sử dụng biến this trong java? Cho ví dụ.

# data[].attributes.body
1. Khái niệm:

Từ khóa this trong java là một biến tham chiếu được sử dụng để tham chiếu tới đối tượng của lớp hiện tại.

2. Cách sử dụng:

Tham chiếu tới biến instance của lớp hiện tại.

Gọi phương thức (method) của lớp hiện tại.

Gọi hàm dựng (constructor) của lớp hiện tại.

Trả về instance của lớp hiện tại

Được truyền như một tham số trong phương thức (method).

Được truyền như một tham số trong hàm dựng (constructor).

3. Ví dụ:
package quan_ly_ngan_hang;

public class thong_tin_khach_hang {

private int ma_khach_hang;

private String ten_khach_hang;

private String so_tien_trong_tai_khoan;

public UsingThisExample(String website, String subject)
{

ten khach hang = ten_khach_hang;

so tien trong tai khoan = so_tien_trong_tai_khoan;

}

public void print() {

System.out.println("ma khach hang = " + ma_khach_hang);

this.printten_khach_hang();

this.printso tien_trong_tai_khoan();

}

private void printWebsite() {

System.out.println("so tien trong tai khoan = " + so_tien_trong_tai_khoan);

}

private void printSubject() {

System.out.println("ten khach hang = " + ten_khach_hang);

}

public static void main(String[] args) {

UsingThisExample ex1 = new UsingThisExample("ten ngan hang", "AC");

ex1.print();

}

}

Kết quả:
ma khach hang = 0

tien trong tai khoan = null

ten khach hang = null

# data[].attributes.body
Trong Java, overriding được định nghĩa là ghi đè phương thức, có nghĩa là khi một lớp con kế thừa trực tiếp từ một lớp cha thì lớp con đó có thể định nghĩa lại một phương thức đã có trong lớp cha cho phù hợp với mục đích của nó.

Cách ghi đè phương thức

Danh sách các đối số phải giống với phương thức được ghi đè.

Kiểu trả về phải giống với kiểu trả về được khai báo trong phương thức được ghi đè của lớp cha.

Mức truy cập của phương thức ghi đè phương thức ở lớp cha không được nhỏ hơn phương thức đó trong lớp cha. Ví dụ: phương thức trong lớp cha được khai báo là public thì phương thức ghi đè phương thức đó trong lớp con không thể có phạm vi truy cập là private hoặc protected.

Một phương thức được khai báo là final hoặc static thì phương thức không thể được ghi đè.

Các hàm tạo của lớp cha không thể được ghi đè.

Vi dụ trong đề tài : quản lý tiền trong ngân hàng :

Superclass.java

package viduoverriding;

public class Superclass {

public void hienThi() {

System.out.println("Đây là số tiền hiển thị của khách hàng Superclass.");

}

}

Subclass.java
package viduoverriding;

public class Subclass extends Superclass {

@Override

public void hienThi() {

System.out.println("Đây là số tiền  của  tai khoản 1  .");

}

}

TestOverriding.java

package viduoverriding;

public class TestOverriding {

public static void main(String[] args) {

// khai báo đối tượng của lớp Superclass

Superclass superclass = new Superclass();

// khai báo đối tượng có bản chất là Superclass

// nhưng đóng vai trò là 1 Subclass

// vì vậy sẽ chạy những hàm của Subclass

Superclass subclass = new Subclass();

// gọi phương thức hienThi() của lớp cha

superclass.hienThi();

// gọi phương thức hienThi() của lớp con

subclass.hienThi();

}

}

kết quả
Đây là số tiền hiển thị của khách hàng
Đây là số tiền  của  tai khoản 1

# data[].attributes.body
Hàm tạo constructor là gì?

- Constructor trong Java (Hàm tạo trong Java) là một block code được gọi khi một thể hiện của một đối tượng được tạo và bộ nhớ được cấp phát cho đối tượng đó.
- Constructor là một loại phương thức đặc biệt được sử dụng để khởi tạo một đối tượng. Bạn cũng có thể sử dụng access modifiers trong khi khai báo Constructor.

Cách khai báo và sử dụng constructor.

- Cách khai báo:
class NameClass

{

NameClass(tham số (có thể có hoặc không)){

các câu lệnh;

}

}
- Sử dụng constructor:
+ khi ta khai báo 1 biến trong class các câu lệnh trong hàm tạo sẽ được thực hiện.

Ví dụ minh họa:

class Kh_hang

{

int tien_gui;

String ngay_gui;

public

kh_hang(int n, String D){

tien_gui = n;

ngay_gui = D;

}

}

Phân biệt sự khác nhau giữa constructor và  phương pháp thông thường.