Thắc măc về abstract class và từ khóa Super

Toantang2632000

New Member
18/5/20
10
1
3
Hà Nội
Chào mọi người, em đang học OOP của java ạ. Em có câu hỏi là :
+ Câu hỏi đầu tiên: Khi ta khai báo thuộc tính của một lớp là đối tượng của lớp trừu tượng thì thuộc tính đó sẽ không thể nào được gán giá trị và luôn luôn bằng null do không khởi tạo được thể hiện của lớp trừu tượng. Tại sao lại như vậy ạ? Giải thích như nào cho nó hợp lý ạ?
+ Câu hỏi thứ 2: Nếu lớp cha chỉ có Constructor mặc định thì lớp con không cần dùng từ khóa super trong Constructor của nó do trình biên dịch sẽ cung cấp Super() vào dòng đầu tiên của Constructor của class con. Nhưng tại sao nếu lớp cha CHỈ có một Constructor có tham số (và không có Constructor mặc định) thì trong Constructor của lớp con, ta vẫn phải dùng từ khóa super? Giải thích như nào đây ạ?
Mong mọi người giúp đỡ ạ. Em cảm ơn ạ
 

quydtkt

Administrator
1/11/19
381
36
28
26
Vấn đề của bạn, theo mình thì:
+ Thứ nhất: Trong Java, abstract class và interface dùng để khai báo đối tượng, không dùng để khởi tạo đối tượng. Đối với abstract class, các property của nó vẫn có thể được gán giá trị bình thường. Có lẽ bạn đã nhầm lần ở đâu đó
+ Thứ hai: Khi class cha có constructor mặc định thì trình bên dịch sẽ tự động gọi nó khi ta khởi tạo đối tượng của class con. Ngược lại thì ta phải chỉ động gọi 1 trong số các constructor của class cha trong constructor của class con vì ình biên dịch sẽ không biết gọi cái nào. Cho dù trong class con chỉ có duy nhất 1 constructor có 1 tham số thì kiểu dữ liệu của tham số này cũng là vấn đề.
 
  • Like
Reactions: Toantang2632000

Joe

Thành viên VIP
21/1/13
2,962
1,307
113
Abstract class is one of the so-called 23 Software Design Patterns (click HERE for more.) Abstract class is designed to provide a class family whereas some methods are defined as abstract and must be implemented by the inheritors. For example: the class InputStream defines a row of executable methods that base on an ABSTRACT method read()
Java:
public abstract int read() throws IOException
Every inheritor, for example FileInputStream or Socket's InputStream, has to implement this read() method according to the underlying hardware. An Abstract class cannot be instantiated due to the "unimplemented" abstract method(s).

Similar to Abstract Class Interface is a class that cannot be extended, but its prescribed methods must be implemented (same abstract methods of an abstract class).

The main difference is that an abstract class must be extended and CANNOT be an extension of any other class (single Inheritance), while Interface allows a class to include several other interfaces (a gateway to achieve the "multiple inheritances" if you so will). Example: MyApp is an extension of JFrame, an implementation of 2 interfaces: ActionListener and MouseListener.
Java:
public class MyApp extends JFrame implements ActionListener, MouseListener {
   ...
}
ALL java classes are extended from class Object and the constructor of Object is
Java:
public Object()
the invocation super() is the invocation of this Object() in order to create a Java Object for this class. However, super() can be omitted. Meaning: an inheritor of another class won't need to invoke the super(), but only the constructor of its father if the father requires some parameters. For example: super(title)
Java:
public class MyApp extends JFrame implements ActionListener { // inheritor of JFrame and ActionListener
   public MyApp(String title) {
       super(title);  // super of JFrame
       ...
   }
   ...
   public void actionPerformed(ActionEvent e) {  // implement the required method of ActionListener
         System.out.println("This is an implementation of ActionListerner's method....");
    }
   ...
}
You got it?
 

Toantang2632000

New Member
18/5/20
10
1
3
Hà Nội
Vấn đề của bạn, theo mình thì:
+ Thứ nhất: Trong Java, abstract class và interface dùng để khai báo đối tượng, không dùng để khởi tạo đối tượng. Đối với abstract class, các property của nó vẫn có thể được gán giá trị bình thường. Có lẽ bạn đã nhầm lần ở đâu đó
+ Thứ hai: Khi class cha có constructor mặc định thì trình bên dịch sẽ tự động gọi nó khi ta khởi tạo đối tượng của class con. Ngược lại thì ta phải chỉ động gọi 1 trong số các constructor của class cha trong constructor của class con vì ình biên dịch sẽ không biết gọi cái nào. Cho dù trong class con chỉ có duy nhất 1 constructor có 1 tham số thì kiểu dữ liệu của tham số này cũng là vấn đề.
dạ ý thứ 2 em đã hiểu rồi ạ, nhưng ý thứ nhất e vẫn thực sự chưa thông não lắm. Abstract class ko thể thể hiện trực tiếp.
Ví dụ:

Java:
abstract class HoTen {
    
}
public class Ten extends HoTen {
    HoTen ten1;// hop le
    HoTen ten2 = new HoTen();// ko hop le
}
Như code của e phía trên thì ten2 là ko hợp lệ. Vậy thì ten2 không được tạo ra hay nó vẫn được tạo ra nhưng = null ạ?
 

quydtkt

Administrator
1/11/19
381
36
28
26
Java:
abstract class HoTen {
  
}
public class Ten extends HoTen {
    ....
    HoTen ten2 = new HoTen();// ko hop le
}
Như code của e phía trên thì ten2 là ko hợp lệ. Vậy thì ten2 không được tạo ra hay nó vẫn được tạo ra nhưng = null ạ?
Đây là bạn đang khởi tạo đối tượng bằng abstract class chứ không phải gán giá trị cho property trong abstract class nhé. Abstract class và interface chỉ dùng để khai báo đối tượng, không dùng để khởi tạo đối tượng.

Code đúng phải như thế này
Java:
abstract class HoTen {
}

class Ten extends HoTen {
}

public class Ten2 extends HoTen {
    HoTen ten = new Ten();

}
 

Joe

Thành viên VIP
21/1/13
2,962
1,307
113
Như code của e phía trên thì ten2 là ko hợp lệ. Vậy thì ten2 không được tạo ra hay nó vẫn được tạo ra nhưng = null ạ?
I don't know what Vietnamese JAVA book you've studied, but, sorry, it is never effective to answer you piece-by-piece when you haven't had even a basic understanding of OOP (Object Oriented Programming).
Click HERE and learn what abstract class and interface are and how they work.
 
Sửa lần cuối: