Chương 3 Lớp trong java
Các khái niệm trong lập trình hướng đối tượng Khai báo lớp Các lớp lồng nhau Lớp Abstract Gói Phạm vi truy cập Interface Thừa kế và đa hình
Bạn đang xem trước 20 trang tài liệu Chương 3 Lớp trong java, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
LẬP TRÌNH JAVA
Chương 3
LỚP TRONG JAVA
GV: Võ Hoàng Phương Dung
2/25
Nội dung
Các khái niệm trong lập trình hướng đối tượng
Khai báo lớp
Các lớp lồng nhau
Lớp Abstract
Gói
Phạm vi truy cập
Interface
Thừa kế và đa hình
Đối tượng (Object)
• Thuộc tính (fields)
• Hành vi (methods)
3/25
Các khái niệm
Rectangle
Width: 50cm
Height: 30cm
Color: Yellow
Draw()
changeSize()
Thuộc tính (fields) là dữ liệu trình bày các đặc
điểm về một đối tượng
• Mọi đối tượng của một lớp phải có cùng các thuộc
tính nhưng giá trị của các thuộc tính thì có thể khác
nhau
• Một thuộc tính của đối tượng có thể nhận các giá trị
khác nhau tại các thời điểm khác nhau
Ví dụ: đối tượng hình chữ nhật có các thuộc tính
chiều dài, chiều rộng.
4/25
Các khái niệm
Phương thức (method) là cách đáp ứng chức
năng tác động lên dữ liệu của đối tượng
• Các phương thức xác định cách thức hoạt động
của một đối tượng và được thực thi khi đối tượng
cụ thể được tạo ra
Ví dụ: các hoạt động chung của một lớp hình
chữ nhật là tính chu vi và diện tích.
5/25
Các khái niệm
Lớp (Class)
• Là tập hợp các đối tượng cùng loại
• Là khuôn mẫu tạo ra đối tượng
• Là 1 kiểu dữ liệu phần mềm
6/25
Các khái niệm
Lớp: Rectangle
Đối tượng: RectangleA Đối tượng: RectangleB
Các tính chất của lập trình hướng đối tượng
• Tính đóng gói
• Tính thừa kế
• Tính đa hình
7/25
Các khái niệm
Tính đóng gói
• Đóng gói là tiến trình che giấu việc thực thi chi
tiết một đối tượng
• Giới hạn quyền truy cập đến các thành phần của
đối tượng
• Cơ chế cho việc che dấu thông tin
8/25
Các khái niệm
Thừa kế (Inheritance)
• Xây dựng lớp mới (subclass) từ lớp cũ (superclass)
• Lớp mới có tất cả thuộc tính và phương thức của
lớp cũ và thêm vào một số đặc tính riêng khác.
• Các lớp con có thể định nghĩa lại các phương thức
được thừa kế để xử lý các thuộc tính riêng của
chúng
• Ví dụ: Lớp xe đạp leo núi và lớp xe đạp đua là
những lớp con của lớp xe đạp. Lớp xe đạp được
gọi là lớp cha
9/25
Các khái niệm
Tính đa hình
• Phương thức cùng tên có thể được thực hiện khác
nhau đối với các đối tượng, các lớp khác nhau.
• Ví dụ: hai lớp Hình chữ nhật và hình tròn cùng có
các phương thức tính chu vi, diện tích. Nhưng
cách tính chu vi của đối tượng hình chữ nhật và
hình tròn lại khác nhau.
10/25
Các khái niệm
Cú pháp:
class name{
// Khai báo thuộc tính
// Khai báo phương thức
}
11/25
Khai báo lớp
Khai báo thuộc tính
• Cú pháp: [=value];
• Ví dụ
class Circle {
double radius = 1.0;
int color;
}
12/25
Khai báo lớp
Khai báo phương thức :
• Cú pháp: (){
;
}
• Ví dụ
public class Circle {
double radius = 1.0;
public double findArea(){
return radius * radius * 3.14159;
}
}
13/25
Khai báo lớp
Khai báo phương thức khởi tạo
• Constructor (phương thức tạo): là một dạng đặc
biệt của phương thức, được gọi để xây dựng đối
tượng
Không có giá trị trả về
Phải cùng tên với tên lớp
• Ví dụ:
class Circle {
double radius = 1.0;
Circle(){}
Circle(double rad){
radius = rad;
}
}
14/25
Khai báo lớp
Ví dụ
class Circle {
double radius = 1.0;
int color;
Circle(){}
Circle(double newRadius, int newColor){
radius = newRadius;
color=newColor;
}
void setRadius(double rad){radius=rad;}
double getRadius(){return radius;}
double findArea(){
return radius * radius * 3.14159;
}
}
15/25
Khai báo lớp
Khai báo & tạo đối tượng
Khai báo đối tượng
• Cú pháp: className objectName;
• Ví dụ: Circle myCircle;
Tạo đối tượng
• Cú pháp:
objectName = new className();
• Ví dụ:
myCircle=new Circle();
myCircle=new Circle(5);
16/25
Khai báo & tạo đối tượng
• Cú pháp: className objName=new className();
• Ví dụ:
Circle myCircle=new Circle();
Circle myCircle=new Circle(5);
17/25
Khai báo & tạo đối tượng
Tham chiếu dữ liệu của đối tượng:
• Cú pháp: objectReference.data
• Ví dụ: myCircle.radius
Gọi phương thức của đối tượng:
• Cú pháp: objectReference.method
• Ví dụ:
myCircle.findArea()
myCircle.setRadius(6);
18/25
Khai báo & tạo đối tượng
Ví dụ
public class Main {
public static void main(String args[]) {
Circle myCircle=new Circle(2,1);
doule area = myCircle.findArea()
System.out.println("Area is " + area);
}
}
19/25
Là 1 tham chiếu đến đối tượng hiện tại
Ví dụ
class Circle {
double radius = 1.0;
int color;
Circle(double radius, int color){
this.radius = newRadius;
this.color=newColor;
}
Circle(newColor){
this(0,newColor);
}
}
20/25
Mở rộng – Từ khóa this
Thuộc tính static
• Ví dụ: static double radius=1.0;
Phương thức static
• Ví dụ:
static double findArea(){
return radius * radius * 3.14159;
}
Có thể được truy cập qua tên lớp
• Ví dụ:
Circle.radius;
Circle.findArea();
21/25
Mở rộng – Từ khóa static
Tất cả các đối tượng cùng 1 lớp chia sẻ các
biến static trong lớp đó
Phương thức static
• Chỉ có thể gọi các phương thức static khác
• Chỉ truy cập thuộc tính static
• Không thể dùng từ khóa this để truy cập
22/25
Mở rộng – Từ khóa static
Java cho phép định nghĩa 1 lớp bên trong 1 lớp
khác
Cấu trúc
class OuterClass {
...
static class StaticNestedClass {
...
}
class InnerClass {
...
}
} 23/25
Các lớp lồng nhau
Ví dụ
class Outer {
int outer_x = 100;
void test() {
Inner inner = new Inner();
inner.display();
}
class Inner {
void display() {
System.out.println("display: outer_x = " + outer_x); }
}
}
public class Main {
public static void main(String args[]) {
Outer outer = new Outer();
outer.test();
}
} 24/25
Các lớp lồng nhau
Lớp bên ngoài không thể truy cập dữ liệu của
lớp bên trong trực tiếp
Ví dụ
public class Main {
int outer_x = 100;
class Inner {
int y = 10;
void display() {
System.out.println("display: outer_x = " + outer_x);
}
}
void showy() {
System.out.println(y);
}
} 25/25
Các lớp lồng nhau
Tạo lớp mới từ lớp đã tồn tại
• Lớp mới gọi là lớp con (subclass)
• Lớp cũ gọi là lớp cha (superclass)
Cú pháp: class subClass extends superClass{
}
26/25
Thừa kế
Ví dụ
27/25
Thừa kế
Shape
String color;
Shape(color);
double calculateArea();
String getColor();
Circle
double radius;
double getRadius();
Rectangle
Double length;
Double width;
Double getLength();
Double getWidth();
Ví dụ
class A {
A() { System.out.println(“Cấu trúc A"); }
}
class B extends A {
B() { System.out.println(“Cấu trúc B"); }
}
class C extends B {
C() { System.out.println(“Cấu trúc C"); }
}
public class Main{
public static void main(String args[]) {
C c = new C();
}
}
28/25
Thừa kế
Gọi phương thức khởi tạo của lớp cha
• Cú pháp: super(ds tham số)
• Ví dụ
public Circle(String myColor, double myRadius)
{
super(myColor);
radius = myRadius;
}
29/25
Thừa kế-Sử dụng từ khóa super
Truy cập 1 thành phần của lớp cha
• Cú pháp: super.tên
• Ví dụ
class Base { int i; }
class SubClass extends Base {
int i;
SubClass(int a, int b) {
super.i = a;
i = b;
}
}
30/25
Thừa kế-Sử dụng từ khóa super
Xảy ra khi 1 phương thức trong lớp con có
cùng tên và kiểu trả về như 1 phương thức
trong lớp cha
Phương thức trong lớp cha sẽ bị che khuất
Để truy cập phương thức trong lớp cha, sử
dụng từ khóa super
31/25
Thừa kế - Chồng phương thức
Ví dụ
public class Shape {
…
public double calculateArea() {
return 0;
}
}
public class Circle{
…
public double calculateArea() {
return PI * radius * radius;
}
}
32/25
Thừa kế - Chồng phương thức
So sánh với Quá tải phương thức (Overloading)
• Xảy ra khi các phương thức có cùng tên nhưng khác
nhau về tham số
• Có thể khác nhau về kiểu trả về của phương thức
Ví dụ
33/25
Thừa kế - Chồng phương thức
class OverloadDemo {
void test() {
System.out.println("No parameters"); }
void test(int a) {
System.out.println("a: " + a); }
void test(int a, int b) {
System.out.println("a and b: " + a + " "
+ b); }
double test(double a) {
System.out.println("double a: " + a);
return a * a; }
}
34/25
Thừa kế - Chồng phương thức
public class Shape {
…
public double calculateArea()
{ return 0; }
}
public class Circle{
…
public double calculateArea()
{ return PI * radius * radius; }
}
public class Rectangle{
…
public double calculateArea()
{ return width*height; }
} 35/25
Đa hình (Polymorphism)
public class Main {
public static void main(String args[]) {
Shape f = new Shape();
Rectangle r = new Rectangle(9, 5);
Circle t = new Circle(10);
Shape figref;
figref = r;
System.out.println("Area:"+figref.calculateArea());
figref = t;
System.out.println("Area:"+figref.calculateArea());
figref = f;
System.out.println("Area:"+figref.calculateArea());
}
}
36/25
Đa hình (Polymorphism)
Lớp Object
Tất cả các lớp trong Java đều từ lớp Object
37/25
Phương thức equals: so sánh 2 biến cùng tham
chiếu 1 đối tượng hay không
• Cú pháp: ObjectName1.equals(ObjectName2)
• Ví dụ: boolean b = object1.equals(object2)
Toán tử instanceof: kiểm tra 1 đối tượng có
thuộc lớp hay không
• Cú pháp: objectNam instanceof className
• Ví dụ: boolean b = object1 instanceof Rectangle
38/25
Lớp Object
Gán
• Câu lệnh đúng
Object obj = new Circle(5);
• Câu lệnh sai
Circle myCircle = obj;
Ép kiểu
Circle myCircle = (Circle)obj;
if (obj instanceof Circle) {
Circle myCircle = (Circle)obj;
}
39/25
Lớp Object
Lớp Abstract
Phương thức abstract: dùng để chỉ định 1
phương thức cần được viết chồng ở lớp con
• Cú pháp: abstract type name(parameter-list);
• Ví dụ: abstract void callme();
Lớp abstract:
• Được khai báo vơi từ khóa abstract
• Có thể có hoặc không chứa phương thức abstract
• Không thể tạo đối tượng
• Cú pháp: abstract class MyAbstractClass{
abstract type name(parameter-list);
} 40/25
abstract class MyAbstractClass {
abstract void callme();
void callmetoo()
{ System.out.println(“Day khong phai abstract"); }
}
class B extends MyAbstractClass {
void callme()
{ System.out.println(“Thuc thi lop B"); }
}
public class Main {
public static void main(String args[]) {
B b = new B();
b.callme();
b.callmetoo(); }
}
41/25
Là bộ chứa các lớp và các interface
Trong Java, gói được thể hiện là các thư mục
Tác dụng
• Nhóm các thành phần liên quan
• Giới hạn sự truy cập từ các thành phần bên ngoài
• Tổ chức code dễ quản lý
42/25
Gói (Package)
Khai báo gói
package tên_gói;
Khai báo gói đa cấp
package pkg1[.pkg2[.pkg3]];
Ví dụ
package graphics;
public class Rectangle{
…
public double calculateArea() {
return width*height;
}
}
43/25
Gói (Package)
Truy cập các thành phần thuộc gói
• Sử dụng tên:
graphics.Circle myCircle = new graphics.Circle();
• Sử dụng câu lệnh import để nạp thành phần
import graphics.Rectangle;
Rectangle myRectangle = new Rectangle();
• Sử dụng import để nạp toàn bộ gói
import graphics.*;
Circle myCircle = new Circle();
Rectangle myRectangle = new Rectangle();
44/25
Gói (Package)
Quản lý code
• Khai báo gói
• Các câu lệnh import
• Khai báo các thành phần
package MyPack;
import java.util.Date;
public class Main {
public static void main(String args[]) {
System.out.println(new Date());
}
}
45/25
Gói (Package)
Cách khai báo
[modifier] class ten_lop{
[modifier] dataType ten_thuoctinh;
[modifier] returnedValue ten_phuongthuc{
…
}
}
46/25
Phạm vi truy cập
Phạm vi truy cập
Java có 4 phạm vi truy cập cho các thành phần
• public: được truy cập bởi tất cả các thành phần
khác
• private: được truy cập chỉ bởi các thành phần cùng
lớp
• protected: được truy cập bởi chỉ các lớp con
• default (không khai báo): được truy cập bởi các
thành phần cùng gói
47/25
Vị trí & phạm vi truy cập
48/25
Phạm vi truy cập
49/25
Phạm vi truy cập
o Modifier của Alpha
Khai báo
[modifier] interface name {
return-type method-name1(parameter-list);
return-type method-name2(parameter-list);
type final-varname1 = value;
type final-varname2 = value;
// ...
return-type method-nameN(parameter-list);
type final-varnameN = value; }
Các biến ngầm định là: public, static, final
50/25
Interface
Ví dụ
interface MyInterface{
void callback(int param);
}
51/25
Interface
Tạo class từ interface
[modifier] class classname
[extends superclass]
[implements interface [,interface...]] {
// class-body
}
Trong Java, không cho phép thừa kế từ nhiều
superclass nhưng có thể thừa kế từ nhiều
interface
52/25
Interface
Ví dụ
interface MyInterface {
void callback(int param); }
class Client implements MyInterface{
public void callback(int p) {
System.out.println(“Call:" + p); }
}
public class Main {
public static void main(String args[]) {
MyInterface c = new Client();
c.callback(42);
}
}
53/25
Interface
Nếu 1 class thực thi interface không đầy đủ thì
lớp đó phải là lớp abstract
Ví dụ
interface MyInterface {
void callback(int param);
void show();
}
abstract class Incomplete implements MyInterface
{
int a, b;
public void show() {
System.out.println(a + " " + b); }
} 54/25
Interface
Interface có thể được thừa kế
interface IntefaceA {
void meth1();
void meth2();
}
interface IntefaceB extends IntefaceA {
void meth3();
}
55/25
Interface