Công Nghệ Thông Tin, it, phầm mềm, website, web, mobile app, trí tuệ nhân tạo, blockchain, AI, machine learning - Công Nghệ Thông Tin, it, phầm mềm, website, web, mobile app, trí tuệ nhân tạo, blockchain, AI, machine learning - Lập trình Tự học lập trình với https:lap-trinh-may-tinh.blogspot.com TỰ HỌC LẬP TRÌNH JAVA 1 Bài thực hành 03: Lập trình hướng đối tượng với Java (OOP with Java) -------------------------------------------- NỘI DUNG: Thừa kế và đa hình trong Java .................................................................................................................. 2 1- Giới thiệu .......................................................................................................................................... 2 2- Class, cấu tử và đối tượng (Class, Constructor, instance) ................................................................ 2 3- Thừa kế trong java ............................................................................................................................ 5 4- Tính đa hình trong Java .................................................................................................................. 12 Abstract class và Interface trong Java ..................................................................................................... 15 1- Giới thiệu ........................................................................................................................................ 15 2- Class trừu tượng (Abstract Class) ................................................................................................... 15 3- Ví dụ với lớp trừu tượng ................................................................................................................. 16 4- Tổng quan về Interface ................................................................................................................... 19 5- Cấu trúc của một Interface.............................................................................................................. 20 6- Class thực hiện Interface ................................................................................................................ 22 Access modifier trong Java ..................................................................................................................... 26 1- Modifier trong Java ........................................................................................................................ 26 2- Tổng quan về access modifier ........................................................................................................ 26 3- private access modifier ................................................................................................................... 26 4- private constructor .......................................................................................................................... 27 5- Access modifier mặc định .............................................................................................................. 28 6- protected access modifier ............................................................................................................... 30 7- public access modifier .................................................................................................................... 30 8- Ghi đè phương thức ........................................................................................................................ 31 ------------------------------------------- Xem thêm tài liệu khác TẠI ĐÂY ------------------------------------------- Tự học lập trình với https:lap-trinh-may-tinh.blogspot.com TỰ HỌC LẬP TRÌNH JAVA 2 Thừa kế và đa hình trong Java 1- Giới thiệu Thừa kế và đa hình (Inheritance polymorphism) - đây là một khái niệm vô cùng quan trọng trong Java. Mà bạn bắt buộc phải hiểu nó. 2- Class, cấu tử và đối tượng (Class, Constructor, instance) Bạn cần hiểu một cách rạch ròi về class, cấu tử (constructor) và đối tượng trước khi bắt đầu tìm hiểu quan hệ thừa kế trong java. Chúng ta xem class Person, mô tả một con người với các thông tin tên, năm sinh, nơi sinh. Person.java ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package org.o7planning.tutorial.inheritance.basic; public class Person { Trường name - Thông tin tên người. private String name; Trường bornYear - thông tin năm sinh private Integer bornYear; Trường placeOfBirth - thông tin nơi sinh. private String placeOfBirth; Constructor có 3 tham số. Mục đích nhằm để gán các giá trị cho các trường của Person. Chỉ định rõ tên, năm sinh, nơi sinh của một người. public Person(String name, Integer bornYear, String placeOfBirth) { this.name = name; this.bornYear = bornYear; this.placeOfBirth = placeOfBirth; } Constructor có 2 tham số. Mục đích gán các giá trị cho 2 trường tên và năm sinh cho Person. Nơi sinh không được gán. public Person(String name, Integer bornYear) { this.name = name; this.bornYear = bornYear; } public String getName() { return name; } Tự học lập trình với https:lap-trinh-may-tinh.blogspot.com TỰ HỌC LẬP TRÌNH JAVA 3 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 public void setName(String name) { this.name = name; } public Integer getBornYear() { return bornYear; } public void setBornYear(Integer bornYear) { this.bornYear = bornYear; } public String getPlaceOfBirth() { return placeOfBirth; } public void setPlaceOfBirth(String placeOfBirth) { this.placeOfBirth = placeOfBirth; } } PersonDemo.java ? 1 2 3 package org.o7planning.tutorial.inheritance.basic; public class PersonDemo { Tự học lập trình với https:lap-trinh-may-tinh.blogspot.com TỰ HỌC LẬP TRÌNH JAVA 4 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public static void main(String args) { Đối tượng: Thomas Edison. Person edison = new Person("Thomas Edison", 1847); System.out.println("Info:"); System.out.println("Name: " + edison.getName()); System.out.println("Born Year: " + edison.getBornYear()); System.out.println("Place Of Birth: " + edison.getPlaceOfBirth() ); Đối tượng: Bill Gates Person billGates = new Person("Bill Gate", 1955, "Seattle, Washington"); System.out.println("Info:"); System.out.println("Name: " + billGates.getName()); System.out.println("Born Year: " + billGates.getBornYear()); System.out.println("Place Of Birth: " + billGates.getPlaceOfBirth()); } } Phân biệt Class, cấu tử (constructor) và đối tượng: Lớp Person mô phỏng một lớp người, nó là một thứ gì đó trừu tượng, nhưng nó có các trường để mang thông tin, trong ví dụ trên là tên, năm sinh, nơi sinh. Cấu tử (Constructor) - Người ta còn gọi là "Phương thức khởi tạo" Cấu tử luôn có tên giống tên lớp. Một class có một hoặc nhiều cấu tử. Cấu tử có hoặc không có tham số, cấu tử không có tham số còn gọi là cấu tử mặc định. Cấu tử được sử dụng để tạo ra một đối tượng của lớp. Như vậy lớp Person (Mô tả lớp người) là thứ trừu tượng, nhưng khi chỉ rõ vào bạn hoặc tôi thì đó là 2 đối tượng (instance) thuộc lớp Person. Và Constructor là phương thức đặc biệt để tạo ra đối tượng, Constructor sẽ gán các giá trị vào các trường (field) của class cho đối tượng.. Hãy xem minh họa, khởi tạo đối tượng từ cấu tử như thế nào. Tự học lập trình với https:lap-trinh-may-tinh.blogspot.com TỰ HỌC LẬP TRÌNH JAVA 5 3- Thừa kế trong java Chúng ta cần một vài class tham gia vào minh họa. Animal: Class mô phỏng một lớp Động vật. Duck: Class mô phỏng lớp vịt, là một class con của Animal. Cat: Class mô phỏng lớp mèo, là một class con của Animal Mouse: Class mô phỏng lớp chuột, là một class con của Animal. Ở đây chúng ta có class Animal, với một method không có nội dung. public abstract String getAnimalName(); Method này là một method trừu tượng (abstract), tại các class con cần phải khai báo và triển khai nội dung của nó. Method này có ý nghĩa là trả về tên loài động vật. Class Animal có 1 phương thức trừu tượng nó phải được khai báo là trìu tượng (abstract). Class trừu tượng có các cấu tử (constructor) nhưng bạn không thể khởi tạo đối tượng từ nó. Về bản chất nghĩa là bạn muốn tạo một đối tượng động vật, bạn cần tạo từ một loại đông vật cụ thể, trong trường hợp này bạn phải khởi tạo từ cấu tử (constructor) của Cat, Mouse hoặc Duck. Tự học lập trình với https:lap-trinh-may-tinh.blogspot.com TỰ HỌC LẬP TRÌNH JAVA 6 Animal.java ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 package org.o7planning.tutorial.inheritance.animal; Lớp có ít nhất 1 phương thức trừu tượng bắt buộc phải được khai báo là trừu tượng. public abstract class Animal { Tên, ví dụ Mèo Tom, Chuột Jerry. private String name; Constructor mặc định. public Animal() { Gán giá trị mặc định cho ''''name''''. this.name = this.getAnimalName(); } public Animal(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } Đây là một phương thức trừu tượng. Trả về tên của loài động vật này. Nội dung cụ thể của phương thức này sẽ được thực hiện (implemented) tại các lớp con. public abstract String getAnimalName(); } Tiếp theo xem class Cat, thừa kế từ Animal. Cat cũng có các cấu tử của nó, và cũng có các trường của nó. Trong dòng đầu tiên của cấu tử bao giờ cũng phải gọi super(..) nghĩa là gọi lên cấu tử cha, để khởi tạo giá trị cho các trường của class cha. Nếu bạn không gọi, mặc định Java hiểu là đã gọi super(), nghĩa là gọi cấu tử mặc định của class cha. Cat.java ? 1 2 package org.o7planning.tutorial.inheritance.animal; public class Cat extends Animal { Tự học lập trình với https:lap-trinh-may-tinh.blogspot.com TỰ HỌC LẬP TRÌNH JAVA 7 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 private int age; private int height; public Cat(int age, int height) { Gọi tới Constructor mặc định của lớp cha (Animal). Nhằm mục đích gán tạo giá trị cho các trường (field) của lớp cha. super(); Sau đó mới gán giá trị cho các trường (field) của nó. this.age = age; this.height = height; } public Cat(String name, int age, int height) { Gọi tới Constructor của lớp cha (Animal) Nhằm mục đích gán tạo giá trị cho các trường (field) của lớp cha. super(name); Sau đó mới gán giá trị cho các trường (field) của nó. this.age = age; this.height = height; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } Thực hiện (implement) phương thức trừu tượng được khai báo tại lớp cha. Override public String getAnimalName() { return "Cat"; } } Tự học lập trình với https:lap-trinh-may-tinh.blogspot.com TỰ HỌC LẬP TRÌNH JAVA 8 Khi bạn khởi tạo một đối tượng Cat điều gì xẩy ra? Xem class Mouse, thừa kế từ Animal. Mouse.java ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package org.o7planning.tutorial.inheritance.animal; public class Mouse extends Animal { private int weight; Constructor mặc định. public Mouse() { Gọi tới cấu tử Mouse(int) Call to constructor Mouse(int) this(100); } Constructor có 1 tham số public Mouse(int weight) { Nếu bạn không gọi bất kỳ một super(..) nào. Java sẽ gọi một super() mặc định. super(); this.weight = weight; } Constructor có 2 tham số. public Mouse(String name, int weight) { super(name); this.weight = weight; } public int getWeight() { return weight; } Tự học lập trình với https:lap-trinh-may-tinh.blogspot.com TỰ HỌC LẬP TRÌNH JAVA 9 27 28 29 30 31 32 33 34 35 36 37 38 39 40 public void setWeight(int weight) { this.weight = weight; } Override public String getAnimalName() { return "Mouse"; } } InstanceofDemo.java ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 package org.o7planning.tutorial.inheritance.demo; import org.o7planning.tutorial.inheritance.animal.Animal; import org.o7planning.tutorial.inheritance.animal.Cat; import org.o7planning.tutorial.inheritance.animal.Mouse; public class InstanceofDemo { public static void main(String args) { Khởi tạo một đối tượng động vật. Animal là một lớp trừu tượng, bạn không thể tạo ra một đối tượng từ Constructor của Animal. Animal tom = new Cat("Tom", 3, 20); System.out.println("name: " + tom.getName()); System.out.println("animalName: " + tom.getAnimalName()); Sử dụng toán tử ''''instanceof'''' để kiểm tra xem một đối tượng có phải là một kiểu nào đó hay không. boolean isMouse = tom instanceof Mouse; System.out.println("Tom is mouse? " + isMouse); boolean isCat = tom instanceof Cat; System.out.println("Tom is cat? " + isCat); boolean isAnimal = tom instanceof Animal; System.out.println("Tom is animal? " + isAnimal); } } Tự học lập trình với https:lap-trinh-may-tinh.blogspot.com TỰ HỌC LẬP TRÌNH JAVA 10 30 31 32 Kết quả chạy ví dụ: ? 1 2 3 4 5 name: Tom animalName: Cat Tom is mouse? false Tom is cat? true Tom is animal? true InheritMethodDemo.java ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package org.o7planning.tutorial.inheritance.demo; import org.o7planning.tutorial.inheritance.animal.Cat; public class InheritMethodDemo { public static void main(String args) { Tạo một đối tượng Cat. Cat tom = new Cat("Tom", 3, 20); Gọi các phương thức thừa kế được từ lớp cha (Animal). System.out.println("name: " + tom.getName()); System.out.println("animalName: " + tom.getAnimalName()); System.out.println("-----------------"); Gọi các phương thức được khai báo trên lớp Cat. System.out.println("Age: " + tom.getAge()); System.out.println("Height: " + tom.getHeight()); } } Kết quả chạy ví dụ: ? Tự học lập trình với https:lap-trinh-may-tinh.blogspot.com TỰ HỌC LẬP TRÌNH JAVA 11 1 2 3 4 5 name: Tom animalName: Cat ----------------- Age: 3 Height: 20 Ép kiểu (Cast) trong Java CastDemo.java ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 package org.o7planning.tutorial.inheritance.demo; import java.util.Random; import org.o7planning.tutorial.inheritance.animal.Animal; import org.o7planning.tutorial.inheritance.animal.Cat; import org.o7planning.tutorial.inheritance.animal.Mouse; public class CastDemo { Phương thức này trả về ngẫu nhiên một con vật. public static Animal getRandomAnimal() { Trả về giá trị ngẫu nhiên 0 hoặc 1. int random = new Random().nextInt(2); Animal animal = null; if (random == 0) { animal = new Cat("Tom", 3, 20); } else { animal = new Mouse("Jerry", 5); } return animal; } public static void main(String args) { Animal animal = getRandomAnimal(); if (animal instanceof Cat) { Ép kiểu (cast) thành kiểu Cat. Cat cat = (Cat) animal; Và gọi một phương thức của lớp Cat. System.out.println("Cat height: " + cat.getHeight()); } else if (animal instanceof Mouse) { Ép kiểu (cast) thành kiểu Mouse. Mouse mouse = (Mouse) animal; Và gọi một phương thức của lớp Mouse. System.out.println("Mouse weight: " + mouse.getWeight()); } } Tự học lập trình với https:lap-trinh-may-tinh.blogspot.com TỰ HỌC LẬP TRÌNH JAVA 12 38 39 40 41 42 43 44 45 } 4- Tính đa hình trong Java Bạn có một con mèo nguồn gốc châu Á (AsianCat), bạn có thể nói nó là một con mèo (Cat) hoặc nói nó là một con vật (Animal) đó là một khía cạnh của từ đa hình. Hoặc một ví dụ khác: Trên lý lịch của bạn ghi rằng bạn là một người châu Á, trong khi đó bạn thực tế là một người Việt Nam. Ví dụ dưới đây cho bạn thấy cách hành sử giữa khai báo và thực tế Class AsianCat là một class thừa kế từ Cat AsianCat.java ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 package org.o7planning.tutorial.inheritance.animal; public class AsianCat extends Cat { public AsianCat(String name, int age, int height) { super(name, age, height); } Ghi đè (override) phương thức của lớp cha (Cat) Override public String getAnimalName() { return "Asian Cat"; } } Tính đa hình của Java được giải thích trong hình minh họa dưới đây: Tự học lập trình với https:lap-trinh-may-tinh.blogspot.com TỰ HỌC LẬP TRÌNH JAVA 13 PolymorphismDemo.java ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package org.o7planning.tutorial.polymorphism; import org.o7planning.tutorial.inheritance.animal.AsianCat; impor...
TỰ HỌC LẬP TRÌNH JAVA Bài thực hành 03: Lập trình hướng đối tượng với Java (OOP with Java) NỘI DUNG: Thừa kế và đa hình trong Java 2 1- Giới thiệu 2 2- Class, cấu tử và đối tượng (Class, Constructor, instance) 2 3- Thừa kế trong java 5 4- Tính đa hình trong Java 12 Abstract class và Interface trong Java 15 1- Giới thiệu 15 2- Class trừu tượng (Abstract Class) 15 3- Ví dụ với lớp trừu tượng .16 4- Tổng quan về Interface 19 5- Cấu trúc của một Interface 20 6- Class thực hiện Interface 22 Access modifier trong Java .26 1- Modifier trong Java 26 2- Tổng quan về access modifier 26 3- private access modifier 26 4- private constructor 27 5- Access modifier mặc định 28 6- protected access modifier .30 7- public access modifier 30 8- Ghi đè phương thức 31 - Xem thêm tài liệu khác TẠI ĐÂY - Tự học lập trình với https://lap-trinh-may-tinh.blogspot.com 1 TỰ HỌC LẬP TRÌNH JAVA Thừa kế và đa hình trong Java 1- Giới thiệu Thừa kế và đa hình (Inheritance & polymorphism) - đây là một khái niệm vô cùng quan trọng trong Java Mà bạn bắt buộc phải hiểu nó 2- Class, cấu tử và đối tượng (Class, Constructor, instance) Bạn cần hiểu một cách rạch ròi về class, cấu tử (constructor) và đối tượng trước khi bắt đầu tìm hiểu quan hệ thừa kế trong java Chúng ta xem class Person, mô tả một con người với các thông tin tên, năm sinh, nơi sinh Person.java ? 1 package org.o7planning.tutorial.inheritance.basic; 2 public class Person { 3 4 // Trường name - Thông tin tên người 5 private String name; 6 // Trường bornYear - thông tin năm sinh 7 private Integer bornYear; 8 // Trường placeOfBirth - thông tin nơi sinh 9 private String placeOfBirth; 10 // Constructor có 3 tham số 11 // Mục đích nhằm để gán các giá trị cho các trường của Person 12 // Chỉ định rõ tên, năm sinh, nơi sinh của một người 13 public Person(String name, Integer bornYear, String placeOfBirth) { 14 this.name = name; 15 this.bornYear = bornYear; this.placeOfBirth = placeOfBirth; 16 } 17 18 // Constructor có 2 tham số 19 // Mục đích gán các giá trị cho 2 trường tên và năm sinh cho Person // Nơi sinh không được gán 20 public Person(String name, Integer bornYear) { 21 this.name = name; 22 this.bornYear = bornYear; 23 } 24 public String getName() { 25 return name; 26 } 27 Tự học lập trình với https://lap-trinh-may-tinh.blogspot.com 2 TỰ HỌC LẬP TRÌNH JAVA 28 public void setName(String name) { 29 this.name = name; 30 31 } 32 33 public Integer getBornYear() { 34 return bornYear; 35 36 } 37 38 public void setBornYear(Integer bornYear) { 39 this.bornYear = bornYear; 40 41 } 42 43 public String getPlaceOfBirth() { 44 } return placeOfBirth; 45 46 } 47 48 public void setPlaceOfBirth(String placeOfBirth) { 49 this.placeOfBirth = placeOfBirth; 50 51 } 52 PersonDemo.java ? 1 package org.o7planning.tutorial.inheritance.basic; 2 public class PersonDemo { 3 Tự học lập trình với https://lap-trinh-may-tinh.blogspot.com 3 TỰ HỌC LẬP TRÌNH JAVA 4 public static void main(String[] args) { 5 6 // Đối tượng: Thomas Edison 7 Person edison = new Person("Thomas Edison", 1847); 8 9 System.out.println("Info:"); 10 System.out.println("Name: " + edison.getName()); 11 System.out.println("Born Year: " + edison.getBornYear()); 12 System.out.println("Place Of Birth: " + edison.getPlaceOfBirth() ); 13 14 // Đối tượng: Bill Gates 15 Person billGates = new Person("Bill Gate", 1955, "Seattle, Washington"); 16 17 System.out.println("Info:"); 18 System.out.println("Name: " + billGates.getName()); 19 System.out.println("Born Year: " + billGates.getBornYear()); 20 System.out.println("Place Of Birth: " + billGates.getPlaceOfBirth()); 21 } 22 } 23 24 25 Phân biệt Class, cấu tử (constructor) và đối tượng: Lớp Person mô phỏng một lớp người, nó là một thứ gì đó trừu tượng, nhưng nó có các trường để mang thông tin, trong ví dụ trên là tên, năm sinh, nơi sinh Cấu tử (Constructor) - Người ta còn gọi là "Phương thức khởi tạo" • Cấu tử luôn có tên giống tên lớp • Một class có một hoặc nhiều cấu tử • Cấu tử có hoặc không có tham số, cấu tử không có tham số còn gọi là cấu tử mặc định • Cấu tử được sử dụng để tạo ra một đối tượng của lớp Như vậy lớp Person (Mô tả lớp người) là thứ trừu tượng, nhưng khi chỉ rõ vào bạn hoặc tôi thì đó là 2 đối tượng (instance) thuộc lớp Person Và Constructor là phương thức đặc biệt để tạo ra đối tượng, Constructor sẽ gán các giá trị vào các trường (field) của class cho đối tượng Hãy xem minh họa, khởi tạo đối tượng từ cấu tử như thế nào Tự học lập trình với https://lap-trinh-may-tinh.blogspot.com 4 TỰ HỌC LẬP TRÌNH JAVA 3- Thừa kế trong java Chúng ta cần một vài class tham gia vào minh họa • Animal: Class mô phỏng một lớp Động vật • Duck: Class mô phỏng lớp vịt, là một class con của Animal • Cat: Class mô phỏng lớp mèo, là một class con của Animal • Mouse: Class mô phỏng lớp chuột, là một class con của Animal Ở đây chúng ta có class Animal, với một method không có nội dung • public abstract String getAnimalName(); Method này là một method trừu tượng (abstract), tại các class con cần phải khai báo và triển khai nội dung của nó Method này có ý nghĩa là trả về tên loài động vật Class Animal có 1 phương thức trừu tượng nó phải được khai báo là trìu tượng (abstract) Class trừu tượng có các cấu tử (constructor) nhưng bạn không thể khởi tạo đối tượng từ nó • Về bản chất nghĩa là bạn muốn tạo một đối tượng động vật, bạn cần tạo từ một loại đông vật cụ thể, trong trường hợp này bạn phải khởi tạo từ cấu tử (constructor) của Cat, Mouse hoặc Duck Tự học lập trình với https://lap-trinh-may-tinh.blogspot.com 5 TỰ HỌC LẬP TRÌNH JAVA Animal.java ? 1 2 3 package org.o7planning.tutorial.inheritance.animal; 4 5 // Lớp có ít nhất 1 phương thức trừu tượng 6 // bắt buộc phải được khai báo là trừu tượng 7 public abstract class Animal { 8 // Tên, ví dụ Mèo Tom, Chuột Jerry 9 private String name; 10 11 // Constructor mặc định 12 public Animal() { 13 // Gán giá trị mặc định cho 'name' 14 this.name = this.getAnimalName(); 15 } 16 public Animal(String name) { 17 this.name = name; 18 } 19 20 public String getName() { return name; 21 } 22 23 public void setName(String name) { 24 this.name = name; 25 } 26 // Đây là một phương thức trừu tượng 27 // Trả về tên của loài động vật này 28 // Nội dung cụ thể của phương thức này 29 // sẽ được thực hiện (implemented) tại các lớp con 30 public abstract String getAnimalName(); 31 32 } 33 34 Tiếp theo xem class Cat, thừa kế từ Animal Cat cũng có các cấu tử của nó, và cũng có các trường của nó Trong dòng đầu tiên của cấu tử bao giờ cũng phải gọi super( ) nghĩa là gọi lên cấu tử cha, để khởi tạo giá trị cho các trường của class cha Nếu bạn không gọi, mặc định Java hiểu là đã gọi super(), nghĩa là gọi cấu tử mặc định của class cha Cat.java ? 1 package org.o7planning.tutorial.inheritance.animal; 2 public class Cat extends Animal { Tự học lập trình với https://lap-trinh-may-tinh.blogspot.com 6 TỰ HỌC LẬP TRÌNH JAVA 3 private int age; 4 private int height; 5 6 public Cat(int age, int height) { 7 // Gọi tới Constructor mặc định của lớp cha (Animal) 8 // Nhằm mục đích gán tạo giá trị cho các trường (field) của lớp cha 9 super(); 10 // Sau đó mới gán giá trị cho các trường (field) của nó 11 this.age = age; 12 this.height = height; 13 14 } 15 16 public Cat(String name, int age, int height) { 17 // Gọi tới Constructor của lớp cha (Animal) 18 // Nhằm mục đích gán tạo giá trị cho các trường (field) của lớp cha 19 super(name); 20 // Sau đó mới gán giá trị cho các trường (field) của nó 21 this.age = age; 22 this.height = height; 23 24 } 25 26 public int getAge() { 27 return age; 28 29 } 30 31 public void setAge(int age) { 32 this.age = age; 33 34 } 35 36 public int getHeight() { 37 return height; 38 39 } 40 41 } public void setHeight(int height) { 42 this.height = height; 43 44 } 45 46 // Thực hiện (implement) phương thức trừu tượng được khai báo tại lớp cha 47 @Override 48 public String getAnimalName() { return "Cat"; } Tự học lập trình với https://lap-trinh-may-tinh.blogspot.com 7 TỰ HỌC LẬP TRÌNH JAVA Khi bạn khởi tạo một đối tượng Cat điều gì xẩy ra? Xem class Mouse, thừa kế từ Animal Mouse.java ? 1 package org.o7planning.tutorial.inheritance.animal; 2 3 public class Mouse extends Animal { 4 5 private int weight; 6 // Constructor mặc định 7 public Mouse() { 8 // Gọi tới cấu tử Mouse(int) 9 // Call to constructor Mouse(int) 10 this(100); 11 } 12 // Constructor có 1 tham số 13 public Mouse(int weight) { 14 // Nếu bạn không gọi bất kỳ một super( ) nào 15 // Java sẽ gọi một super() mặc định 16 // super(); this.weight = weight; 17 } 18 19 // Constructor có 2 tham số 20 public Mouse(String name, int weight) { 21 super(name); 22 this.weight = weight; 23 } 24 public int getWeight() { 25 return weight; 26 } Tự học lập trình với https://lap-trinh-may-tinh.blogspot.com 8 TỰ HỌC LẬP TRÌNH JAVA 27 public void setWeight(int weight) { 28 this.weight = weight; 29 30 } 31 32 @Override 33 public String getAnimalName() { 34 35 } return "Mouse"; 36 } 37 38 39 40 InstanceofDemo.java ? 1 package org.o7planning.tutorial.inheritance.demo; 2 3 import org.o7planning.tutorial.inheritance.animal.Animal; 4 import org.o7planning.tutorial.inheritance.animal.Cat; 5 import org.o7planning.tutorial.inheritance.animal.Mouse; 6 7 public class InstanceofDemo { 8 public static void main(String[] args) { 9 10 // Khởi tạo một đối tượng động vật 11 // Animal là một lớp trừu tượng, 12 // bạn không thể tạo ra một đối tượng từ Constructor của Animal 13 Animal tom = new Cat("Tom", 3, 20); 14 System.out.println("name: " + tom.getName()); 15 System.out.println("animalName: " + tom.getAnimalName()); 16 17 // Sử dụng toán tử 'instanceof' để kiểm tra xem 18 // một đối tượng có phải là một kiểu nào đó hay không 19 boolean isMouse = tom instanceof Mouse; 20 System.out.println("Tom is mouse? " + isMouse); 21 boolean isCat = tom instanceof Cat; 22 System.out.println("Tom is cat? " + isCat); 23 24 boolean isAnimal = tom instanceof Animal; 25 System.out.println("Tom is animal? " + isAnimal); 26 27 } 28 29 } Tự học lập trình với https://lap-trinh-may-tinh.blogspot.com 9 TỰ HỌC LẬP TRÌNH JAVA 30 31 32 Kết quả chạy ví dụ: ? 1 name: Tom 2 animalName: Cat 3 Tom is mouse? false 4 Tom is cat? true 5 Tom is animal? true InheritMethodDemo.java ? 1 2 package org.o7planning.tutorial.inheritance.demo; 3 4 import org.o7planning.tutorial.inheritance.animal.Cat; 5 6 public class InheritMethodDemo { 7 8 public static void main(String[] args) { 9 // Tạo một đối tượng Cat 10 Cat tom = new Cat("Tom", 3, 20); 11 12 // Gọi các phương thức thừa kế được từ lớp cha (Animal) 13 System.out.println("name: " + tom.getName()); 14 System.out.println("animalName: " + tom.getAnimalName()); 15 16 System.out.println(" -"); 17 // Gọi các phương thức được khai báo trên lớp Cat 18 System.out.println("Age: " + tom.getAge()); 19 System.out.println("Height: " + tom.getHeight()); 20 } 21 22 } 23 Kết quả chạy ví dụ: ? Tự học lập trình với https://lap-trinh-may-tinh.blogspot.com 10 TỰ HỌC LẬP TRÌNH JAVA BuildHouse.java ? 1 2 package org.o7planning.tutorial.abs; 3 4 // Class này thừa kế từ class trìu tượng ManualJob 5 // BuildHouse không được khai báo là trừu tượng // Vì vậy nó cần thực hiện tất cả các phương thức trừu tượng còn lại 6 public class BuildHouse extends ManualJob { 7 8 public BuildHouse() { 9 10 } 11 12 // Thực hiện phương thức trừu tượng của lớp cha 13 @Override 14 public void doJob() { System.out.println("Build a House"); 15 } 16 17 } 18 Ví dụ demo JobDemo.java ? 1 package org.o7planning.tutorial.abs; 2 public class JobDemo { 3 4 public static void main(String[] args) { 5 6 // Khởi tạo một đối tượng AbstractJob 7 // từ Constructor của lớp JavaCoding 8 AbstractJob job1 = new JavaCoding(); 9 // Gọi phương thức doJob() 10 job1.doJob(); 11 12 // Phương thức getJobName là trừu tượng trong lớp AbstractJob 13 // Nhưng nó đã được thực hiện tại một lớp con nào đó 14 // Vì vậy bạn có thể gọi nó 15 String jobName = job1.getJobName(); 16 System.out.println("Job Name 1= " + jobName); 17 Tự học lập trình với https://lap-trinh-may-tinh.blogspot.com 18 TỰ HỌC LẬP TRÌNH JAVA 18 // Khởi tạo một đối tượng AbstractJob 19 // từ Constructor của lớp BuildHouse 20 AbstractJob job2 = new BuildHouse(); 21 job2.doJob(); 22 23 String jobName2 = job2.getJobName(); 24 25 System.out.println("Job Name 2= " + jobName2); 26 27 } 28 } 29 30 31 32 Kết quả chạy ví dụ: Java ? Job 1 Coding Java 2 Job Name 1= Coding 3 Build a House 4 Job Name 2= Manual 4- Tổng quan về Interface Chúng ta biết rằng một class chỉ có thể mở rộng từ một class cha ? 1 2 // Lớp B là con của lớp A, hoặc nói cách khác là B mở rộng từ A 3 // Java chỉ cho phép một lớp mở rộng từ duy nhất một lớp khác public class B extends A { 4 // 5 } 6 7 // Trong trường hợp không chỉ rõ lớp B mở rộng từ một lớp cụ thể nào 8 // Mặc định, hiểu rằng B mở rộng từ lớp Object 9 public class B { 10 } 11 12 // Cách khai báo này, và cách phía trên là tương đương nhau 13 public class B extends Object { 14 15 } 16 Tự học lập trình với https://lap-trinh-may-tinh.blogspot.com 19 TỰ HỌC LẬP TRÌNH JAVA Nhưng một class có thể mở rộng từ nhiều Interface ? 1 // Một lớp chỉ có thể mở rộng từ 1 lớp cha 2 // Nhưng có thể thực hiện (mở rộng) từ nhiều Interface 3 public class Cat extends Animal implements CanEat, CanDrink { 4 5 // 6 } Các đặc điểm của interface 1 Interface luôn luôn có modifier là: public interface, cho dù bạn có khai báo rõ hay không 2 Nếu có các trường (field) thì chúng đều là: public static final, cho dù bạn có khai báo rõ hay không 3 Các method của nó đều là method trừu tượng, nghĩa là không có thân hàm, và đều có modifier là: public abstract, cho dù bạn có khai báo hay không 4 Interface không có Constructor (cấu tử) 5- Cấu trúc của một Interface NoAccessModifierInterface.java ? 1 package org.o7planning.tutorial.itf; 2 3 // Đây là một interface không chỉ định rõ 'access modifier' 4 // Access modifier của nó là mặc định 5 // Chỉ các lớp cùng package mới có thể thi hành interface này 6 interface NoAccessModifierInterface { 7 } 8 Tự học lập trình với https://lap-trinh-may-tinh.blogspot.com 20