Vấn đề với constructor Throwable cần những cao nhân giải đáp

Discussion in 'Xây dựng các ứng dụng Java khác, các vấn đề khác' started by Nguyễn Xuân Du, 18/8/17.

  1. Nguyễn Xuân Du

    Nguyễn Xuân Du New Member

    Chào mọi người!
    Mình mới tìm hiểu về Exception nên đụng đến lớp Throwable và gặp vấn đề với constructor của lớp này. Vấn đề cụ thể như sau:
    Lớp Throwable có 5 constructor trong đó có 1 constructor với từ khóa chỉ định truy cập protected. Theo mình biết thì lớp con có thể sử dụng phương thức protected của lớp cha nhưng khi thừa kế lớp Throwable thì lại không xuất hiện constructor này

    Code:
    public class ThrowableDemo extends Throwable{
        public ThrowableDemo() {
            super("", new Throwable(), false, false);//constructor nay khi Ctrl+Space thi khong hien ra trong khi 4 constructor khac deu xuat hien binh thuong
        }
        public static void main(String[] args) {
           
        }
    }
    Vậy nguyên nhân ở đây là gì? Mong các bạn giúp đỡ và nếu mình có hiểu sai kiến thức chỗ nào đó thì các bạn góp ý nhẹ nhàng. Cảm ơn tất cả mọi người!
  2. JackV

    JackV Administrator Staff Member

    Hiểu, để xem lại, vì cái document đó nói về "Controlling Access to Members of a Class" không có constructor https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html, để tìm tài liệu nói về constructor đã
  3. Nguyễn Xuân Du

    Nguyễn Xuân Du New Member

    Dạ, anh cùng tìm hiểu để có câu trả lời hợp lý và chính xác với em nhé. Mong mọi người cùng tìm hiểu ạ. Cảm ơn :)
  4. JackV

    JackV Administrator Staff Member

    Nó đây rồi
    6.6.2.2. Qualified Access to a protected Constructor
    https://docs.oracle.com/javase/specs/jls/se8/html/jls-6.html#jls-6.6.2.2

    xem thêm
    https://stackoverflow.com/questions...se-protected-constructors-outside-the-package

    // Compile time error saying SuperConstructorCall() has protected access in SuperConstructorCall
    PHP:
    package Super;

    public class 
    SuperConstructorCall {

        protected 
    SuperConstructorCall() {
        }

    }

    package Child;

    import Super.SuperConstructorCall;

    public class 
    ChildCall extends SuperConstructorCall
    {

        public static 
    void main(String[] args) {

            
    SuperConstructorCall s = new SuperConstructorCall(); // Compile time error saying SuperConstructorCall() has protected access in SuperConstructorCall
        
    }
    }
    // This will work as the access is by an anonymous class instance creation expression
    PHP:
    package Super;

        public class 
    SuperConstructorCall {

        protected 
    SuperConstructorCall() {
        }

    }

    package Child;

    import Super.SuperConstructorCall;

    public class 
    ChildCall extends SuperConstructorCall
    {

        public static 
    void main(String[] args) {

            
    SuperConstructorCall s = new SuperConstructorCall(){}; // This will work as the access is by an anonymous class instance creation expression
        
    }
    }
  5. Nguyễn Xuân Du

    Nguyễn Xuân Du New Member

    Để em tìm hiểu thêm đã vì có 2 tài liệu mới, thanks anh đã tận tình giúp đỡ :)
  6. Nguyễn Xuân Du

    Nguyễn Xuân Du New Member

    Sau một đêm nghiên cưu thì em vẫn không hiểu lắm, đọc đi đọc lại mới chỉ giải thích được không thể tạo đối tượng mới (sử dụng new) bằng cách gọi protected constructor của lớp cha (cái này thì trực quan dễ hiểu vì không dùng được complier báo lỗi ngay) nhưng vẫn chưa lý giải được tại sao trong constructor của lớp con khi gọi protected construtor của lớp cha vẫn được nhưng lại không thấy hiển thị phương thức đó ra?
  7. Joe

    Joe Moderator

    The example is bad, very bad. The protected constructor is generally and ONLY used for extended classes (i.e. children) in order to avoid misuse. The constructor should be used for the cases that
    • you want to do your own tracing mechanism
    • you want to suppress the tracing
    More: you should read carefully the description of this constructor
  8. Nguyễn Xuân Du

    Nguyễn Xuân Du New Member

    Hi mod Joe,
    My problem started from i learn about Exception and i take it for my example. Yeah it's really bad :)), so just forget Throwable class because it's already exist in Java. My problem is not Throwable class, it's generality!
    Think funny like this: Boss want you write a class name "HeyIhave2Constructors" with 2 constructors (or 3,4,5...), it's have 1 public constructor and atleast 1 protected constructor. You done, it's very easy. After that, boss told u write a class name "HeyUseMyConstructor" in other package and it's extends class HeyIhave2Constructors, call protected constructor of class HeyIhave2Constructors in it constructor and show me you are done.

    PHP:
    package package1;

    public class 
    HeyIhave2Constructors {
        public 
    HeyIhave2Constructors(){
          
        }
        protected 
    HeyIhave2Constructors(String messageForBoss){
            
    System.out.println(messageForBoss);
        }
    }
    PHP:
    package package2;

    import package1.HeyIhave2Constructors;

    public class 
    HeyUseMyConstructor extends HeyIhave2Constructors{
        public 
    HeyUseMyConstructor(){
            
    super("Hey boss, i'm done");
            }
        public static 
    void main(String[] args) {
            
    HeyUseMyConstructor forBoss=new HeyUseMyConstructor();
        }
    }
    Gettting started:
    Boss: Where is your: super("Hey boss, i'm done"); do you trolling me?
    Me: Oh no, you told me show you i'm done and i did it. It's protected constructor in HeyIhave2Constructors
    Boss: How can you call it?
    Me: Of course, anyone can call it.
    Boss: Are you sure?
    Me: Yes sir,
    Boss: So let me,(delete my code) typing... superCtrlSpaceSpaceSpace... Where is it? ~X(~X(~X(
    Me: :-ss:-ss:-ssWhy you use Ctrl Space when you can do super ( then type String you want?
    Boss: I'm boss, i want to do that. Why i can't see your constructor HeyIhave2Constructors(String s)
    Me: I don't know^:)^^:)^^:)^. I think you should ask eclipse or netbeans why it not show you =))=))=))
    Boss: :eek::eek::eek:
  9. Joe

    Joe Moderator

    please don't call me MOD. I am NOT the mod of this forum because of too much misunderstanding. OK? If you do that again, I'll disappear again. Protected keyword is used only:
    • for all subclasses (or children) if the protected IS NOT a constructor.
    • within the package. Outside the package the protected constructor is INVISIBLE.
    All IDEs like Netbeans or Eclipse are stupid and cannot tell their users why they don't show the protected constructors.
  10. Nguyễn Xuân Du

    Nguyễn Xuân Du New Member

    Ok, summary!
    You can't see the protected constructor outside package because it's INVISIBLE but you still call (use) it's normally in subclass's constructor (subclass outside package) but will not get error from compiler. And IDEs are stupid, it make their users confused :)). Is that right, Joe?
  11. Joe

    Joe Moderator

    YES and NO. It depends on your codes and how you import the package (and CLASSPATH). An extension of a class that is outside the current package requires a) the import, b) the correct CLASSPATH and c) the correct access. Example
    PHP:
    package ancestor;

    public class 
    GrandPa {
        private 
    int age;
        protected 
    Grandpa(int age) {
            
    this.age age;
        }
        ...
    }
    PHP:
    package child;
    // Very important!
    import ancestor.GrandPa;

    public class 
    Child extends Grandpa {
        public 
    Child(int age) {
            
    super(age);
        }
        public static 
    void main(String... args) {
            
    Child c = new Child(80);
        }
    }
    More: Read HERE
  12. Nguyễn Xuân Du

    Nguyễn Xuân Du New Member

    LOL, you still not understand my problem i want to resolve. Just focus on my code, it's have IMPORT so don't talk about import like you talk about Throwable class and it detail constructor. I want to know that a class have a protected constructor and can i call that protected constructor in subclass's constructor outside package(of course import super class because if not you will get error).

Chia sẻ trang này