Thứ Sáu, 31 tháng 8, 2018

Gói Java

Các gói được sử dụng trong Lập trình Java để ngăn chặn xung đột tên, để kiểm soát truy cập, để tìm kiếm / định vị và sử dụng các lớp, giao diện, liệt kê và chú thích dễ dàng hơn, v.v.

Một gói có thể được định nghĩa là một nhóm các kiểu liên quan (các lớp, các giao diện, các liệt kê và các chú thích) cung cấp khả năng bảo vệ truy cập và quản lý không gian tên.

Một số gói hiện có trong Java là

java.lang - gói các lớp cơ bản

java.io - các lớp cho các hàm đầu vào, đầu ra được gói trong gói này

Các lập trình viên có thể định nghĩa các gói riêng của họ để nhóm các lớp / giao diện, vv. Thực hành tốt để nhóm các lớp liên quan do bạn thực hiện để người lập trình có thể dễ dàng xác định rằng các lớp, giao diện, liệt kê và chú thích có liên quan.

Vì gói tạo ra một không gian tên mới nên sẽ không có bất kỳ xung đột tên nào với các tên trong các gói khác. Sử dụng các gói, nó dễ dàng hơn để cung cấp kiểm soát truy cập và nó cũng dễ dàng hơn để xác định vị trí các lớp liên quan.

Tạo một gói

Trong khi tạo một gói, bạn nên chọn tên cho gói và bao gồm một tuyên bố góicùng với tên đó ở trên cùng của mỗi tệp nguồn chứa các lớp, các giao diện, các liệt kê và các loại chú thích mà bạn muốn đưa vào gói.

Câu lệnh gói phải là dòng đầu tiên trong tệp nguồn. Chỉ có thể có một tuyên bố gói trong mỗi tệp nguồn và nó áp dụng cho tất cả các loại trong tệp.

Nếu không sử dụng câu lệnh gói thì lớp, giao diện, liệt kê và các loại chú thích sẽ được đặt trong gói mặc định hiện tại.

Để biên dịch các chương trình Java với các câu lệnh gói, bạn phải sử dụng tùy chọn -d như được hiển thị bên dưới.

javac -d Destination_folder file_name.java

Sau đó, một thư mục với tên gói đã cho được tạo trong đích đã chỉ định, và các tệp lớp được biên dịch sẽ được đặt trong thư mục đó.

Thí dụ

Chúng ta hãy xem một ví dụ tạo ra một gói được gọi là động vật . Thực hành tốt là sử dụng tên của các gói có chữ thường để tránh xung đột với tên của các lớp và giao diện.

Ví dụ sau gói chứa giao diện có tên là động vật
/* File name : Animal.java */
package animals;

interface Animal {
   public void eat();
   public void travel();
}
Bây giờ, chúng ta hãy thực hiện giao diện trên trong cùng một gói động vật
package animals;
/* File name : MammalInt.java */

public class MammalInt implements Animal {

   public void eat() {
      System.out.println("Mammal eats");
   }

   public void travel() {
      System.out.println("Mammal travels");
   } 

   public int noOfLegs() {
      return 0;
   }

   public static void main(String args[]) {
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
} 
Bây giờ biên dịch các tập tin java như hình dưới đây

$ javac -d . Animal.java 
$ javac -d . MammalInt.java

Bây giờ một gói / thư mục với tên động vật sẽ được tạo trong thư mục hiện tại và các tệp lớp này sẽ được đặt trong nó như được hiển thị bên dưới.

Học lập trình java
Bạn có thể thực thi tệp lớp trong gói và nhận kết quả như được hiển thị bên dưới.

Mammal eats
Mammal travels

Từ khóa nhập khẩu

Nếu một lớp muốn sử dụng một lớp khác trong cùng một gói, tên gói không cần được sử dụng. Các lớp trong cùng một gói tìm thấy nhau mà không có bất kỳ cú pháp đặc biệt nào.

Thí dụ

Ở đây, một lớp có tên Boss được thêm vào gói lương đã có nhân viên. Boss sau đó có thể tham khảo lớp Employee mà không cần sử dụng tiền tố tiền lương, như được trình bày bởi lớp Boss sau đây.
package payroll;
public class Boss {
   public void payEmployee(Employee e) {
      e.mailCheck();
   }
}
Điều gì sẽ xảy ra nếu lớp nhân viên không có trong gói biên chế? Lớp Boss sau đó phải sử dụng một trong các kỹ thuật sau đây để tham chiếu đến một lớp trong một gói khác.Tên đầy đủ của lớp có thể được sử dụng. Ví dụ
payroll.Employee
Gói có thể được nhập bằng cách sử dụng từ khóa nhập khẩu và thẻ hoang dã (*). Ví dụ -
import payroll.*;
Bản thân lớp có thể được nhập bằng từ khóa nhập. Ví dụ -
import payroll.Employee;
Lưu ý - Một tệp lớp có thể chứa bất kỳ số lượng câu lệnh nhập nào. Các câu lệnh import phải xuất hiện sau câu lệnh package và trước khai báo lớp.

Cấu trúc thư mục của gói

Hai kết quả chính xảy ra khi một lớp được đặt trong một gói

Tên của gói trở thành một phần của tên của lớp, như chúng ta vừa thảo luận trong phần trước.

Tên của gói phải khớp với cấu trúc thư mục, nơi mã byte bytecode tương ứng cư trú.

Đây là cách đơn giản để quản lý các tệp của bạn bằng Java

Đặt mã nguồn cho một loại, giao diện, kiểu liệt kê hoặc loại chú thích trong một tệp văn bản có tên là tên đơn giản của loại và có phần mở rộng là .java .

Ví dụ
// File Name :  Car.java
package vehicle;

public class Car {
   // Class implementation.   
}
Bây giờ, đặt tệp nguồn vào một thư mục có tên phản ánh tên của gói mà lớp đó thuộc về

....\vehicle\Car.java

Bây giờ, tên lớp và tên đường dẫn đủ điều kiện sẽ như sau:

Tên lớp → vehicle.Car

Tên đường dẫn → xe \ Car.java (trong cửa sổ)

Nói chung, một công ty sử dụng tên miền Internet đảo ngược của nó cho tên gói của nó.

Ví dụ - Tên miền Internet của công ty là apple.com, sau đó tất cả tên gói của nó sẽ bắt đầu bằng com.apple. Mỗi thành phần của tên gói tương ứng với một thư mục con.

Ví dụ - Công ty có gói com.apple.computers chứa tệp nguồn Dell.java, nó sẽ được chứa trong một loạt các thư mục con như thế này

....\com\apple\computers\Dell.java

Tại thời điểm biên dịch, trình biên dịch tạo ra một tệp đầu ra khác nhau cho mỗi lớp, giao diện và liệt kê được xác định trong nó. Tên cơ sở của tệp đầu ra là tên của loại và phần mở rộng của nó là .class .

Ví dụ
// File Name: Dell.java
package com.apple.computers;

public class Dell {
}

class Ups {
}
Bây giờ, biên dịch tập tin này như sau bằng cách sử dụng tùy chọn -d

$javac -d . Dell.java

Các tập tin sẽ được biên dịch như sau:

.\com\apple\computers\Dell.class
.\com\apple\computers\Ups.class

Bạn có thể nhập tất cả các lớp hoặc giao diện được định nghĩa trong \ com \ apple \ computers \ như sau:

import com.apple.computers.*; 

Giống như các tệp nguồn .java, các tệp .class được biên dịch phải nằm trong một loạt các thư mục phản ánh tên gói.

Tuy nhiên, đường dẫn đến tệp .class không phải giống với đường dẫn đến tệp nguồn .java. Bạn có thể sắp xếp các thư mục nguồn và lớp của bạn một cách riêng biệt, như

<path-one>\sources\com\apple\computers\Dell.java

<path-two>\classes\com\apple\computers\Dell.class

Bằng cách này, có thể cung cấp quyền truy cập vào thư mục lớp cho các lập trình viên khác mà không tiết lộ các nguồn của bạn. Bạn cũng cần quản lý các tệp nguồn và lớp theo cách này để trình biên dịch và Máy ảo Java (JVM) có thể tìm thấy tất cả các loại chương trình của bạn sử dụng.

Đường dẫn đầy đủ đến thư mục lớp, <path-two> \ classes, được gọi là đường dẫn lớp, và được thiết lập với biến hệ thống CLASSPATH. Cả trình biên dịch và JVM đều xây dựng đường dẫn tới các tệp .class của bạn bằng cách thêm tên gói vào đường dẫn lớp.

Nói <path-two> \ classes là đường dẫn lớp và tên gói là com.apple.computers, sau đó trình biên dịch và JVM sẽ tìm kiếm các tệp .class trong <path-two> \ classes \ com \ apple \ computers.

Đường dẫn lớp có thể bao gồm một số đường dẫn. Nhiều đường dẫn nên được phân tách bằng dấu chấm phẩy (Windows) hoặc dấu hai chấm (Unix). Theo mặc định, trình biên dịch và JVM tìm kiếm thư mục hiện tại và tệp JAR chứa các lớp nền tảng Java để các thư mục này được tự động trong đường dẫn lớp.

Đặt biến hệ thống CLASSPATH

Để hiển thị biến CLASSPATH hiện tại, sử dụng các lệnh sau trong Windows và UNIX (Bourne shell)

Trong Windows → C: \> đặt CLASSPATH

Trong UNIX →% echo $ CLASSPATH

Để xóa nội dung hiện tại của biến CLASSPATH, sử dụng -

Trong Windows → C: \> đặt CLASSPATH =

Trong UNIX →% unset CLASSPATH; xuất CLASSPATH

Để đặt biến CLASSPATH

Trong Windows → đặt CLASSPATH = C: \ users \ jack \ java \ classes

Trong UNIX →% CLASSPATH = / home / jack / java / classes; xuất CLASSPATH

Java - Giao diện

Giao diện là một kiểu tham chiếu trong Lập trình Java. Nó tương tự như lớp học. Nó là một tập hợp các phương thức trừu tượng. Một lớp thực hiện một giao diện, do đó kế thừa các phương thức trừu tượng của giao diện.
học java
Học lập trình java 
Cùng với các phương thức trừu tượng, một giao diện cũng có thể chứa các hằng số, các phương thức mặc định, các phương thức tĩnh và các kiểu lồng nhau. Các thể thức phương thức chỉ tồn tại cho các phương thức mặc định và các phương thức tĩnh.

Viết một giao diện tương tự như viết một lớp. Nhưng một lớp mô tả các thuộc tính và hành vi của một đối tượng. Và một giao diện chứa các hành vi mà một lớp thực hiện.

Trừ khi lớp thực hiện giao diện là trừu tượng, tất cả các phương thức của giao diện cần phải được định nghĩa trong lớp.

Một giao diện tương tự như một lớp theo các cách sau:

Một giao diện có thể chứa bất kỳ số phương thức nào.

Giao diện được viết trong một tệp có phần mở rộng .java , với tên của giao diện khớp với tên của tệp.

Mã byte của giao diện xuất hiện trong tệp .class .

Giao diện xuất hiện trong các gói và tệp bytecode tương ứng của chúng phải nằm trong cấu trúc thư mục khớp với tên gói.

Tuy nhiên, một giao diện khác với một lớp theo nhiều cách, bao gồm -

Bạn không thể khởi tạo một giao diện.

Giao diện không chứa bất kỳ hàm tạo nào.

Tất cả các phương thức trong một giao diện đều trừu tượng.

Một giao diện không thể chứa các trường mẫu. Các trường duy nhất có thể xuất hiện trong giao diện phải được khai báo cả tĩnh và cuối.

Một giao diện không được mở rộng bởi một lớp; nó được thực hiện bởi một lớp.

Một giao diện có thể mở rộng nhiều giao diện.

Khai báo giao diện

Các giao diện từ khóa được sử dụng để khai báo một giao diện. Đây là một ví dụ đơn giản để khai báo một giao diện

Thí dụ

Sau đây là ví dụ về giao diện
/* File name : NameOfInterface.java */
import java.lang.*;
// Any number of import statements

public interface NameOfInterface {
   // Any number of final, static fields
   // Any number of abstract method declarations\
}

Giao diện có các thuộc tính sau

Giao diện hoàn toàn trừu tượng. Bạn không cần phải sử dụng từ khóa trừu tượng trong khi khai báo một giao diện.

Mỗi phương thức trong một giao diện cũng hoàn toàn trừu tượng, do đó từ khóa trừu tượng là không cần thiết.

Các phương thức trong giao diện ngầm được công khai.

Thí dụ
/* File name : Animal.java */
interface Animal {
   public void eat();
   public void travel();
}

Triển khai giao diện

Khi một lớp thực hiện một giao diện, bạn có thể nghĩ rằng lớp đó là ký hợp đồng, đồng ý thực hiện các hành vi cụ thể của giao diện. Nếu một lớp không thực hiện tất cả các hành vi của giao diện, lớp đó phải tự khai báo là trừu tượng.

Một lớp học sử dụng các dụng cụ từ khóa để thực hiện một giao diện. Từ khóa thực hiện xuất hiện trong khai báo lớp sau phần mở rộng của khai báo.

Thí dụ
/* File name : MammalInt.java */
public class MammalInt implements Animal {

   public void eat() {
      System.out.println("Mammal eats");
   }

   public void travel() {
      System.out.println("Mammal travels");
   } 

   public int noOfLegs() {
      return 0;
   }

   public static void main(String args[]) {
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
} 
Điều này sẽ tạo ra kết quả sau

Đầu ra

Mammal eats
Mammal travels

Khi các phương thức ghi đè được định nghĩa trong các giao diện, có một số quy tắc cần tuân theo -

Các ngoại lệ được kiểm tra không nên được khai báo trên các phương thức thực hiện khác với các phương thức được khai báo bởi phương thức giao diện hoặc các lớp con của các phương thức được khai báo bởi phương thức giao diện.

Chữ ký của phương thức giao diện và cùng kiểu trả về hoặc kiểu con phụ nên được duy trì khi ghi đè các phương thức.

Một lớp thực hiện có thể là trừu tượng và nếu vậy, các phương thức giao diện không cần phải được thực hiện.

Khi triển khai giao diện, có một số quy tắc

Một lớp có thể triển khai nhiều hơn một giao diện tại một thời điểm.

Một lớp chỉ có thể mở rộng một lớp, nhưng thực hiện nhiều giao diện.

Một giao diện có thể mở rộng một giao diện khác, theo cách tương tự như một lớp có thể mở rộng một lớp khác.

Mở rộng giao diện

Một giao diện có thể mở rộng một giao diện khác theo cùng một cách mà một lớp có thể mở rộng một lớp khác. Các mở rộng từ khóa được sử dụng để mở rộng giao diện, và giao diện con được thừa hưởng các phương pháp của giao diện cha mẹ.

Giao diện Thể thao sau đây được mở rộng bằng các giao diện Khúc côn cầu và Bóng đá.

Thí dụ
// Filename: Sports.java
public interface Sports {
   public void setHomeTeam(String name);
   public void setVisitingTeam(String name);
}

// Filename: Football.java
public interface Football extends Sports {
   public void homeTeamScored(int points);
   public void visitingTeamScored(int points);
   public void endOfQuarter(int quarter);
}

// Filename: Hockey.java
public interface Hockey extends Sports {
   public void homeGoalScored();
   public void visitingGoalScored();
   public void endOfPeriod(int period);
   public void overtimePeriod(int ot);
}
Giao diện Hockey có bốn phương pháp, nhưng nó kế thừa hai từ Thể thao; do đó, một lớp thực hiện Hockey cần phải thực hiện tất cả sáu phương pháp. Tương tự như vậy, một lớp thực hiện bóng đá cần xác định ba phương pháp từ Bóng đá và hai phương pháp từ Thể thao.

Mở rộng nhiều giao diện

Một lớp Java chỉ có thể mở rộng một lớp cha. Không cho phép nhiều thừa kế. Giao diện không phải là các lớp, tuy nhiên, và một giao diện có thể mở rộng nhiều hơn một giao diện cha.

Từ khoá mở rộng được sử dụng một lần và các giao diện cha được khai báo trong danh sách được phân cách bằng dấu phẩy.

Ví dụ: nếu giao diện Khúc côn cầu mở rộng cả Thể thao và Sự kiện, nó sẽ được khai báo là -

Thí dụ
public interface Hockey extends Sports, Event

Gắn thẻ giao diện

Việc sử dụng phổ biến nhất của các giao diện mở rộng xảy ra khi giao diện cha mẹ không chứa bất kỳ phương thức nào. Ví dụ, giao diện MouseListener trong gói java.awt.event mở rộng java.util.EventListener, được định nghĩa là

Thí dụ
package java.util;
public interface EventListener
{}
Một giao diện không có phương thức nào trong nó được gọi là giao diện gắn thẻ . Có hai mục đích thiết kế cơ bản về gắn thẻ giao diện

Tạo một phụ huynh chung - Giống như với giao diện EventListener, được mở rộng bởi hàng tá giao diện khác trong API Java, bạn có thể sử dụng một giao diện gắn thẻ để tạo một phụ huynh chung trong một nhóm các giao diện. Ví dụ, khi một giao diện mở rộng EventListener, JVM biết rằng giao diện cụ thể này sẽ được sử dụng trong một kịch bản ủy nhiệm sự kiện.

Thêm kiểu dữ liệu vào một lớp - Tình huống này là nơi mà thuật ngữ, gắn thẻ đến từ đó. Một lớp thực hiện một giao diện gắn thẻ không cần phải định nghĩa bất kỳ phương thức nào (vì giao diện không có bất kỳ phương thức nào), nhưng lớp đó trở thành một loại giao diện thông qua đa hình.

Java - Đóng gói

Học lập trình java. Đóng gói là một trong bốn khái niệm OOP cơ bản. Ba loại còn lại là thừa kế, đa hình và trừu tượng hóa.

Học lập trình Java 

Việc đóng gói trong Java là một cơ chế bao bọc dữ liệu (các biến) và mã tác động lên dữ liệu (các phương thức) với nhau thành một đơn vị duy nhất. Trong đóng gói, các biến của một lớp sẽ được ẩn khỏi các lớp khác, và có thể được truy cập chỉ thông qua các phương thức của lớp hiện tại của chúng. Do đó, nó còn được gọi là ẩn dữ liệu .

Để đạt được đóng gói trong Java

Khai báo các biến của một lớp là riêng tư.

Cung cấp các phương thức setter và getter công cộng để sửa đổi và xem các giá trị biến.

Thí dụ

Sau đây là một ví dụ minh họa cách để đạt được Encapsulation trong Java
/* File name : EncapTest.java */
public class EncapTest {
   private String name;
   private String idNum;
   private int age;

   public int getAge() {
      return age;
   }

   public String getName() {
      return name;
   }

   public String getIdNum() {
      return idNum;
   }

   public void setAge( int newAge) {
      age = newAge;
   }

   public void setName(String newName) {
      name = newName;
   }

   public void setIdNum( String newId) {
      idNum = newId;
   }
}
Các phương thức public setXXX () và getXXX () là các điểm truy cập của các biến cá thể của lớp EncapTest.

Thông thường, những phương pháp này được gọi là getters và setters. Do đó, bất kỳ lớp nào muốn truy cập các biến sẽ truy cập chúng thông qua các getters và setters này.

Các biến của lớp EncapTest có thể được truy cập bằng cách sử dụng chương trình sau:
/* File name : RunEncap.java */
public class RunEncap {

   public static void main(String args[]) {
      EncapTest encap = new EncapTest();
      encap.setName("James");
      encap.setAge(20);
      encap.setIdNum("12343ms");

      System.out.print("Name : " + encap.getName() + " Age : " + encap.getAge());
   }
}
Điều này sẽ tạo ra kết quả sau

Đầu ra

Name : James Age : 20

Lợi ích của đóng gói

Các trường của một lớp có thể được thực hiện chỉ đọc hoặc chỉ ghi.

Một lớp có thể có toàn quyền kiểm soát những gì được lưu trữ trong các trường của nó.

Java - Trừu tượng

Học Lập Trình Java Theo từ điển, trừu tượng là chất lượng xử lý ý tưởng thay vì các sự kiện. Ví dụ, khi bạn xem xét trường hợp e-mail, các chi tiết phức tạp như những gì xảy ra ngay khi bạn gửi e-mail, giao thức mà máy chủ email của bạn sử dụng bị ẩn khỏi người dùng. Vì vậy, để gửi một e-mail bạn chỉ cần gõ nội dung, đề cập đến địa chỉ của người nhận, và bấm gửi.

học lập trình java
Tương tự như vậy trong lập trình hướng đối tượng, trừu tượng là một quá trình ẩn các chi tiết thực hiện từ người dùng, chỉ có chức năng sẽ được cung cấp cho người dùng. Nói cách khác, người dùng sẽ có thông tin về những gì đối tượng làm thay vì nó làm như thế nào.

Trong Java, sự trừu tượng đạt được bằng cách sử dụng các lớp Abstract và các giao diện.

Lớp trừu tượng

Một lớp có chứa từ khóa trừu tượng trong khai báo của nó được gọi là lớp trừu tượng.

Các lớp trừu tượng có thể hoặc không thể chứa các phương thức trừu tượng , tức là, các phương thức không có phần thân (public void get ();)

Nhưng, nếu một lớp có ít nhất một phương thức trừu tượng, thì lớp đó phải được khai báo trừu tượng.

Nếu một lớp được khai báo trừu tượng, nó không thể được khởi tạo.

Để sử dụng một lớp trừu tượng, bạn phải kế thừa nó từ một lớp khác, cung cấp các triển khai thực hiện các phương thức trừu tượng trong nó.

Nếu bạn kế thừa một lớp trừu tượng, bạn phải cung cấp các triển khai cho tất cả các phương thức trừu tượng trong nó.

Thí dụ

Phần này cung cấp cho bạn một ví dụ về lớp trừu tượng. Để tạo một lớp trừu tượng, chỉ cần sử dụng từ khóa trừu tượng trước từ khóa lớp, trong khai báo lớp.
/* File name : Employee.java */
public abstract 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 double computePay() {
     System.out.println("Inside Employee computePay");
     return 0.0;
   }
   
   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ạn có thể quan sát ngoại trừ các phương thức trừu tượng, lớp Employee giống với lớp bình thường trong Java. Lớp bây giờ là trừu tượng, nhưng nó vẫn có ba trường, bảy phương thức và một hàm tạo.

Bây giờ bạn có thể thử khởi tạo lớp Employee theo cách sau:
/* File name : AbstractDemo.java */
public class AbstractDemo {

   public static void main(String [] args) {
      /* Following is not allowed and would raise error */
      Employee e = new Employee("George W.", "Houston, TX", 43);
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
   }
}
Khi bạn biên dịch lớp trên, nó cung cấp cho bạn lỗi sau:
Employee.java:46: Employee is abstract; cannot be instantiated
      Employee e = new Employee("George W.", "Houston, TX", 43);
                   ^
1 error

Thừa kế lớp trừu tượng

Chúng ta có thể kế thừa các thuộc tính của lớp Employee giống như lớp bê tông theo cách sau -

Thí dụ
/* 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;
   }
}
Ở đây, bạn không thể khởi tạo lớp Employee, nhưng bạn có thể khởi tạo lớp Salary Class và sử dụng cá thể này, bạn có thể truy cập tất cả ba trường và bảy phương thức của lớp Employee như hình dưới đây.
/* File name : AbstractDemo.java */
public class AbstractDemo {

   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();
   }
}
Điều này tạo ra kết quả sau

Đầu ra

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

Phương pháp trừu tượng

Nếu bạn muốn một lớp có chứa một phương thức cụ thể nhưng bạn muốn thực hiện thực tế phương thức đó được xác định bởi các lớp con, bạn có thể khai báo phương thức trong lớp cha làm trừu tượng.

từ khóa trừu tượng được sử dụng để khai báo phương thức là trừu tượng.

Bạn phải đặt từ khóa trừu tượng trước tên phương thức trong khai báo phương thức.

Một phương thức trừu tượng chứa chữ ký phương thức, nhưng không có phần thân phương thức.

Thay vì dấu ngoặc nhọn, một phương thức trừu tượng sẽ có dấu chấm phẩy (;) ở cuối.

Sau đây là một ví dụ về phương pháp trừu tượng.

Thí dụ
public abstract class Employee {
   private String name;
   private String address;
   private int number;
   
   public abstract double computePay();
   // Remainder of class definition
}

Khai báo một phương thức trừu tượng có hai hậu quả

Lớp chứa nó phải được khai báo là abstract.

Bất kỳ lớp nào kế thừa lớp hiện tại phải ghi đè lên phương thức trừu tượng hoặc tự khai báo là trừu tượng.

Lưu ý - Cuối cùng, một lớp con cháu phải thực hiện phương thức trừu tượng; nếu không, bạn sẽ có một hệ thống phân cấp các lớp trừu tượng không thể được khởi tạo.

Giả sử lớp Salary thừa hưởng lớp Employee, sau đó nó nên thực hiện phương thức computePay () như hình dưới đây
/* File name : Salary.java */
public class Salary extends Employee {
   private double salary;   // Annual salary
  
   public double computePay() {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
   // Remainder of class definition
}

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...