Thứ Bảy, 26 tháng 1, 2019

Học lập trình Java - Đa hình

Đa hình là khả năng của một đối tượng có nhiều dạng. Việc sử dụng đa hình phổ biến nhất trong OOP xảy ra khi tham chiếu lớp cha được sử dụng để chỉ đối tượng lớp con.

Bất kỳ đối tượng Đào tạo lập trình Java nào có thể vượt qua nhiều thử nghiệm IS-A đều được coi là đa hình. Trong Java, tất cả các đối tượng Java là đa hình vì bất kỳ đối tượng nào cũng sẽ vượt qua bài kiểm tra IS-A cho loại riêng của chúng và cho Đối tượng lớp.

Học lập trình Java chuyên nghiệp
Học lập trình Java chuyên nghiệp

Điều quan trọng cần biết là cách duy nhất có thể để truy cập một đối tượng là thông qua một biến tham chiếu. Một biến tham chiếu có thể chỉ có một loại. Sau khi khai báo, loại biến tham chiếu không thể thay đổi.

Đào tạo lập trình Java Biến tham chiếu có thể được gán lại cho các đối tượng khác với điều kiện là nó không được khai báo cuối cùng. Kiểu của biến tham chiếu sẽ xác định các phương thức mà nó có thể gọi trên đối tượng.

Một biến tham chiếu có thể tham chiếu đến bất kỳ đối tượng nào thuộc kiểu khai báo hoặc bất kỳ kiểu con nào của kiểu khai báo của nó. Một biến tham chiếu có thể được khai báo là một lớp hoặc loại giao diện.

Chúng ta hãy xem xét một ví dụ.

public interface Vegetarian{}
public class Animal{}
public class Deer extends Animal implements Vegetarian{}
Bây giờ, lớp Deer được coi là đa hình vì điều này có nhiều sự kế thừa. Sau đây là đúng với các ví dụ trên -

Một con nai IS-Một con vật

Một con nai IS-A chay

Một con nai IS-Một con nai

Một con nai IS-A Object

Khi chúng tôi áp dụng các sự kiện biến tham chiếu cho tham chiếu đối tượng Deer, các khai báo sau là hợp pháp
Deer d = new Deer();
Animal a = d;
Vegetarian v = d;
Object o = d;
Tất cả các biến tham chiếu d, a, v, o đều đề cập đến cùng một đối tượng Deer trong heap.

Phương thức ảo

Trong phần này, tôi sẽ chỉ cho bạn cách hành vi của các phương thức được ghi đè trong Đào tạo lập trình Java cho phép bạn tận dụng tính đa hình khi thiết kế các lớp của mình.

Chúng ta đã thảo luận về ghi đè phương thức, trong đó một lớp con có thể ghi đè một phương thức trong lớp cha của nó. Một phương thức được ghi đè về cơ bản được ẩn trong lớp cha và không được gọi trừ khi lớp con sử dụng siêu từ khóa trong phương thức ghi đè.
/* File name : Employee.java */
public class Employee {
   private String name;
   private String address;
   private int number;

   public Employee(String name, String address, int number) {
      System.out.println("Constructing an Employee");
      this.name = name;
      this.address = address;
      this.number = number;
   }

   public void mailCheck() {
      System.out.println("Mailing a check to " + this.name + " " + this.address);
   }

   public String toString() {
      return name + " " + address + " " + number;
   }

   public String getName() {
      return name;
   }

   public String getAddress() {
      return address;
   }

   public void setAddress(String newAddress) {
      address = newAddress;
   }

   public int getNumber() {
      return number;
   }
}
Bây giờ, giả sử chúng tôi mở rộng lớp Nhân viên như sau
/* File name : Salary.java */
public class Salary extends Employee {
   private double salary; // Annual salary
   
   public Salary(String name, String address, int number, double salary) {
      super(name, address, number);
      setSalary(salary);
   }
   
   public void mailCheck() {
      System.out.println("Within mailCheck of Salary class ");
      System.out.println("Mailing check to " + getName()
      + " with salary " + salary);
   }
   
   public double getSalary() {
      return salary;
   }
   
   public void setSalary(double newSalary) {
      if(newSalary >= 0.0) {
         salary = newSalary;
      }
   }
   
   public double computePay() {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
}
Bây giờ, Đào tạo lập trình Java nghiên cứu chương trình sau một cách cẩn thận và cố gắng xác định đầu ra của nó
/* File name : VirtualDemo.java */
public class VirtualDemo {

   public static void main(String [] args) {
      Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
      Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
      System.out.println("Call mailCheck using Salary reference --");   
      s.mailCheck();
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
   }
}
Constructing an Employee
Constructing an Employee

Call mailCheck using Salary reference --
Within mailCheck of Salary class
Mailing check to Mohd Mohtashim with salary 3600.0

Call mailCheck using Employee reference--
Within mailCheck of Salary class
Mailing check to John Adams with salary 2400.0

Ở đây, Đào tạo lập trình Java chúng tôi khởi tạo hai đối tượng Mức lương. Một cách sử dụng một tài liệu tham khảo Mức lương s , và người kia sử dụng một tài liệu tham khảo nhân viên e .

Trong khi gọi s.mailCheck () , trình biên dịch sẽ thấy mailCheck () trong lớp Mức lương tại thời gian biên dịch và JVM gọi mailCheck () trong lớp Mức lương khi chạy.

mailCheck () trên e khá khác biệt vì e là tài liệu tham khảo của Nhân viên. Khi trình biên dịch nhìn thấy e.mailCheck () , trình biên dịch sẽ thấy phương thức mailCheck () trong lớp Nhân viên.

Ở đây, tại thời điểm biên dịch, trình biên dịch đã sử dụng mailCheck () trong Nhân viên để xác thực tuyên bố này. Đào tạo lập trình Java Tuy nhiên, tại thời gian chạy, JVM gọi mailCheck () trong lớp Mức lương.

Hành vi này được gọi là gọi phương thức ảo và các phương thức này được gọi là phương thức ảo. Một phương thức ghi đè được gọi trong thời gian chạy, bất kể kiểu tham chiếu nào được sử dụng trong mã nguồn tại thời gian biên dịch.

Thứ Sáu, 25 tháng 1, 2019

Đào tạo lập trình Java - Ghi Đè

Trong chương trước, Đào tạo lập trình Java chúng ta đã nói về siêu lớp và các lớp con. Nếu một lớp kế thừa một phương thức từ siêu lớp của nó, thì có khả năng ghi đè phương thức với điều kiện là nó không được đánh dấu cuối cùng.

Đào tạo lập trình Java chuyên nghiệp
Đào tạo lập trình Java chuyên nghiệp

Lợi ích của việc ghi đè là: khả năng xác định một hành vi dành riêng cho loại lớp con, có nghĩa là một lớp con có thể thực hiện một phương thức lớp cha dựa trên yêu cầu của nó.

Theo thuật ngữ hướng đối tượng, Đào tạo lập trình Java ghi đè có nghĩa là ghi đè chức năng của một phương thức hiện có.
class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal a = new Animal();   // Animal reference and object
      Animal b = new Dog();   // Animal reference but Dog object

      a.move();   // runs the method in Animal class
      b.move();   // runs the method in Dog class
   }
}
Điều này sẽ tạo ra kết quả sau

Animals can move
Dogs can walk and run

Trong ví dụ trên, bạn có thể thấy rằng mặc dù b là một loại Động vật, nó vẫn chạy phương thức di chuyển trong lớp Dog. Đào tạo lập trình Java Lý do cho điều này là:

Trong thời gian biên dịch, kiểm tra được thực hiện trên loại tham chiếu. Tuy nhiên, trong thời gian chạy, JVM chỉ ra loại đối tượng và sẽ chạy phương thức thuộc về đối tượng cụ thể đó.

Do đó, trong ví dụ trên, chương trình sẽ biên dịch đúng vì lớp Animal có phương thức di chuyển. Sau đó, tại thời gian chạy, nó chạy phương thức cụ thể cho đối tượng đó.

Hãy xem xét ví dụ sau

class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      System.out.println("Dogs can walk and run");
   }
   public void bark() {
      System.out.println("Dogs can bark");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal a = new Animal();   // Animal reference and object
      Animal b = new Dog();   // Animal reference but Dog object

      a.move();   // runs the method in Animal class
      b.move();   // runs the method in Dog class
      b.bark();
   }
}

Điều này sẽ tạo ra kết quả sau 

TestDog.java:26: error: cannot find symbol
      b.bark();
       ^
  symbol:   method bark()
  location: variable b of type Animal
1 error

Chương trình này sẽ đưa ra lỗi thời gian biên dịch do kiểu tham chiếu của b Animal không có phương thức bằng tên của vỏ cây.

Quy tắc ghi đè phương thức

Danh sách đối số phải giống hệt như phương thức được ghi đè Đào tạo lập trình Java.

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

Mức truy cập không thể hạn chế hơn mức truy cập của phương thức bị ghi đè. Ví dụ: Nếu phương thức siêu lớp được khai báo công khai thì phương thức ghi đè trong lớp con có thể là riêng tư hoặc được bảo vệ.

Các phương thức sơ thẩm chỉ có thể được ghi đè nếu chúng được kế thừa bởi lớp con.

Một phương thức được tuyên bố cuối cùng không thể được ghi đè.

Một phương thức được khai báo tĩnh không thể bị ghi đè nhưng có thể được khai báo lại.

Nếu một phương thức không thể được kế thừa, thì nó không thể bị ghi đè.

Một lớp con trong cùng một gói như siêu lớp của cá thể có thể ghi đè bất kỳ phương thức siêu lớp nào không được khai báo là riêng tư hoặc cuối cùng.

Một lớp con trong một gói khác nhau chỉ có thể ghi đè các phương thức không phải là cuối cùng được khai báo công khai hoặc được bảo vệ Đào tạo lập trình Java.

Một phương thức ghi đè có thể đưa ra bất kỳ ngoại lệ không được kiểm tra nào, bất kể phương thức ghi đè đó có ném ngoại lệ hay không. 

Tuy nhiên, phương thức ghi đè không được đưa ra các ngoại lệ được kiểm tra là mới hoặc rộng hơn so với phương pháp được ghi đè bằng phương thức ghi đè. Phương thức ghi đè có thể đưa ra các ngoại lệ hẹp hơn hoặc ít hơn so với phương thức ghi đè.

Con constructor không thể bị ghi đè Đào tạo lập trình Java.

Sử dụng siêu từ khóa

Khi gọi một phiên bản siêu lớp của một phương thức được ghi đè, siêu từ khóa được sử dụng.
class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      super.move();   // invokes the super class method
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal b = new Dog();   // Animal reference but Dog object
      b.move();   // runs the method in Dog class
   }
}

Điều này sẽ tạo ra kết quả sau

Animals can move
Dogs can walk and run

Thứ Năm, 24 tháng 1, 2019

Khóa học lập trình Java - Kế thừa

Kế thừa có thể được định nghĩa là quá trình trong đó một lớp có được các thuộc tính (phương thức và trường) của lớp khác. Với việc sử dụng tính kế thừa, thông tin được quản lý theo thứ tự phân cấp.

Khóa học lập trình Java Lớp kế thừa các thuộc tính của lớp khác được gọi là lớp con (lớp dẫn xuất, lớp con) và lớp có các thuộc tính được kế thừa được gọi là lớp cha (lớp cơ sở, lớp cha).

Khóa học lập trình Java
Khóa học lập trình Java

mở rộng từ khóa


extends là từ khóa được sử dụng để kế thừa các thuộc tính của một lớp. Sau đây là cú pháp mở rộng từ khóa.

class Super {
   .....
   .....
}
class Sub extends Super {
   .....
   .....
}

Mã mẫu

Sau đây là một ví dụ minh họa sự kế thừa Khóa học lập trình Java. Trong ví dụ này, bạn có thể quan sát hai lớp là Tính toán và My_Calculation.

Sử dụng từ khóa mở rộng, My_Calculation kế thừa các phương thức phép cộng () và phép trừ () của lớp Tính toán.

Sao chép và dán chương trình sau vào một tệp có tên My_Calculation.java
class Calculation {
   int z;
 
   public void addition(int x, int y) {
      z = x + y;
      System.out.println("The sum of the given numbers:"+z);
   }
 
   public void Subtraction(int x, int y) {
      z = x - y;
      System.out.println("The difference between the given numbers:"+z);
   }
}

public class My_Calculation extends Calculation {
   public void multiplication(int x, int y) {
      z = x * y;
      System.out.println("The product of the given numbers:"+z);
   }
 
   public static void main(String args[]) {
      int a = 20, b = 10;
      My_Calculation demo = new My_Calculation();
      demo.addition(a, b);
      demo.Subtraction(a, b);
      demo.multiplication(a, b);
   }
}
Biên dịch và thực thi mã trên như dưới đây.

javac My_Calculation.java
java My_Calculation

Sau khi thực hiện chương trình, nó sẽ tạo ra kết quả như sau

The sum of the given numbers:30
The difference between the given numbers:10
The product of the given numbers:200

Trong chương trình đã cho, khi một đối tượng cho lớp My_Calculation được tạo, một bản sao nội dung của siêu lớp được tạo trong nó. Đó là lý do tại sao, bằng cách sử dụng đối tượng của lớp con, bạn có thể truy cập các thành viên của siêu lớp.

Biến tham chiếu Superclass có thể giữ đối tượng lớp con, nhưng sử dụng biến đó bạn chỉ có thể truy cập các thành viên của siêu lớp, Khóa học lập trình Java vì vậy, để truy cập các thành viên của cả hai lớp, nên luôn luôn tạo biến tham chiếu cho lớp con.

Nếu bạn xem xét chương trình trên, bạn có thể khởi tạo lớp như được đưa ra dưới đây. Nhưng bằng cách sử dụng biến tham chiếu siêu lớp ( cal trong trường hợp này), bạn không thể gọi phương thức nhân () , thuộc lớp con My_Calculation.
Calculation demo = new My_Calculation();
demo.addition(a, b);
demo.Subtraction(a, b);

Lưu ý - Một lớp con kế thừa tất cả các thành viên (các trường, phương thức và các lớp lồng nhau) từ lớp cha của nó. Các constructor không phải là thành viên, vì vậy chúng không được kế thừa bởi các lớp con, nhưng hàm tạo của lớp cha có thể được gọi từ lớp con.

Từ khóa siêu Khóa học lập trình Java

Các từ khóa siêu tương tự như từ khóa này . Sau đây là các tình huống mà siêu từ khóa được sử dụng.

Nó được sử dụng để phân biệt các thành viên của siêu lớp với các thành viên của lớp con, nếu chúng có cùng tên.

Nó được sử dụng để gọi hàm tạo của lớp bậc trên từ lớp con.

Phân biệt các thành viên

Nếu một lớp đang kế thừa các thuộc tính của lớp khác. Và nếu các thành viên của siêu lớp có tên giống như lớp con, để phân biệt các biến này, chúng tôi sử dụng siêu từ khóa như dưới đây.

super.variable
super.method();

Mã mẫu

Phần này cung cấp cho bạn một chương trình thể hiện việc sử dụng siêu từ khóa.

Trong chương trình đã cho, bạn có hai lớp là Sub_group và Super_group , cả hai đều có một phương thức có tên display () với các cách triển khai khác nhau và một biến có tên num với các giá trị khác nhau. 

Chúng tôi đang gọi phương thức display () của cả hai lớp và in giá trị của num biến của cả hai lớp. Ở đây bạn có thể quan sát rằng chúng tôi đã sử dụng siêu từ khóa để phân biệt các thành viên của siêu lớp với lớp con.

Sao chép và dán chương trình trong một tệp có tên Khóa học lập trình Java. Biên dịch và thực thi mã trên bằng cú pháp sau.

javac Super_Demo
java Super

Khi thực hiện chương trình, bạn sẽ nhận được kết quả sau

This is the display method of subclass
This is the display method of superclass
value of the variable named num in sub class:10
value of the variable named num in super class:20

Gọi siêu xây dựng

Nếu một lớp đang kế thừa các thuộc tính của một lớp khác, lớp con sẽ tự động có được hàm tạo mặc định của lớp cha. Nhưng nếu bạn muốn gọi một hàm tạo tham số của siêu lớp, bạn cần sử dụng siêu từ khóa như dưới đây.

super(values);

Mã mẫu

Chương trình được đưa ra trong phần này trình bày cách sử dụng siêu từ khóa để gọi hàm tạo tham số của siêu lớp. 

Chương trình này chứa một siêu lớp và một lớp con, trong đó siêu lớp chứa một hàm tạo được tham số hóa chấp nhận một giá trị nguyên và chúng tôi đã sử dụng siêu từ khóa để gọi hàm tạo tham số của siêu lớp.

Sao chép và dán chương trình sau vào một tệp có tên Khóa học lập trình Java
class Superclass {
   int age;

   Superclass(int age) {
      this.age = age;    
   }

   public void getAge() {
      System.out.println("The value of the variable named age in super class is: " +age);
   }
}

public class Subclass extends Superclass {
   Subclass(int age) {
      super(age);
   }

   public static void main(String argd[]) {
      Subclass s = new Subclass(24);
      s.getAge();
   }
}
Biên dịch và thực thi mã trên bằng cú pháp sau.

javac Subclass
java Subclass

Khóa học lập trình Java Khi thực hiện chương trình, bạn sẽ nhận được kết quả sau

The value of the variable named age in super class is: 24

Mối quan hệ IS-A

IS-A là một cách nói: Đối tượng này là một loại đối tượng đó. Hãy cho chúng tôi xem làm thế nào từ khóa mở rộng được sử dụng để đạt được sự kế thừa.
công lớp Animal { }   


lớp học công cộng Động vật có vú mở rộng Động vật { }     


Lớp công khai Bò sát kéo dài Động vật { }     


lớp công cộng Chó kéo dài Động vật có vú { }     
Bây giờ, dựa trên ví dụ trên, theo thuật ngữ Hướng đối tượng, những điều sau đây là đúng -

Động vật là siêu lớp của động vật có vú.

Động vật là siêu lớp của lớp Bò sát.

Động vật có vú và bò sát là các lớp con của lớp Động vật.

Chó là lớp con của cả hai lớp Động vật có vú và Động vật.

Bây giờ, nếu chúng ta xem xét mối quan hệ IS-A, chúng ta có thể nói -

Động vật có vú IS-A

Bò sát IS-A Animal

Chó IS-A động vật có vú

Do đó: Chó IS-A Animal cũng vậy

Với việc sử dụng từ khóa mở rộng, các lớp con sẽ có thể kế thừa tất cả các thuộc tính của siêu lớp trừ các thuộc tính riêng của siêu lớp.

Chúng tôi có thể đảm bảo rằng Động vật có vú thực sự là một Động vật với việc sử dụng toán tử cá thể.

true
true
true

Khóa học lập trình Java Vì chúng tôi hiểu rõ về từ khóa mở rộng , chúng ta hãy xem xét cách sử dụng từ khóa thực hiện để có được mối quan hệ IS-A.

Nói chung, từ khóa thực hiện được sử dụng với các lớp để kế thừa các thuộc tính của giao diện. Các giao diện không bao giờ có thể được mở rộng bởi một lớp.
public interface Animal {
}

public class Mammal implements Animal {
}

public class Dog extends Mammal {
}

Ví dụ từ khóa

Chúng ta hãy sử dụng toán tử instanceof để kiểm tra xem liệu Mammal có thực sự là Động vật hay không và chó có thực sự là Động vật hay không.

true
true
true

Có một mối quan hệ

Những mối quan hệ này chủ yếu dựa trên việc sử dụng. Điều này xác định xem một lớp nhất định ĐÃ-Một điều nhất định. Mối quan hệ này giúp giảm trùng lặp mã cũng như lỗi.
public class Vehicle{}
public class Speed{}

public class Van extends Vehicle {
   private Speed sp;
} 
Điều này cho thấy lớp Van HAS-A Speed. Bằng cách có một lớp riêng cho Tốc độ, chúng ta không phải đặt toàn bộ mã thuộc về tốc độ bên trong lớp Van, điều này cho phép sử dụng lại lớp Tốc độ trong nhiều ứng dụng.

Trong tính năng Hướng đối tượng, người dùng không cần bận tâm về đối tượng nào đang thực hiện công việc thực sự. Để đạt được điều này, lớp Van ẩn các chi tiết triển khai từ những người dùng của lớp Van. Vì vậy, về cơ bản những gì xảy ra là người dùng sẽ yêu cầu lớp Van thực hiện một hành động nhất định và lớp Van sẽ tự thực hiện công việc hoặc yêu cầu một lớp khác thực hiện hành động đó.

Các kiểu thừa kế

Có nhiều loại thừa kế như được trình bày dưới đây.

Một thực tế rất quan trọng cần nhớ là Khóa học lập trình Java không hỗ trợ nhiều kế thừa. Điều này có nghĩa là một lớp không thể mở rộng nhiều hơn một lớp. Do đó, sau đây là bất hợp pháp
public class extends Animal, Mammal{} 
Tuy nhiên, một lớp có thể thực hiện một hoặc nhiều giao diện, điều này đã giúp Khóa học lập trình Java thoát khỏi sự bất khả thi của nhiều kế thừa.

Lập trình Java - Ngoại lệ

Một ngoại lệ (hoặc sự kiện đặc biệt) là một vấn đề phát sinh trong quá trình thực hiện chương trình. Khi xảy ra Ngoại lệ , luồng bình thường...