2010-07-26 32 views
17

Tôi biết đó không phải là phương pháp mã hóa tốt để khai báo phương thức là private trong lớp học abstract. Mặc dù chúng tôi không thể tạo một thể hiện của lớp học abstract, tại sao trình sửa đổi truy cập private có sẵn trong lớp học abstract và phạm vi của nó trong lớp học abstract là gì? Trong trường hợp nào là thông số truy cập private được sử dụng trong lớp học abstract?Tại sao có một công cụ sửa đổi truy cập riêng trong một lớp trừu tượng trong Java, mặc dù chúng ta không thể tạo một thể hiện của một lớp trừu tượng?

kiểm tra mã này khi lớp Vehicle trừu tượng và Car mở rộng Xe.

package com.vehicle; 

abstract class Vehicle { 

// What is the scope of the private access modifier within an abstract class, even though method below cannot be accessed?? 
    private void onLights(){ 
    System.out.println("Switch on Lights"); 
    } 

    public void startEngine(){ 
    System.out.println("Start Engine"); 
    } 

} 

Trong vòng là gói cùng tạo ra một lớp Car

package com.vehicle; 
/* 
* Car class extends the abstract class Vehicle 
*/ 
public class Car extends Vehicle { 

public static void main(String args[]){ 
    Car c = new Car(); 
    c.startEngine(); 
    // Only startEngine() can be accessed 
} 

} 

Trả lời

35

Vì lớp trừu tượng có thể chứa chức năng (trái ngược với giao diện), nó có thể có các biến hoặc phương thức riêng.

Trong ví dụ của bạn, bạn có thể làm điều gì đó như

public void startEngine(){ 
    injectFuel(); 
    igniteSpark(); 
    // etc. my understanding of engines is limited at best 
    System.out.println("Start Engine"); 
} 

private void injectFuel() {} 
private void igniteSpark() {} 

Bằng cách đó bạn có thể lây lan một số công việc với các phương pháp khác (do đó bạn không có 1000 dòng phương pháp startEngine), nhưng bạn không muốn các em có thể gọi injectFuel một cách riêng biệt vì nó không có ý nghĩa bên ngoài bối cảnh startEngine (bạn muốn chắc chắn rằng nó chỉ được sử dụng ở đó).

Hoặc thậm chí nhiều hơn bạn có thể có một phương thức riêng được gọi bằng một số phương thức công khai khác, với các tham số khác nhau. Bằng cách này, bạn tránh viết cùng một mã hai lần hoặc nhiều hơn trong mỗi phương thức công cộng, và nhóm mã chung trong một phương thức riêng để đảm bảo rằng các con không truy cập nó (như chúng không thể gọi một phần của phương thức công khai trước đây). Một cái gì đó như thế này:

public void startEngine() { 
    dishargeBattery(50); 
    System.out.println("Start Engine"); 
} 

public void startRadio() { 
    dischargeBattery(20); 
} 

private void dischargeBattery(int value) { 
    battery.energy -= value; //battery should probably be a private field. 
} 

Bằng cách này các phương pháp bạn có thể có quyền truy cập vào pin, nhưng những đứa trẻ không nên gây rối với nó, và bạn không viết cùng một dòng (battery.energy -= value) ở cả trong số họ. Tuy nhiên, hãy lưu ý rằng đây là những ví dụ rất đơn giản, nhưng nếu xảBattery là một phương thức 500 dòng, việc viết nó trong cả hai phương thức khác sẽ là một rắc rối.

+0

bạn đã thuyết phục tôi! – JerryGoyal

8

Nó giống như trong một lớp học không trừu tượng, không có sự khác biệt.

Điều đó có nghĩa là nếu không có gì trong lớp trừu tượng của bạn gọi phương thức riêng, thì bạn cũng có thể loại bỏ nó, vì nó sẽ không được gọi (baring một số công việc phản chiếu xấu).

Thông thường, các phương thức riêng chỉ được sử dụng làm phương thức tiện ích nội bộ có nhiệm vụ rất cụ thể mà các phương thức khác trong lớp sử dụng để thực hiện công việc của họ.

1

Phương thức này chỉ có thể truy cập từ bên trong lớp trừu tượng. Ví dụ, bạn có thể có một lớp trừu tượng với phương thức public final sử dụng phương thức trợ giúp riêng.

4

Tôi biết đó không phải là mã hóa tốt thực hành để khai báo phương thức là riêng tư trong lớp trừu tượng.

Tôi không. Nơi mà bạn có được ý tưởng đó?

phạm vi của nó trong lớp trừu tượng là gì?

Lớp trừu tượng.

Các vấn đề liên quan