Lý thuyết môn Cơ sở lập trình về "Method trong Java"

Lý thuyết môn Cơ sở lập trình về "Method trong Java" của Đại học Nguyễn Tất Thành với những kiến thức và thông tin bổ ích giúp sinh viên tham khảo, ôn luyện và phục vụ nhu cầu học tập của mình cụ thể là có định hướng ôn tập, nắm vững kiến thức môn học và làm bài tốt trong những bài kiểm tra, bài tiểu luận, bài tập kết thúc học phần, từ đó học tập tốt và có kết quả cao cũng như có thể vận dụng tốt những kiến thức mình đã học vào thực tiễn cuộc sống. Mời bạn đọc đón xem!
ần

lOMoARcPSD|36667950
METHOD trong JAVA
1/. Khái niệm Cơ bản:
1.1/. Class: Một lớp là một bản thiết kế hoặc nguyên mẫu do người dùng xác định mà từ đó các
đối tượng được tạo ra. Nó khai báo các thuộc tính các hoặc phương thức chung cho tất cả các
đối tượng cùng lớp.
Modifier: có thể là public (công khai); bỏ trống: (default)
Ví dụ: Sinh viên nghe giải thích
return name;
}
// method 2
public String getBreed()
/. Cấu trúc Class
1.2
)
(phần cơ bản
:
Modifier class <tên class>
khai báo các thuộc tính / thành phần (Attribute / Member) sử dụng như biến toàn cục
khai báo các constructor của class
khai báo các method của class
main
method của class
import
java.util.Scanner;
public
class
dog
{
// Instance Variables (Attributes, Member)
String
name
;
String
breed
;
int
age
;
String
color
;
// Constructor Declaration of Class
public
dog()
{
//Constructor không tham s
}
public
dog(String
name
, String
breed
,
int
age
, String
color
)
{
//Constructor có tham s
this
.
name
=
name
;
this
.
breed
=
breed
;
this
.
age
=
age
;
this
.
color
=
color
;
}
// method 1
public
String getName()
{
//phng thc tr v tên c
ươ
ảề
lOMoARcPSD|36667950
{ //ph ng th c tr v gi ng chóươ
return breed;
}
// method 3
public int getAge()
{ //ph ng th c tr v tu i chóươ
return age;
}
// method 4
public String getColor() {
//ph ng th c tr v màu chóươ
return color;
}
// method 5 public
String toOut()
{ //ph ng th c tr v thông tin c a chóươ
return("Tên Chó: "+ this.getName()+
", Gi ng: " + this.getBreed()+ ",
Tu i: " + this.getAge()+
", Màu lông: "+ this.getColor());
}
// method 6
public void toIn()
{ //ph ng th c không tr v giá tr , nh p thông tin cho chóươ
Scanner s = new Scanner(System.in);
System.out.print("Nh p name: " );
this.name = s.nextLine();
System.out.print("Nh p Breed: " );
this.breed = s.nextLine();
System.out.print("Nh p Age: " );
this.age = s.nextInt();
s.nextLine(); //x trôi l nh
System.out.print("Nh p color: " );
this.color = s.nextLine();
s.close();
}
// method main
public static void main(String[] args)
{ //khai báo đ i t ng kh i t o cho1 ượ
dog cho1 = new dog("Hachiko","Akita", 3, "vàng");
System.out.println(cho1.toOut()); //g i ph ng th c toOut() ươ
//khai báo đ i t ng cho2 ượ
lOMoARcPSD|36667950
dog cho2 = new dog();
//g i ph ng th c nh p thông tin cho2 ươ
cho2.toIn();
System.out.println(cho2.toOut()); //g i ph ng th c toOut() ươ
}
}
1.3/. Phương thức (method) trong Java khối lệnh thực hiện các chức năng, các thao tác, hành
động xử lý của Class.
Trong lập trình cấu trúc, người lập trình đã biết phương thức giống như khái niệm về hàm, thủ tục
(Function, Procedure). Còn trong lập trình hướng đối tượng, chúng ta sẽ hạn chế gọi như vậy, y
gọi chúng là phương thức, vì nó liên quan đến đối tượng trong Java có có ý nghĩa rộng hơn.
2/. Các kiểu phương thức:
Có 2 loại phương thức sau:
Standard Library Methods
User-defined Methods
Standard Library Methods: là các phương thức có trong thư viện chuẩn, các phương thức này
được dựng sẵn trong Java để sử dụng. Các thư viện chuẩn này đi kèm với Thư viện lớp Java
(JCL) trong tệp lưu trữ Java (* .jar) với JVM và JRE.
dụ như: print() phương thức của java.io.Printstream, sqrt() phương thức của lớp toán học
Math.
User-define Methods: các phương thức do người lập trình thiết lập nhiệm vụ nh toán để
trả ra một kết quả hoặc thể không trả ra kết quả. Phương thức y được gọi sử dụng như các
phương thức của thư viện.
3/. Cấu trúc phương thức:
Kết quả:
Sinh viên thảo luận
modifier
static
return type
Method name
(
Parameter List)
{
// method body
lOMoARcPSD|36667950
Modifier: qui định cách gọi phương thức, có thể là:
private: Mức độ truy cập chỉ nằm trong phạm vi 1 Class (lớp). Nó không thể được truy
cập từ bên ngoài Class.
default: Mức độ truy cập chỉ trong phạm vi package (gói). Nó không thể được truy cập
từ bên ngoài package. Nếu bạn không chỉ định bất kỳ cấp độ truy cập nào, nó sẽ là cấp
độ default (mặc định).
protecded: Mức độ truy cập trong phạm vi package (gói) và bên ngoài package thông
qua lớp con. Nếu ta không tạo lớp con, nó không thể được truy cập từ bên ngoài
package.
public: Mức độ truy cập ở khắp mọi nơi. Nó có thể được truy cập từ bên trong Class,
bên ngoài Class, trong package và bên ngoài package.
static: Từ khóa static biểu thị rằng nó có thể được truy cập mà không cần tạo đối tượng
của Class. Ví dụ, phương thức sqrt() là phương thức tĩnh, nó có thể được gọi như sau:
Math.sqrt () | sqrt() mà không cần tạo một đối tượng thể hiện của Class Math. Nguồn
tham khảo: https://www.javatpoint.com/access-modifiers
return type: kiểu kết quả của phương thức trvề, nếu void thì phương thức không trả về kết
quả nào cả.
Method name: Tên của phương thức, đặt theo qui ước sau:
Tên không được chứa bất kỳ khoảng trắng nào.
Tên không nên bắt đầu bằng các ký tự đặc biệt như ký hiệu &, $(đô la), _ (gạch dưới),
hoặc là số.
}
Access
Modifier
within
class
within
package
outside package
by subclass only
outside
package
Private
Y
N
N
N
Default
Y
Y
N
N
Protected
Y
Y
Y
N
Public
Y
Y
Y
Y
lOMoARcPSD|36667950
Không trùng tên với từ khóa, biến, hằng đã khai báo
Tên phương thức trùng tên Class: đây là phương thức khởi tạo đối tượng _
Constructor (học sau)
Tên các phương thức trùng nhau là trường hợp Overloading, Overiding (học sau)
Parameter List: danh sách các tham số cung cấp giá trị cho phương thức thực hiện, là các giá
trị được truyền đến cho phương thức (truyền bằng giá trị).
Method body: chứa các lệnh, lệnh trả về giá trị (có lệnh return giá trị nếu có kiểu trả về).
Vi dụ: Sinh viên hiểu ví dụ trước, nghe giải thích ví dụ này
lOMoARcPSD|36667950
Kết quả:
4/. Gọi phương thức:
4.1/. Cách 1_ gọi phương thức tĩnh:
tên class.tên phương thức(tham số);
4.2/. Cách 2_ gọi thông qua biến đối tượng:
Tên class tên biến đối tượng = new Tên class(); //khởi tạo biến đối tượng
tên biến đối tượng.tên phương thức(tham số);
Ví dụ: Tạo 2 gói, 2 Class như hình bên dưới và viết 2 Class chương trình
File Class1.Java:
private int xdMax(int a, int b)
package
Goi_1;
import
java.util.Scanner;
public
class
Class1
{
public
static
int
tong(
int
a
,
int
b
)
//phng thc tĩnh
ươ
{
//phng thc có tr v giá tr
ảề
ươ
return
a
+
b
;
}
public
int
tich(
int
a
,
int
b
)
{
//phng thc có tr v giá tr
ươ
ảề
return
a
*
b
;
}
lOMoARcPSD|36667950
{ //ph ng th c có tr v giá trươ
if (a>=b) return a;
else return b;
}
protected int xdMin(int a, int b)
{ //ph ng th c có tr v giá trươ
if (a>=b) return b;
else return a;
}
public static void xuat1(int a, int b) //ph ng th c tĩnhươ
{ //ph ng th c không tr v giá trươ
System.out.println("(" + a + ", " + b + ")");
}
public void xuat2(String s)
{ //ph ng th c không tr v giá trươ
System.out.println(s);
}
public static void main(String[] args)
{
Scanner s = new Scanner(System.in);
int a,b,c,d,e,f;
System.out.println("Nh p s a: " ốố );
a=s.nextInt();
System.out.println("Nh p s b: " ốố );
b=s.nextInt();
Class1 Lop = new Class1(); //Kbáo và t o m i đ i t ng
ượ //Class1.xuat1(a,b); //truy xu t đúng
xuat1(a,b); //truy xu t đúng
//Lop.xuat1(a,b); //sai, nên truy xu t đúng cách
c=Class1.tong(a, b);
Lop.xuat2("T ng 2 s : " +c);//truy xu t đúng
//xuat2("T ng 2 s : "+c); //truy xu t sai
d = Lop.tich(a,b);
Lop.xuat2("Tích 2 s : " +d);
e =
Lop.xdMax(a,b);
Lop.xuat2("Giá tr Max là: " +e);
f = Lop.xdMin(a,b);
lOMoARcPSD|36667950
File Class2.Java:
Kiểm tra: thêm các lệnh sau:
Class1.xuat2("Tích 2 s là: "+u);
//l i vì là tham chi u tĩnh đ n ph ng th c không tĩnh ế ế ươ
L.xuat2("Max 2 s là: "+ L.xdMax(x,y));
//không nhìn th y ph ng th c xdMax. ươ
L.xuat2("Max 2 s là: "+ Class1.xdMax(x,y));
//không nhìn th y ph ng th c xdMax. ươ
L.xuat2("Min 2 s là: " + L.xdMin(x,y));
//không nhìn th y ph ng th c xdMin. ươ
package
Goi_2;
import
java.util.Scanner;
import
Goi_1.Class1;
//chú ý ch này
public
class
Class2
{
public
static
void
main(String[]
args
)
{
Scanner
s
=
new
Scanner(System.
in
)
;
int
x
,
y
,
z
,
u
;
System.
out
.println(
"Nhp s x: "
)
;
x
=
s
.nextInt();
System.
out
.println(
"Nhp s y: "
)
;
y
=
s
.nextInt();
z
=
Class
1.
tong
(
x
,
y
)
;
//gi|tham chiu pthc tĩnh
Class1
L
=
new
Class1();
//Khai báo và to đi tng
ạốượ
u
=
L
.tich(
x
,
y
)
;
//gi pthc không tĩnh
//li vì là tham chiu tĩnh đn phng thc không tĩnh
ươ
ế
ế
//Class1.xuat2("Tích 2 s là: "+u);
L
.xuat2(
"Tng 2 s là: "
+
z
)
;
L
.xuat2(
"Tích 2 s là: "
+
u
)
;
s
.close();
}
}
Lop
.xuat2(
"Giá tr Min là: "
+
f
)
;
s
.close();
}
}
lOMoARcPSD|36667950
Sv hãy thảo luận và trả lời: có gọi phương thức được không?, nếu không gọi phương thức t
đó là lỗi gì?.
Sinh viên nghe giảng và chú thích cho chương trình.
Ví dụ: Viết chương trình nhập số nguyên n, thực hiện tính:
S1 = 1 + 2 + …+ n
S2= 1 + ½ + 1/3 + …+ 1/n
Sử dụng phương thức đế tính S1, S2 và gọi sử dụng đúng cách trong main.
L
.xuat2(
"Min 2 s là: "
Class1.xdMin
+
(
x
,
y
;
))
//không nhìn thy phng thc xdMin.
ươ
L
.
xuat1
(
x
,
y
;
)
//gi đc nhng không đúng cách!.
Class1.
xuat1
(
x
,
y
)
;
//gi đúng cách.
import
java.util.Scanner;
public
class
Class3
{
//phng thc tính S1
ươ
public
static
int
S1(
int
n1
)
{
int
kq
=0
;
for
(
int
i
=1
;
i
<=
n1
;
i
++)
kq
=
kq
+
i
;
return
kq
;
}
//phng thc tính S2
ươ
public
float
S2(
int
n2
)
{
float
kq
f;
=0.0
for
(
int
i
=1
;
i
<=
n2
;
i
++)
kq
=
kq
+
1/
(
float
)
i
;
return
kq
;
}
public
static
void
main(String[]
args
)
{
Scanner
s
=
new
Scanner(System.
in
;
)
int
n
,
x
;
float
y
;
String
ch
=
""
;
do
{
lOMoARcPSD|36667950
Kết quả:
5/. Overloading: (sẽ giải thích k hơn ở học phần sau / bài học Class)
Overloading liên quan đến các phương thức cùng tên, thkhác về tham số, khác kiểu
trả về của phương thức. Overloading có liên quan đến phương thức là Constructor.
Như vậy khi gọi phương thức, thì y theo tham số cung cấp overloading sẽ chọn phương
thức nào được thực hiện.
Ví dụ:
public class VDOverloading {
//ph ng th c ban đ u sum(), 2 tham s int ươ
do
{
System.
out
.print(
"Nhp s n : "
;
)
n
=
s
.nextInt();
}
while
(
n
<=0
||
n
>=20)
;
x
=
S1
(
n
)
;
//gi phng thc tĩnh
System.
out
.println(
"S1 = "
+
x
)
;
Class3
obj
=
new
Class3();
y
=
obj
.S2(
n
)
;
//gi phng thc qua đi tng
System.
out
.println(
"S2 = "
+
y
)
;
s
.nextLine();
System.
out
.print(
"có tip tc không?(C/K): "
ếụ
)
;
ch
=
s
.nextLine();
}
while
((
ch
.equals(
"c"
)==
true
||
)
(
ch
.equals(
"C"
)==
true
))
;
s
.close();
}
}
lOMoARcPSD|36667950
Kết quả:
CS Lập trình chỉ biết đến đây
6/. Overriding: (sẽ giải thích k hơn ở học phần sau / bài học Inheritance / kế thừa)
Trong ngôn ngữ lập trình hướng đối ợng Java, Overriding một tính năng cho phép một lớp
con hoặc lớp con cung cấp một triển khai cụ thể của một phương thức đã được cung cấp trong các
lớp cha (super) của nó. Khi một phương thức trong một lớp con cùng tên cùng kiểu trả về
như một phương thức trong lớp cha của nó, thì phương thức trong lớp con được cho phương
thức overriding trong lớp cha.
Ví dụ: Tạo 3 class (3 file) sau: class Parent.Java như sau:
public
int
sum(
int
x
,
int
y
)
{
return
(
x
+
y
;
)
}
//Overloaded p.thc sum(), 3 tham s int
public
int
sum(
int
x
,
int
y
,
int
z
)
{
return
(
x
+
y
+
z
)
;
}
//Overloaded p.thc sum(), 2 tham s double
public
double
sum(
double
x
,
double
y
)
{
return
(
x
+
y
;
)
}
public
static
void
main(String[]
args
)
{
VDOverloading
ol
=
new
VDOverloading();
System.
out
.println(
ol.sum
(100
, 200));
System.
out
.println(
ol.sum
(100
, 250, 390));
System.
out
.println(
ol.sum
(108.5, 20.4))
;
}
}
lOMoARcPSD|36667950
Ví dụ: Tạo class Child.Java như sau:
package Goi_1;
public class Child extends Parent //đ nh nghĩa Class con c a Parent
{
//Ph ng th c này có trong l p cha Parent ươ
@Override //khai báo override _
ghi đè void show()
{System.out.println("Ta là C c Ké, Child _ con c a K Đà."
);} }
Ví dụ: Tạo class Main.Java như sau:
Kết quả:
Sự khác nhau giữa overloading và overriding trong Java:
package
Goi_1;
class
Parent
{
void
show()
{System.
out
.println(
"Ta là K Đà, Parent _ Cha ca Cc Ké."
ủắ
)
;}
}
package
Goi_1;
class
Main
{
public
static
void
main(String[]
args
)
{
//nu đi tng là Cha (Parent) thì pthc ca cha đc g
i
ượọ
ếốượ
ứủ
Parent
obj1
=
new
Parent();
obj1
.show();
//nu đi tng là Con (Child) thì pthc ca con đc gi
ếốượ
ứủ
ượọ
//đây gi là POLYMORPHISM.
Parent
obj2
=
new
Child();
obj2
.show();
}
}
lOMoARcPSD|36667950
Sự khác nhau giữa overloading và overriding phương thức trong java được thể hiện trong bảng
sau:
Stt Nạp chồng phương thức (overloading) Ghi đè phương thức (overriding)
Nạp chồng phương thức được sử dụng để Ghi đè phương thức được sử dụng để cung 1
giúp code của chương trình dễ đọc hơn. cấp cài đặt cụ thểcho phương thức được khai
báo ở lớp cha.
Nạp chồng được thực hiện bên trong một Ghi đè phương thức xảy ra trong 2 class
2 class. quan hệ kế thừa.
Nạp chồng phương thức thì tham số phải Ghi đè phương thức thì tham số phải giống
3 khác nhau. nhau.
Nạp chồng phương thức là ví dụ về đa Ghi đè phương thức là ví dụ về đa hình lúc
4
hình lúc biên dịch. runtime.
Trong java, nạp chồng phương thức không Giá trị trả về phải giống nhau.
thể được thực hiện khi chỉ thay đổi kiểu giá trị trả về của phương thức.
Kiểu giá trị
5
trả về có thể giống hoặc khác. Giá trị trả
về có thể giống hoặc khác, nhưng tham số
phải khác nhau.
7/. Biến toàn cục và biến cục bộ: (tổng kết lại)
Trong NNLT java, biến là tên của vùng nhớ. Có 3 kiểu biến trong java, bao gồm biến local
(biến cục bộ), biến instance (biến toàn cục) và biến static (tĩnh).
Cú pháp khai báo:
lOMoARcPSD|36667950
[access modifier] datatype varName [ = value] [, varName2] [ = value2]...; access
modifier: dùng qui định cách truy xuất biến
public: biến là công khai, được sử dụng ở mọi nơi
static: biến là tĩnh, chỉ được sử dụng trong phạm vi Class
private: biến là riêng, chỉ được sử dụng trong phạm vi Class
protected: biến chỉ được sử dụng thông qua các Class con của (Sub Class)
default: mặc định
7.1/. Biến cục bộ:
Biến cục bộ được khai báo trong các phương thức, phương thức contructor.
Biến cục bộ được tạo bên trong các phương thức, contructor sẽ bị phá hủy
khi kết thúc các phương thức, contructor.
Không được sử dụng "access modifier" khi khai báo biến cục bộ. Các biến
cục bộ được lưu trên vùng nhớ stack của bộ nhớ.
Ví dụ:
public
class
VariableLocal
{
public
void
xuatKq()
{
int
n
= 10;
//Đây là bin cc b (local)
ếụộ
System.
out
.println(
"Giá tri ca n : "
+
n
;
)
}
public
void
Chao(
int
gio
)
{
String
s
;
//Đây là bin cc b (local)
ếụộ
if
(
gio
<12)
s
=
"Chào bui sáng"
;
else
if
(
gio
<20)
s
=
"Chào bui chiu"
;
else
s
=
"Chào bui ti"
ổố
;
System.
out
.println(
s
;
)
}
public
static
void
main(String[]
args
)
{
VariableLocal
bienLocal
=
new
VariableLocal();
bienLocal
.xuatKq();
int
x
= 23;
bienLocal
.Chao(
x
)
;
}
}
lOMoARcPSD|36667950
Kết quả: Sinh viên thảo luận
7.2/. Biến toàn cục:
Biến toàn cục (instance) được khai báo trong một lớp (class), bên ngoài các phương thức, phương
thức constructor.
Biến toàn cục được lưu trong bộ nhớ Heap.
Biến toàn cục được tạo khi một đối tượng được tạo bằng việc sử dụng từ khóa “new” và sẽ bị phá
hủy khi đối tượng bị phá hủy.
Biến toàn cục thể được sử dụng bởi các phương thức, constructor, block, ... Nhưng phải
được sử dụng thông qua một đối tượng cụ thể.
Ta được phép sử dụng "access modifier" khi khai báo biến toàn cục, mặc định là "default".
Biến toàn cục giá trị mặc định phụ thuộc vào kiểu dữ liệu của nó. dụ nếu là kiểu int, short,
byte thì giá trị mặc định là 0, kiểu double thì là 0.0, ... Vì vậy, ta sẽ không cần khởi tạo giá trị cho
biến instance trước khi sử dụng.
Bên trong class mà ta khai báo biến toàn cục, ta có thể gọi nó trực tiếp bằng tên khi sử dụng khắp
nơi bên trong class đó. Khi strùng tên thì nên dùng biến Class.tên biến toàn cục để phân
biệt.
Ví dụ:
public
class
Nhanvien
{
//bin instance ten kiu String, giá tr mc đnh null
ịặị
ế
public
String
ten
;
//bin instance tuoi kiu integer, giá tr mc đnh 0
ế
ịặị
private
int
tuoi
;
//s dng bin ten trong mt constructor
ửụ
ế
public
Nhanvien(String
ten
{
)
this
.
ten
=
ten
;
}
//s dng bin tuoi trong phng thc
ế
ươ
ửụ
public
void
setTuoi(
int
tuoi
)
{
this
.
tuoi
=
tuoi
;
}
//s dng bin ten, tuoi trong phng thc
ươ
ế
ửụ
public
void
show() {
System.
out
.println(
"Tên : "
+
ten
)
;
System.
out
.println(
"Tui : "
+
tuoi
;
)
}
public
static
void
main(String[]
args
)
{
lOMoARcPSD|36667950
Nhanvien nv = new Nhanvien("Nguy n Hòa Bình"
); nv.setTuoi(59); nv.show();
String ten ="Lê Th T Do" ;
System.out.println("Tên : " + ten); //s d ng bi n c c b ế
System.out.println("Tên : " + nv.ten); //s d ng bi n toàn c c
ế
}
}
Biến tĩnh (static) được khai báo trong một class với từ khóa "static" ở đầu, khai báo bên trong
Clas, bên ngoài các phương thức, constructor.
Sẽ chỉ có duy nhất một bản sao của các biến tĩnh được tạo ra, dù ta tạo nhiều đối tượng từ lớp
tương ứng.
Biến tĩnh được lưu trữ trong bộ nhớ static riêng.
Biến tĩnh được tạo khi chương trình bắt đầu chạy và chỉ bị hủy khi chương trình kết thúc.
Giá trị mặc định của biến tĩnh phụ thuộc vào kiểu dữ liệu bạn khai báo tương tự biến toàn cục
(instance).
Biến tĩnh được truy cập thông qua tên của class chứa nó, với cú pháp: TenClass.tên biến hoặc n
biến.
Trong class, các phương thức sử dụng biến static bằng cách gọi tên của nó khi phương thức đó
cũng được khai báo với từ khóa "static". Ví dụ: Sinh viên thảo luận
public class Hang
{
//bi n static ten, có ki u Stringế public static
String ten = "Máy hút b i Cannon 120" ;
//bi n static dongia, có ki u doubleế
public static double donGia = 15500.00;
public static void main(String[] args)
{
//S d ng bi n static b ng cách g i tr c ti p ế ế
System.out.println("Tên hàng : " + ten);
//S d ng bi n static b ng cách g i thông qua tên class ế
System.out.println("Giá bán : " + Hang.donGia);
Kết quả:
Sinh viên thảo luận
7.3
/. Biến tĩnh:
lOMoARcPSD|36667950
String ten = "Đèn r i Sony F2050" ;
Kết quả:
8/. Truyền tham số của Phương thức:
Phương thức trong Java có 2 cách truyền tham số: Truyền bằng giá trị (by Value) và Truyền
bằng tham chiếu (by Reference).
8.1/. Truyền bằng giá trị:
Khi chúng ta gọi một phương thức truyền một giá trị cho phương thức đó được gọi truyền
giá trị. Việc thay đổi giá trị chỉ hiệu lực trong phương thức được gọi, không hiệu lực bên
ngoài phương thức. Truyền bằng giá trị dành cho các biến, tham skhai báo với kiểu dữ liệu cơ
bản nguyên thủy như: byte, short, int, long, float, double, boolean, char, String.
Ví dụ: Sinh viên thảo luận
System.
out
.println(
"Tên hàng 1 : "
+ Hang.
ten
)
;
System.
out
.println(
"Tên hàng 2 : "
+
ten
)
;
}
}
public
class
Class1
{
int
data
= 50;
String
name
=
"H Chí Minh"
;
void
change(
int
data
)
{
data
=
data
+ 100;
//thay đi giá tr ca thành phn data
ịủ
}
void
rename(String
name
)
{
name
=
"Nguyn Tt Thành"
ễấ
;
}
public
static
void
main(String[]
args
)
{
Class1
obj
=
new
Class1();
System.
out
.println(
"Trc khi gi pt change = "
ướ
+
obj
.
data
)
;
obj
.change(500);
// passing value
System.
out
.println(
"Sau khi gi pt change = "
+
obj
.
data
)
;
lOMoARcPSD|36667950
System.out.println("Tr c khi g i pt rename: "ướ +
obj.name); obj.rename("Nguy n Ái Qu c" ); // passing value
System.out.println("Sau khi g i pt rename: " + obj.name);
}
}
8.2/. Truyền bằng tham chiếu:
Trong Java tất các các biến của lớp (đối tượng) đều là kiểu tham chiếu.
Khi chúng ta gọi một phương thức và truyền một tham chiếu (địa chỉ) cho phương thức đó thì đó
gọi truyền tham chiếu. Việc thay đổi giá trị của biến tham chiếu bên trong phương thức làm
thay đổi giá trị gốc của nó.
Tham số tham chiếu nó lưu trữ bên trong một địa chỉ (tham chiếu tác động đến địa chỉ, chứ
không phải giá trị) mà địa chỉ đó sẽ dùng để truy cập bộ nhớ khi lưu / lấy dữ liệu (giá trị) của biến
.
Ví dụ: Sinh viên thảo luận
Kết quả:
public
class
Class2
{
int
data
= 50;
void
change1(
int
data
)
{
data
=
data
+ 100;
//thay đi giá tr ca thành phn data
ịủ
}
void
change2(Class2
obj
)
{
obj
.
data
=
obj
.
data
+ 100;
//thay đi giá tr thông qua đi
tng
ượ
}
public
static
void
main(String[]
args
)
{
Class2
obj
=
new
Class2();
System.
out
.println(
"Trc khi gi pt change 1 = "
ướ
+
obj
.
data
)
;
obj
.change1(500);
// passing value
System.
out
.println(
"Sau khi gi pt change 1 = "
+
obj
.
data
)
;
lOMoARcPSD|36667950
System.out.println("Tr c khi g i pt change 2 = "ướ +
obj.data); obj.change2(obj); // passing reference
System.out.println("Sau khi g i pt change 2 = " + obj.data);
}
}
Bài tập mẫu 1:
Viết chương trình nhập 2 số nguyên a, b, thực hiện tạo các phương thức tính tổng hiệu, tích
thương của 2 số và xuất ra kết quả.
Cách 1: dùng biến toàn cục
Kết quả:
import
java.util.Scanner;
public
class
Btm1a
{
//khai báo bin toàn cc _ Instance
ế
int
a
,
b
,
tong
,
hieu
,
tich
;
double
thuong
;
//phng thc constructor
ươ
public
Btm1a()
{
//constructor to đi tng rng
ạốượ
}
public
int
tinhTong(
int
n1
,
int
n2
)
{
//phng thc tr v tng 2 s
ảềổ
ươ
return
n1
+
n2
;
}
public
int
tinhHieu(
int
n1
,
int
n2
)
{
//phng thc tr v hiu 2 s
ươ
ảềệ
return
n1
-
n2
;
}
public
int
tinhTich(
int
n1
,
int
n2
)
{
//phng thc tr v tích 2 s
ươ
ảề
return
n1
*
n2
;
}
lOMoARcPSD|36667950
Kết quả:
Cách 2: dùng biến cục bộ
public class Btm1b
import
java.util.Scanner;
lOMoARcPSD|36667950
{ public int tinhTong(int n1, int n2)
{ //ph ng th c tr v t ng 2 sươ
return n1 + n2;
}
public int tinhHieu(int n1, int n2)
{ //ph ng th c tr v hi u 2 sươ
return n1 - n2;
}
public int tinhTich(int n1, int n2)
{ //ph ng th c tr v tích 2 sươ
return n1 * n2;
}
public double tinhThuong(int n1, int n2)
{ //ph ng th c tr v th ng 2 sươ
ươ double kq; if (n2 != 0)
kq = (double) n1/n2;
else kq=-1.0;
return kq;
}
public void xuatkq(int a, int b, int tong, int hieu, int tich, double
thuong)
{ //ph ng th c không tr v giá tr , xu t n i dung c a đ i t ngươ
ượ
System.out.println("a : " + a);
System.out.println("b : " + b);
System.out.println("T ng : " + tong);
System.out.println("Hi u : " + hieu);
System.out.println("Tích : " + tich);
System.out.println("Th ng : "ươ + thuong);
}
public static void main(String[] args)
{
Scanner s = new Scanner(System.in);
int a, b, tong, hieu, tich; //khai báo bi n c c b _ Localế
double thuong=0.0; Btm1b obj = new Btm1b();
System.out.print("Nh p s a : " ốố
); a = s.nextInt();
System.out.print("Nh p s b : " ốố
); b = s.nextInt(); tong =
obj.tinhTong(a, b); hieu =
obj.tinhHieu(a, b); tich =
obj.tinhTich(a, b); thuong =
obj.tinhThuong(a, b);
lOMoARcPSD|36667950
Kết quả:
Bài tập mẫu 2: Viết chương trình thực hiện nhập 2 số thực x, y, thực hiện tính tổng x + y, tích x
* y, xác định giá trị min (x, y), xác định giá trị max (x, y).
Sử dụng biến cục bộ, phân tích thành các phương thức xử chương trình Menu thực
hiện đơn giản như sau:
1. Nhập giá trị x, y
2. Tính x + y
3. Tính x * y
4. Xác định Min(x, y)
5. Xác định Max(x, y)
6. Kết thúc chương trình
return a*b;
obj
.xuatkq(
a
,
b
,
tong
,
hieu
,
tich
,
thuong
)
;
}
}
import
java.util.Scanner;
public
class
Btm2
{
public
static
double
tong(
double
a
,
double
b
)
{
//phng thc tính tng
ươ
return
a
+
b
;
}
public
static
double
tich(
double
a
,
double
b
)
{
//phng thc tính tích
ươ
lOMoARcPSD|36667950
}
public double max(double a, double b)
{ //ph ng th c xác đ nh giá tr maxươ
if (a>=b) return a;
else return b;
}
public double min(double a, double b)
{ //ph ng th c xác đ nh giá tr minươ
if (a<b) return a;
else return b;
}
public static void main(String[] args)
{
Scanner s = new Scanner(System.in);
//khai báo các bi n c c bế
double x=0, y=0, tongxy, tichxy, maxxy, minxy;
int chon; do
{ System.out.println("1/. Nh p 2 s x, y" ốố );;
System.out.println("2/. T ng (x + y)");
System.out.println("3/. Tích (x * y)");
System.out.println("4/. Max (x, y)");
System.out.println("5/. Min (x, y)");
System.out.println("6/. K t thúc ch ng trình"ế ươ
); System.out.print("Nh n 1 s đ ch n: "
); chon = s.nextInt(); switch (chon)
lOMoARcPSD|36667950
{ case 1:
System.out.print("Nh p s x : " ốố
); x = s.nextDouble();
System.out.print("Nh p s y : " ốố
); y = s.nextDouble(); break;
case 2:
tongxy = tong(x, y);
System.out.println("T ng 2 s : " +
tongxy);
break;
case 3:
tichxy = tich(x, y);
System.out.println("Tích 2 s : " + tichxy);
break;
case 4:
Btm2 obj1 = new Btm2();
maxxy = obj1.max(x, y);
System.out.println("Max 2 s : " + maxxy);
break;
case 5: Btm2 obj2 = new Btm2();
minxy = obj2.min(x, y);
lOMoARcPSD|36667950
}
System.out.println("Min 2 s : " + minxy);
break;
}
} while (chon <=5);
System.out.println("H n g p l i."
); s.close(); }
Kết quả:
1
/. Nhp 2 s x, y
/. Tng (x + y
)
2
)
3
/. Tích (x * y
)
4
/. Max (x, y
5
/. Min (x, y
)
6
/. Kt thúc chng trình
ế
ươ
Nhn 1 s đ chn: 1
ốểọ
Nhp s x :
34
Nhp s y :
21
/. Nhp 2 s x, y
1
/. Tng (x + y
2
)
3
/. Tích (x * y
)
4
/. Max (x, y
)
5
/. Min (x, y
)
/. Kt thúc chng trình
6
ế
ươ
Nhn 1 s đ chn: 2
ốểọ
Tng 2 s: 55.0
/. Nhp 2 s x, y
1
)
2
/. Tng (x + y
3
/. Tích (x * y
)
4
/. Max (x, y
)
/. Min (x, y
)
5
6
/. Kt thúc chng trình
ế
ươ
Nhn 1 s đ chn: 3
ốểọ
Tích 2 s: 714.0
1
/. Nhp 2 s x, y
)
2
/. Tng (x + y
/. Tích (x * y
)
3
4
/. Max (x, y
)
)
5
/. Min (x, y
/. Kt thúc chng trình
6
ế
ươ
Nhn 1 s đ chn: 4
ốểọ
Max 2 s: 34.0
1
/. Nhp 2 s x, y
2
/. Tng (x + y
)
3
/. Tích (x * y
)
/. Max (x, y
)
4
5
/. Min (x, y
)
lOMoARcPSD|36667950
6
/. Kt thúc chng trình
ế
ươ
Nhn 1 s đ chn: 5
ốểọ
Min 2 s: 21.0
1
/. Nhp 2 s x, y
/. Tng (x + y
2
)
)
/. Tích (x * y
3
4
/. Max (x, y
)
5
/. Min (x, y
)
6
/. Kt thúc chng trình
ế
ươ
Nhn 1 s đ chn: 6
ốểọ
Hn gp li.
| 1/26

Preview text:

lOMoARcPSD| 36667950 METHOD trong JAVA
1/. Khái niệm Cơ bản:
1.1/. Class: Một lớp là một bản thiết kế hoặc nguyên mẫu do người dùng xác định mà từ đó các
đối tượng được tạo ra. Nó khai báo các thuộc tính các hoặc phương thức chung cho tất cả các đối tượng cùng lớp. 1.2/. Cấu trú
c Class :(phần cơ bản) Modifier class {
khai báo các thuộc tính / thành phần (Attribute / Member) sử dụng như biến toàn cục
khai báo các constructor của class
khai báo các method của class main method của class }
Modifier: có thể là public (công khai); bỏ trống: (default)
Ví dụ: Sinh viên nghe giải thích
import java.util.Scanner;
public class dog {
// Instance Variables (Attributes, Member) String name ; String breed ; int age ; String color ;
// Constructor Declaration of Class public dog()
{ //Constructor không tham s ố }
public dog(String name , String breed , int age , String color )
{ //Constructor có tham s ố this . name = name ;
this . breed = breed ; this . age = age ;
this . color = color ; } // method 1
public String getName() { //phng thc tr v tên chó ươ ứ ảề return name; } // method 2
public String getBreed() lOMoARcPSD| 36667950
{ //ph ng th c tr v gi ng chóươ ứ ả ề ố return breed; } // method 3
public int getAge()
{ //ph ng th c tr v tu i chóươ ứ ả ề ổ return age; } // method 4
public String getColor() {
//ph ng th c tr v màu chóươ ứ ả ề return color; } // method 5 public String toOut()
{ //ph ng th c tr v thông tin c a chóươ ứ
ả ề ủ return("Tên Chó: "+ this.getName()+
", Gi ng: "ố + this.getBreed()+ ",
Tu i: "ổ + this.getAge()+
", Màu lông: "+ this.getColor()); } // method 6
public void toIn()
{ //ph ng th c không tr v giá tr , nh p thông tin cho chóươ ứ ả ề ị ậ
Scanner s = new Scanner(System.in);
System.out.print("Nh p name: "ậ );
this.name = s.nextLine();
System.out.print("Nh p Breed: "ậ );
this.breed = s.nextLine();
System.out.print("Nh p Age: "ậ );
this.age = s.nextInt();
s.nextLine(); //x lý trôi l nhử ệ
System.out.print("Nh p color: "ậ ); this.color = s.nextLine(); s.close(); } // method main
public static void main(String[] args)
{ //khai báo đ i t ng và kh i t o cho1ố ượ ở ạ
dog cho1 = new dog("Hachiko","Akita", 3, "vàng");
System.out.println(cho1.toOut()); //g i ph ng th c toOut()ọ ươ ứ
//khai báo đ i t ng cho2ố ượ lOMoARcPSD| 36667950 dog cho2 = new dog();
//g i ph ng th c nh p thông tin cho2ọ ươ ứ ậ cho2.toIn();
System.out.println(cho2.toOut()); //g i ph ng th c toOut()ọ ươ ứ } }
Kết quả: Sinh viên thảo luận
1.3/. Phương thức (method) trong Java là khối lệnh thực hiện các chức năng, các thao tác, hành động xử lý của Class.
Trong lập trình cấu trúc, người lập trình đã biết phương thức giống như khái niệm về hàm, thủ tục
(Function, Procedure). Còn trong lập trình hướng đối tượng, chúng ta sẽ hạn chế gọi như vậy, hãy
gọi chúng là phương thức, vì nó liên quan đến đối tượng trong Java có có ý nghĩa rộng hơn.
2/. Các kiểu phương thức:
Có 2 loại phương thức sau: Standard Library Methods User-defined Methods
Standard Library Methods: là các phương thức có trong thư viện chuẩn, các phương thức này
được dựng sẵn trong Java để sử dụng. Các thư viện chuẩn này đi kèm với Thư viện lớp Java
(JCL) trong tệp lưu trữ Java (* .jar) với JVM và JRE.
Ví dụ như: print() là phương thức của java.io.Printstream, sqrt() là phương thức của lớp toán học Math.
User-define Methods: là các phương thức do người lập trình thiết lập có nhiệm vụ tính toán để
trả ra một kết quả hoặc có thể không trả ra kết quả. Phương thức này được gọi sử dụng như các
phương thức của thư viện.
3/. Cấu trúc phương thức:
modifier static return type Method name ( Parameter List) { // method body lOMoARcPSD| 36667950 }
Modifier: qui định cách gọi phương thức, có thể là:
private: Mức độ truy cập chỉ nằm trong phạm vi 1 Class (lớp). Nó không thể được truy cập từ bên ngoài Class.
default: Mức độ truy cập chỉ trong phạm vi package (gói). Nó không thể được truy cập
từ bên ngoài package. Nếu bạn không chỉ định bất kỳ cấp độ truy cập nào, nó sẽ là cấp
độ default (mặc định).
protecded: Mức độ truy cập trong phạm vi package (gói) và bên ngoài package thông
qua lớp con. Nếu ta không tạo lớp con, nó không thể được truy cập từ bên ngoài package.
public: Mức độ truy cập ở khắp mọi nơi. Nó có thể được truy cập từ bên trong Class,
bên ngoài Class, trong package và bên ngoài package.
static: Từ khóa static biểu thị rằng nó có thể được truy cập mà không cần tạo đối tượng
của Class. Ví dụ, phương thức sqrt() là phương thức tĩnh, nó có thể được gọi như sau:
Math.sqrt () | sqrt() mà không cần tạo một đối tượng thể hiện của Class Math. Nguồn
tham khảo: https://www.javatpoint.com/access-modifiers Access within within outside package outside Modifier class package by subclass only package Private Y N N N Default Y Y N N Protected Y Y Y N Public Y Y Y Y
return type: kiểu kết quả của phương thức trả về, nếu là void thì phương thức không trả về kết quả nào cả.
Method name: Tên của phương thức, đặt theo qui ước sau:
• Tên không được chứa bất kỳ khoảng trắng nào.
• Tên không nên bắt đầu bằng các ký tự đặc biệt như ký hiệu &, $(đô la), _ (gạch dưới), hoặc là số. lOMoARcPSD| 36667950
• Không trùng tên với từ khóa, biến, hằng đã khai báo
• Tên phương thức trùng tên Class: đây là phương thức khởi tạo đối tượng _ Constructor (học sau)
• Tên các phương thức trùng nhau là trường hợp Overloading, Overiding (học sau)
Parameter List: danh sách các tham số cung cấp giá trị cho phương thức thực hiện, là các giá
trị được truyền đến cho phương thức (truyền bằng giá trị).
Method body: chứa các lệnh, lệnh trả về giá trị (có lệnh return giá trị nếu có kiểu trả về).
Vi dụ: Sinh viên hiểu ví dụ trước, nghe giải thích ví dụ này lOMoARcPSD| 36667950 Kết quả:
4/. Gọi phương thức:
4.1/. Cách 1_ gọi phương thức tĩnh:
tên class.tên phương thức(tham số);
4.2/. Cách 2_ gọi thông qua biến đối tượng:
Tên class tên biến đối tượng = new Tên class(); //khởi tạo biến đối tượng
tên biến đối tượng.tên phương thức(tham số);
Ví dụ: Tạo 2 gói, 2 Class như hình bên dưới và viết 2 Class chương trình File Class1.Java: package Goi_1;
import java.util.Scanner;
public class Class1 {
public static int tong( int a , int b ) //phng thc tĩnh ươ ứ { //phng thc có tr v giá tr ươ ứ ảề ị return a + b ; }
public int tich( int a , int b ) { //phng thc có tr v giá tr ươ ứ ảề ị return a * b ; }
private int xdMax(int a, int b) lOMoARcPSD| 36667950
{ //ph ng th c có tr v giá trươ ứ
ả ề ị if (a>=b) return a; else return b; }
protected int xdMin(int a, int b)
{ //ph ng th c có tr v giá trươ ứ
ả ề ị if (a>=b) return b; else return a; }
public static void xuat1(int a, int b) //ph ng th c tĩnhươ ứ
{ //ph ng th c không tr v giá trươ ứ ả ề ị
System.out.println("(" + a + ", " + b + ")"); }
public void xuat2(String s)
{ //ph ng th c không tr v giá trươ ứ ả ề ị
System.out.println(s); }
public static void main(String[] args) {
Scanner s = new Scanner(System.in); int a,b,c,d,e,f;
System.out.println("Nh p s a: "ậ ốố ); a=s.nextInt();
System.out.println("Nh p s b: "ậ ốố ); b=s.nextInt();
Class1 Lop = new Class1(); //Kbáo và t o m i đ i t ng ạ
ớ ố ượ //Class1.xuat1(a,b); //truy xu t đúngấ
xuat1(a,b); //truy xu t đúngấ //Lop.xuat1(a,b);
//sai, nên truy xu t đúng cáchấ c=Class1.tong(a, b); Lop.xuat2("T ng 2 s : "ổ ố +c);//truy xu t đúngấ
//xuat2("T ng 2 s : "+c);ổ ố //truy xu t saiấ d = Lop.tich(a,b);
Lop.xuat2("Tích 2 s : "ố +d); e = Lop.xdMax(a,b);
Lop.xuat2("Giá tr Max là: "ị +e); f = Lop.xdMin(a,b); lOMoARcPSD| 36667950
Lop .xuat2( "Giá tr Min là: " + f ) ; s .close(); } } File Class2.Java: package Goi_2;
import java.util.Scanner;
import Goi_1.Class1; //chú ý ch này ỗ
public class Class2 {
public static void main(String[] args ) {
Scanner s = new Scanner(System. in ) ; int x , y , z , u ;
System. out .println( "Nhp s x: " ) ; x = s .nextInt();
System. out .println( "Nhp s y: " ) ; y = s .nextInt();
z = Class 1. tong ( x , y ) ; //gi|tham chiu pthc tĩnh
Class1 L = new Class1(); //Khai báo và to đi tng ạốượ
u = L .tich( x , y ) ; //gi pthc không tĩnh
//li vì là tham chiu tĩnh đn phng thc không tĩnh ỗ ế ế ươ ứ
//Class1.xuat2("Tích 2 s là: "+u); ố L .xuat2( "Tng 2 s là: " ổ ố + z ) ; L .xuat2( "Tích 2 s là: " ố + u ) ; s .close(); } }
Kiểm tra: thêm các lệnh sau:
Class1.xuat2("Tích 2 s là: "ố+u);
//l i vì là tham chi u tĩnh đ n ph ng th c không tĩnhỗ ế ế ươ ứ
L.xuat2("Max 2 s là: "ố+ L.xdMax(x,y));
//không nhìn th y ph ng th c xdMax.ấ ươ ứ
L.xuat2("Max 2 s là: "ố+ Class1.xdMax(x,y));
//không nhìn th y ph ng th c xdMax.ấ ươ ứ
L.xuat2("Min 2 s là: "ố + L.xdMin(x,y));
//không nhìn th y ph ng th c xdMin.ấ ươ ứ lOMoARcPSD| 36667950 L .xuat2( "Min 2 s là: " ố + Class1.xdMin ( x , y ; ))
//không nhìn thy phng thc xdMin. ấ ươ ứ L . xuat1 ( x , y ; ) //gi đc nhng không đúng cách!.
Class1. xuat1 ( x , y ) ; //gi đúng cách.
Sv hãy thảo luận và trả lời: có gọi phương thức được không?, nếu không gọi phương thức thì đó là lỗi gì?.
Sinh viên nghe giảng và chú thích cho chương trình.
Ví dụ: Viết chương trình nhập số nguyên n, thực hiện tính: • S1 = 1 + 2 + …+ n
• S2= 1 + ½ + 1/3 + …+ 1/n
Sử dụng phương thức đế tính S1, S2 và gọi sử dụng đúng cách trong main.
import java.util.Scanner;
public class Class3 { //phng thc tính S1 ươ ứ
public static int S1( int n1 ) { int kq =0 ;
for ( int i =1 ; i <= n1 ; i ++) kq = kq + i ; return kq ; } //phng thc tính S2 ươ ứ
public float S2( int n2 ) { float kq f; =0.0
for ( int i =1 ; i <= n2 ; i ++)
kq = kq + 1/ ( float ) i ; return kq ; }
public static void main(String[] args ) {
Scanner s = new Scanner(System. in ; ) int n , x ; float y ; String ch = "" ; do { lOMoARcPSD| 36667950 do {
System. out .print( "Nhp s n : " ; ) n = s .nextInt();
} while ( n <=0 || n >=20) ;
x = S1 ( n ) ; //gi phng thc tĩnh
System. out .println( "S1 = " + x ) ;
Class3 obj = new Class3();
y = obj .S2( n ) ; //gi phng thc qua đ i tng
System. out .println( "S2 = " + y ) ; s .nextLine();
System. out .print( "có tip tc không?(C/K): " ếụ ) ; ch = s .nextLine();
} while (( ch .equals( "c" )== true
) || ( ch .equals( "C" )== true )) ; s .close(); } } Kết quả:
5/. Overloading: (sẽ giải thích kỹ hơn ở học phần sau / bài học Class)
Overloading có liên quan đến các phương thức có cùng tên, có thể khác về tham số, khác kiểu
trả về của phương thức. Overloading có liên quan đến phương thức là Constructor.
Như vậy khi gọi phương thức, thì tùy theo tham số cung cấp mà overloading sẽ chọn phương
thức nào được thực hiện. Ví dụ:
public class VDOverloading {
//ph ng th c ban đ u sum(), 2 tham s int ươ ứ ầ ố lOMoARcPSD| 36667950
public int sum( int x , int y ) { return ( x + y ; ) } //Overloaded p.thc ứ sum(), 3 tham s in ố t
public int sum( int x , int y , int z ) {
return ( x + y + z ) ; } //Overloaded p.thc ứ sum(), 2 tham s do ố uble
public double sum( double x , double y ) { return ( x + y ; ) }
public static void main(String[] args ) {
VDOverloading ol = new VDOverloading();
System. out .println( ol.sum (100 , 200));
System. out .println( ol.sum (100 , 250, 390));
System. out .println( ol.sum (108.5, 20.4)) ; } } Kết quả:
CS Lập trình chỉ biết đến đây
6/. Overriding: (sẽ giải thích kỹ hơn ở học phần sau / bài học Inheritance / kế thừa)
Trong ngôn ngữ lập trình hướng đối tượng Java, Overriding là một tính năng cho phép một lớp
con hoặc lớp con cung cấp một triển khai cụ thể của một phương thức đã được cung cấp trong các
lớp cha (super) của nó. Khi một phương thức trong một lớp con có cùng tên và cùng kiểu trả về
như một phương thức trong lớp cha của nó, thì phương thức trong lớp con được cho là phương
thức overriding trong lớp cha.
Ví dụ: Tạo 3 class (3 file) sau: class Parent.Java như sau: lOMoARcPSD| 36667950 package Goi_1; class Parent { void show()
{System. out .println( "Ta là Kỳ Đà, Parent _ Cha ca C ủắ c Ké." ) ;} }
Ví dụ: Tạo class Child.Java như sau: package Goi_1;
public class Child extends Parent //đ nh nghĩa Class con c a Parentị ủ {
//Ph ng th c này có trong l p cha Parent ươ ứ
ớ @Override //khai báo override _ ghi đè void show()
{System.out.println("Ta là C c Ké, Child _ con c a Kỳ Đà."ắ ủ );} }
Ví dụ: Tạo class Main.Java như sau: package Goi_1; class Main {
public static void main(String[] args ) { //nu đ ếố i ư
ợ tng là Cha (Parent) thì pthc ca ch ứủ a đc g ượọ i
Parent obj1 = new Parent(); obj1 .show(); //nu đ ếố i ư
ợ tng là Con (Child) thì pthc ca co ứủ n đc gi ượọ //đây gi ọ là POLYMORPHISM.
Parent obj2 = new Child(); obj2 .show(); } } Kết quả:
Sự khác nhau giữa overloading và overriding trong Java: lOMoARcPSD| 36667950
Sự khác nhau giữa overloading và overriding phương thức trong java được thể hiện trong bảng sau: Stt
Nạp chồng phương thức (overloading)
Ghi đè phương thức (overriding)
Nạp chồng phương thức được sử dụng để Ghi đè phương thức được sử dụng để cung 1
giúp code của chương trình dễ đọc hơn. cấp cài đặt cụ thểcho phương thức được khai báo ở lớp cha.
Nạp chồng được thực hiện bên trong một Ghi đè phương thức xảy ra trong 2 class có 2
class. quan hệ kế thừa.
Nạp chồng phương thức thì tham số phải Ghi đè phương thức thì tham số phải giống 3 khác nhau. nhau.
Nạp chồng phương thức là ví dụ về đa
Ghi đè phương thức là ví dụ về đa hình lúc 4
hình lúc biên dịch. runtime.
Trong java, nạp chồng phương thức không Giá trị trả về phải giống nhau.
thể được thực hiện khi chỉ thay đổi kiểu giá trị trả về của phương thức. Kiểu giá trị 5
trả về có thể giống hoặc khác. Giá trị trả
về có thể giống hoặc khác, nhưng tham số phải khác nhau.
7/. Biến toàn cục và biến cục bộ: (tổng kết lại)
Trong NNLT java, biến là tên của vùng nhớ. Có 3 kiểu biến trong java, bao gồm biến local
(biến cục bộ), biến instance (biến toàn cục) và biến static (tĩnh). Cú pháp khai báo: lOMoARcPSD| 36667950
[access modifier] datatype varName [ = value] [, varName2] [ = value2]...; access
modifier: dùng qui định cách truy xuất biến
• public: biến là công khai, được sử dụng ở mọi nơi
• static: biến là tĩnh, chỉ được sử dụng trong phạm vi Class
• private: biến là riêng, chỉ được sử dụng trong phạm vi Class
• protected: biến chỉ được sử dụng thông qua các Class con của nó (Sub Class) default: mặc định
7.1/. Biến cục bộ:
• Biến cục bộ được khai báo trong các phương thức, phương thức contructor.
• Biến cục bộ được tạo bên trong các phương thức, contructor và sẽ bị phá hủy
khi kết thúc các phương thức, contructor.
• Không được sử dụng "access modifier" khi khai báo biến cục bộ. Các biến
cục bộ được lưu trên vùng nhớ stack của bộ nhớ. Ví dụ:
public class VariableLocal {
public void xuatKq() {
int n = 10; //Đây là bin cc b (local) ếụộ
System. out .println( "Giá tri ca n : " ủ + n ; ) }
public void Chao( int gio ) {
String s ; //Đây là bin cc b (local) ếụộ if ( gio <12) s = "Chào bui sáng" ổ ;
else if ( gio <20) s = "Chào bui chiu" ổ ề ; else s = "Chào bui ti" ổố ;
System. out .println( s ; ) }
public static void main(String[] args ) {
VariableLocal bienLocal = new VariableLocal(); bienLocal .xuatKq(); int x = 23; bienLocal .Chao( x ) ; } } lOMoARcPSD| 36667950
Kết quả: Sinh viên thảo luận
7.2/. Biến toàn cục:
Biến toàn cục (instance) được khai báo trong một lớp (class), bên ngoài các phương thức, phương thức constructor. •
Biến toàn cục được lưu trong bộ nhớ Heap. •
Biến toàn cục được tạo khi một đối tượng được tạo bằng việc sử dụng từ khóa “new” và sẽ bị phá
hủy khi đối tượng bị phá hủy. •
Biến toàn cục có thể được sử dụng bởi các phương thức, constructor, block, ... Nhưng nó phải
được sử dụng thông qua một đối tượng cụ thể. •
Ta được phép sử dụng "access modifier" khi khai báo biến toàn cục, mặc định là "default". •
Biến toàn cục có giá trị mặc định phụ thuộc vào kiểu dữ liệu của nó. Ví dụ nếu là kiểu int, short,
byte thì giá trị mặc định là 0, kiểu double thì là 0.0, ... Vì vậy, ta sẽ không cần khởi tạo giá trị cho
biến instance trước khi sử dụng. •
Bên trong class mà ta khai báo biến toàn cục, ta có thể gọi nó trực tiếp bằng tên khi sử dụng ở khắp
nơi bên trong class đó. Khi có sự trùng tên thì nên dùng biến Class.tên biến toàn cục để phân biệt. Ví dụ:
public class Nhanvien
{ //bin instance ten kiu String, giá tr mc đnh là null ế ể ịặị public String ten ;
//bin instance tuoi kiu integer, giá tr mc đnh là 0 ế ể ịặị
private int tuoi ;
//s dng bin ten trong mt constructor ửụ ế ộ
public Nhanvien(String ten ) { this . ten = ten ; }
//s dng bin tuoi trong phng thc ửụ ế ươ ứ
public void setTuoi( int tuoi ) { this . tuoi = tuoi ; }
//s dng bin ten, tuoi trong phng thc ửụ ế ươ ứ
public void show() {
System. out .println( "Tên : " + ten ) ;
System. out .println( "Tui : " ổ + tuoi ); }
public static void main(String[] args ) { lOMoARcPSD| 36667950
Nhanvien nv = new Nhanvien("Nguy n Hòa Bình"ễ ); nv.setTuoi(59); nv.show();
String ten ="Lê Th T Do"ị ự ;
System.out.println("Tên : " + ten); //s d ng bi n c c bử ụ ế ụ ộ
System.out.println("Tên : " + nv.ten); //s d ng bi n toàn c cử ụ ế ụ } }
Kết quả: Sinh viên thảo luận
7.3 /. Biến tĩnh:
Biến tĩnh (static) được khai báo trong một class với từ khóa "static" ở đầu, và khai báo bên trong
Clas, bên ngoài các phương thức, constructor. •
Sẽ chỉ có duy nhất một bản sao của các biến tĩnh được tạo ra, dù ta có tạo nhiều đối tượng từ lớp tương ứng. •
Biến tĩnh được lưu trữ trong bộ nhớ static riêng. •
Biến tĩnh được tạo khi chương trình bắt đầu chạy và chỉ bị hủy khi chương trình kết thúc. •
Giá trị mặc định của biến tĩnh phụ thuộc vào kiểu dữ liệu bạn khai báo tương tự biến toàn cục (instance). •
Biến tĩnh được truy cập thông qua tên của class chứa nó, với cú pháp: TenClass.tên biến hoặc tên biến.
Trong class, các phương thức sử dụng biến static bằng cách gọi tên của nó khi phương thức đó
cũng được khai báo với từ khóa "static". Ví dụ: Sinh viên thảo luận
public class Hang {
//bi n static ten, có ki u Stringế
public static
String ten = "Máy hút b i Cannon 120"ụ ;
//bi n static dongia, có ki u doubleế ể
public static double donGia = 15500.00;
public static void main(String[] args) {
//S d ng bi n static b ng cách g i tr c ti pử ụ ế ằ ọ ự ế
System.out.println("Tên hàng : " + ten);
//S d ng bi n static b ng cách g i thông qua tên classử ụ ế ằ ọ
System.out.println("Giá bán : " + Hang.donGia); lOMoARcPSD| 36667950
String ten = "Đèn r i Sony F2050"ọ ;
System. out .println( "Tên hàng 1 : " + Hang. ten ) ;
System. out .println( "Tên hàng 2 : " + ten ) ; } } Kết quả:
8/. Truyền tham số của Phương thức:
Phương thức trong Java có 2 cách truyền tham số: Truyền bằng giá trị (by Value) và Truyền
bằng tham chiếu (by Reference).
8.1/. Truyền bằng giá trị:
Khi chúng ta gọi một phương thức và truyền một giá trị cho phương thức đó được gọi là truyền
giá trị. Việc thay đổi giá trị chỉ có hiệu lực trong phương thức được gọi, không có hiệu lực bên
ngoài phương thức. Truyền bằng giá trị dành cho các biến, tham số khai báo với kiểu dữ liệu cơ
bản nguyên thủy như: byte, short, int, long, float, double, boolean, char, String.
Ví dụ: Sinh viên thảo luận
public class Class1 { int data = 50; String name = "H Chí Minh" ồ ;
void change( int data ) {
data = data + 100; //thay đi giá tr ca thành phn data ổ ịủ ầ }
void rename(String name ) { name = "Nguyn Tt Thành" ễấ ; }
public static void main(String[] args ) {
Class1 obj = new Class1();
System. out .println( "Trc khi gi pt change = " ướ ọ + obj . data ) ; obj .change(500); // passing value
System. out .println( "Sau khi gi pt change = " + obj . data ) ; lOMoARcPSD| 36667950
System.out.println("Tr c khi g i pt rename: "ướ ọ +
obj.name); obj.rename("Nguy n Ái Qu c"ễ ố ); // passing value
System.out.println("Sau khi g i pt rename: "ọ + obj.name); } } Kết quả:
8.2/. Truyền bằng tham chiếu:
Trong Java tất các các biến của lớp (đối tượng) đều là kiểu tham chiếu.
Khi chúng ta gọi một phương thức và truyền một tham chiếu (địa chỉ) cho phương thức đó thì đó
gọi là truyền tham chiếu. Việc thay đổi giá trị của biến tham chiếu bên trong phương thức làm
thay đổi giá trị gốc của nó.
Tham số tham chiếu nó lưu trữ bên trong nó một địa chỉ (tham chiếu tác động đến địa chỉ, chứ
không phải giá trị) mà địa chỉ đó sẽ dùng để truy cập bộ nhớ khi lưu / lấy dữ liệu (giá trị) của biến .
Ví dụ: Sinh viên thảo luận
public class Class2 { int data = 50;
void change1( int data ) {
data = data + 100; //thay đi giá tr ca thành phn data ổ ịủ ầ }
void change2(Class2 obj ) {
obj . data = obj . data + 100; //thay đi giá tr thô ổ ị ng qua đi ố tng ư ợ }
public static void main(String[] args ) {
Class2 obj = new Class2();
System. out .println( "Trc khi gi pt change 1 = " ướ ọ + obj . data ) ;
obj .change1(500); // passing value
System. out .println( "Sau khi gi pt change 1 = " + obj . data ) ; lOMoARcPSD| 36667950
System.out.println("Tr c khi g i pt change 2 = "ướ ọ +
obj.data); obj.change2(obj); // passing reference
System.out.println("Sau khi g i pt change 2 = "ọ + obj.data); } } Kết quả: Bài tập mẫu 1:
Viết chương trình nhập 2 số nguyên a, b, thực hiện tạo các phương thức tính tổng hiệu, tích
thương của 2 số và xuất ra kết quả.
Cách 1: dùng biến toàn cục
import java.util.Scanner;
public class Btm1a {
//khai báo bin toàn cc _ Instance ế ụ
int a , b , tong , hieu , tich ; double thuong ; //phng thc constructor ươ ứ public Btm1a() { //constructor to đi tng rng ạốượ ỗ }
public int tinhTong( int n1 , int n2 ) { //phng thc tr v tng 2 s ươ ứ ảềổ ố return n1 + n2 ; }
public int tinhHieu( int n1 , int n2 ) { //phng thc tr v hiu 2 s ươ ứ ảềệ ố return n1 - n2 ; }
public int tinhTich( int n1 , int n2 ) { //phng thc tr v tích 2 s ươ ứ ảề ố return n1 * n2 ; } lOMoARcPSD| 36667950 Kết quả:
Cách 2: dùng biến cục bộ
import java.util.Scanner;
public class Btm1b lOMoARcPSD| 36667950
{ public int tinhTong(int n1, int n2)
{ //ph ng th c tr v t ng 2 sươ ứ ả ề ổ ố return n1 + n2; }
public int tinhHieu(int n1, int n2)
{ //ph ng th c tr v hi u 2 sươ ứ ả ề ệ ố return n1 - n2; }
public int tinhTich(int n1, int n2)
{ //ph ng th c tr v tích 2 sươ ứ ả ề ố return n1 * n2; }
public double tinhThuong(int n1, int n2)
{ //ph ng th c tr v th ng 2 sươ ứ ả
ề ươ ố double kq; if (n2 != 0) kq = (double) n1/n2; else kq=-1.0; return kq; }
public void xuatkq(int a, int b, int tong, int hieu, int tich, double thuong)
{ //ph ng th c không tr v giá tr , xu t n i dung c a đ i t ngươ ứ ả ề ị ấ ộ ủ ố ượ
System.out.println("a : " + a);
System.out.println("b : " + b);
System.out.println("T ng : "ổ + tong);
System.out.println("Hi u : "ệ + hieu);
System.out.println("Tích : " + tich);
System.out.println("Th ng : "ươ + thuong); }
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int a, b, tong, hieu, tich; //khai báo bi n c c b _ Localế ụ ộ
double thuong=0.0; Btm1b obj = new Btm1b();
System.out.print("Nh p s a : "ậ ốố ); a = s.nextInt();
System.out.print("Nh p s b : "ậ ốố ); b = s.nextInt(); tong = obj.tinhTong(a, b); hieu = obj.tinhHieu(a, b); tich = obj.tinhTich(a, b); thuong = obj.tinhThuong(a, b); lOMoARcPSD| 36667950
obj .xuatkq( a , b , tong , hieu , tich , thuong ) ; } } Kết quả:
Bài tập mẫu 2: Viết chương trình thực hiện nhập 2 số thực x, y, thực hiện tính tổng x + y, tích x
* y, xác định giá trị min (x, y), xác định giá trị max (x, y).
Sử dụng biến cục bộ, có phân tích thành các phương thức xử lý và chương trình có Menu thực hiện đơn giản như sau: 1. Nhập giá trị x, y 2. Tính x + y 3. Tính x * y 4. Xác định Min(x, y) 5. Xác định Max(x, y)
6. Kết thúc chương trình
import java.util.Scanner;
public class Btm2 {
public static double tong( double a , double b ) { //phng thc tính tng ươ ứ ổ return a + b ; }
public static double tich( double a , double b ) { //phng thc tính tích ươ ứ return a*b; lOMoARcPSD| 36667950 }
public double max(double a, double b)
{ //ph ng th c xác đ nh giá tr maxươ
ứ ị ị if (a>=b) return a; else return b; }
public double min(double a, double b)
{ //ph ng th c xác đ nh giá tr minươ
ứ ị ị if (areturn a; else return b; }
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
//khai báo các bi n c c bế ụ ộ
double x=0, y=0, tongxy, tichxy, maxxy, minxy; int chon; do
{ System.out.println("1/. Nh p 2 s x, y"ậ ốố );;
System.out.println("2/. T ng (x + y)"ổ);
System.out.println("3/. Tích (x * y)");
System.out.println("4/. Max (x, y)");
System.out.println("5/. Min (x, y)");
System.out.println("6/. K t thúc ch ng trình"ế ươ
); System.out.print("Nh n 1 s đ ch n: "ấ ố ể ọ
); chon = s.nextInt(); switch (chon) lOMoARcPSD| 36667950 { case 1:
System.out.print("Nh p s x : "ậ ốố ); x = s.nextDouble();
System.out.print("Nh p s y : "ậ ốố
); y = s.nextDouble(); break; case 2: tongxy = tong(x, y);
System.out.println("T ng 2 s : "ổ ố + tongxy); break; case 3: tichxy = tich(x, y);
System.out.println("Tích 2 s : "ố + tichxy); break; case 4:
Btm2 obj1 = new Btm2(); maxxy = obj1.max(x, y);
System.out.println("Max 2 s : "ố + maxxy); break;
case 5: Btm2 obj2 = new Btm2(); minxy = obj2.min(x, y); lOMoARcPSD| 36667950
System.out.println("Min 2 s : "ố + minxy); break; } } while (chon <=5);
System.out.println("H n g p l i."ẹ ặ ạ ); s.close(); } } Kết quả: 1 /. Nhp 2 s x, y /. Tng (x + y 2 ổ ) 3 / ) . Tích (x * y 4 ) /. Max (x, y 5 /. Min (x, y ) 6 /. Kt thúc chng trình ế ươ Nhn 1 s đ chn: 1 ấ ốểọ Nhp s x : 34 Nhp s y : 21 /. Nhp 2 s x, y 1 /. Tng (x + y 2 ổ ) 3 /. Tích (x * y ) 4 /. Max (x, y ) 5 /. Min (x, y ) /. Kt thúc chng trình 6 ế ươ Nhn 1 s đ chn: 2 ấ ốểọ Tng 2 s: 55.0 ổ ố /. Nhp 2 s x, y 1 2 /. Tng (x + y ổ ) 3 /. Tích (x * y ) 4 /. Max (x, y ) /. Min (x, y 5 ) 6 /. Kt thúc chng trình ế ươ Nhn 1 s đ chn: ấ ốểọ 3 Tích 2 s: 714.0 ố 1 /. Nhp 2 s x, y 2 /. Tng (x + y ổ ) /. Tích (x * y 3 ) 4 /. Max (x, y ) 5 ) /. Min (x, y /. Kt thúc chng trình 6 ế ươ Nhn 1 s đ chn: 4 ấ ốểọ Max 2 s: 34.0 ố 1 /. Nhp 2 s x, y 2 /. Tng (x + y ổ ) 3 /. Tích (x * y ) /. Max (x, y 4 ) 5 /. Min (x, y ) lOMoARcPSD| 36667950 6 /. Kt thúc chng trình ế ươ Nhn 1 s đ chn: 5 ấ ốểọ Min 2 s: 21.0 ố 1 /. Nhp 2 s x, y /. Tng (x + y 2 ổ ) 3 ) /. Tích (x * y 4 /. Max (x, y ) 5 /. Min (x, y ) 6 /. Kt thúc chng trình ế ươ Nhn 1 s đ chn: 6 ấ ốểọ Hn gp li.