Hướng dẫn why multiple inheritance is not supported in java but in python - tại sao đa kế thừa không được hỗ trợ trong java nhưng trong python

Vì chủ đề này không kết thúc Tôi sẽ đăng câu trả lời này, tôi hy vọng điều này sẽ giúp ai đó hiểu tại sao Java không cho phép nhiều kế thừa.

Xem xét lớp học sau:

public class Abc{

    public void doSomething[]{

    }

}

Trong trường hợp này, lớp ABC không mở rộng không có gì đúng không? Không quá nhanh, lớp này ngầm mở rộng đối tượng lớp, lớp cơ sở cho phép mọi thứ hoạt động trong Java. Mọi thứ đều là một đối tượng.

Nếu bạn cố gắng sử dụng lớp ở trên, bạn sẽ thấy rằng IDE của bạn cho phép bạn sử dụng các phương thức như:

public class Abc extends String{

    public void doSomething[]{

    }

}
9,
public class Abc{

    public void doSomething[]{

    }

    @Override
    public String toString[]{
        return "hello";
    }

}
0, v.v.

Bạn có thể thử:

public class Abc extends String{

    public void doSomething[]{

    }

}

Điều này là tốt, bởi vì lớp của bạn sẽ không tiềm ẩn mở rộng

public class Abc{

    public void doSomething[]{

    }

    @Override
    public String toString[]{
        return "hello";
    }

}
1 nhưng sẽ mở rộng
public class Abc{

    public void doSomething[]{

    }

    @Override
    public String toString[]{
        return "hello";
    }

}
3 vì bạn đã nói. Xem xét thay đổi sau:

public class Abc{

    public void doSomething[]{

    }

    @Override
    public String toString[]{
        return "hello";
    }

}

Bây giờ lớp của bạn sẽ luôn trả về "Xin chào" nếu bạn gọi toString [].

Bây giờ hãy tưởng tượng lớp sau:

public class Flyer{

    public void makeFly[]{

    }

}

public class Bird extends Abc, Flyer{

    public void doAnotherThing[]{

    }

}

Một lần nữa lớp

public class Abc{

    public void doSomething[]{

    }

    @Override
    public String toString[]{
        return "hello";
    }

}
4 sẽ mở rộng đối tượng có phương thức
public class Abc{

    public void doSomething[]{

    }

    @Override
    public String toString[]{
        return "hello";
    }

}
0, bất kỳ lớp nào cũng sẽ có phương pháp này vì tất cả chúng đều mở rộng
public class Abc{

    public void doSomething[]{

    }

    @Override
    public String toString[]{
        return "hello";
    }

}
1 một cách gián tiếp, vì vậy, nếu bạn gọi
public class Abc{

    public void doSomething[]{

    }

    @Override
    public String toString[]{
        return "hello";
    }

}
0 từ
public class Abc{

    public void doSomething[]{

    }

    @Override
    public String toString[]{
        return "hello";
    }

}
8, mà Java sẽ phải sử dụng? Từ
public class Flyer{

    public void makeFly[]{

    }

}

public class Bird extends Abc, Flyer{

    public void doAnotherThing[]{

    }

}
0 hoặc
public class Abc{

    public void doSomething[]{

    }

    @Override
    public String toString[]{
        return "hello";
    }

}
4? Điều này sẽ xảy ra với bất kỳ lớp nào cố gắng mở rộng hai hoặc nhiều lớp, để tránh loại "va chạm phương pháp" này, họ đã xây dựng ý tưởng về giao diện, về cơ bản bạn có thể nghĩ rằng chúng như một lớp trừu tượng không mở rộng đối tượng một cách gián tiếp. Vì chúng trừu tượng, chúng sẽ phải được thực hiện bởi một lớp, đó là một đối tượng [bạn không thể khởi động một giao diện một mình, chúng phải được thực hiện bởi một lớp], vì vậy mọi thứ sẽ tiếp tục hoạt động tốt.interface, basically you could think them as an abstract class that does not extends Object indirectly. Since they are abstract they will have to be implemented by a class, which is an object [you cannot instanciate an interface alone, they must be implemented by a class], so everything will continue to work fine.

Để khác nhau các lớp từ các giao diện, các thực hiện từ khóa được dành riêng cho các giao diện.implements was reserved just for interfaces.

Bạn có thể thực hiện bất kỳ giao diện nào bạn thích trong cùng một lớp vì chúng không mở rộng bất cứ thứ gì theo mặc định [nhưng bạn có thể tạo một giao diện mở rộng giao diện khác, nhưng một lần nữa, giao diện "Cha" sẽ không mở rộng đối tượng "], vì vậy một giao diện là Chỉ là một giao diện và họ sẽ không bị "phương thức colissions chữ ký", nếu họ thực hiện trình biên dịch sẽ đưa ra cảnh báo cho bạn và bạn sẽ phải thay đổi chữ ký phương thức để sửa nó [chữ ký = tên phương thức + params + loại trả về] .methods signature colissions", if they do the compiler will throw a warning to you and you will just have to change the method signature to fix it [signature = method name + params + return type].

public interface Flyer{

    public void makeFly[]; // 

Bài Viết Liên Quan

Chủ Đề