Được super()
sử dụng để gọi hàm tạo cha mẹ? Hãy giải thích super()
.
Được super()
sử dụng để gọi hàm tạo cha mẹ? Hãy giải thích super()
.
Câu trả lời:
super()
gọi hàm tạo cha mẹ không có đối số.
Nó cũng có thể được sử dụng với các đối số. Tức là super(argument1)
và nó sẽ gọi hàm tạo chấp nhận 1 tham số của loại argument1
(nếu tồn tại).
Ngoài ra nó có thể được sử dụng để gọi các phương thức từ cha mẹ. I Esuper.aMethod()
Thêm thông tin và hướng dẫn tại đây
super(...)
chỉ có thể được sử dụng làm câu lệnh đầu tiên trong hàm tạo.
Một số sự thật:
super()
được sử dụng để gọi cha mẹ ngay lập tức.super()
có thể được sử dụng với các thành viên thể hiện, tức là các biến thể hiện và các phương thức cá thể.super()
có thể được sử dụng trong một hàm tạo để gọi hàm tạo của lớp cha.OK, bây giờ hãy thực tế thực hiện những điểm này super()
.
Kiểm tra sự khác biệt giữa chương trình 1 và 2. Ở đây, chương trình 2 chứng minh tuyên bố đầu tiên của chúng tôi về super()
Java.
Chương trình 1
class Base
{
int a = 100;
}
class Sup1 extends Base
{
int a = 200;
void Show()
{
System.out.println(a);
System.out.println(a);
}
public static void main(String[] args)
{
new Sup1().Show();
}
}
Đầu ra:
200
200
Bây giờ hãy kiểm tra chương trình 2 và cố gắng tìm ra sự khác biệt chính.
Chương trình 2
class Base
{
int a = 100;
}
class Sup2 extends Base
{
int a = 200;
void Show()
{
System.out.println(super.a);
System.out.println(a);
}
public static void main(String[] args)
{
new Sup2().Show();
}
}
Đầu ra:
100
200
Trong chương trình 1, đầu ra chỉ là của lớp dẫn xuất. Nó không thể in biến của cả lớp cơ sở lẫn lớp cha. Nhưng trong chương trình 2, chúng ta đã sử dụng super()
biến a
trong khi in đầu ra của nó và thay vì in giá trị của biến a
của lớp dẫn xuất, nó đã in giá trị của biến a
của lớp cơ sở. Vì vậy, nó chứng minh rằng super()
được sử dụng để gọi cha mẹ ngay lập tức.
OK, bây giờ hãy kiểm tra sự khác biệt giữa chương trình 3 và chương trình 4.
Chương trình 3
class Base
{
int a = 100;
void Show()
{
System.out.println(a);
}
}
class Sup3 extends Base
{
int a = 200;
void Show()
{
System.out.println(a);
}
public static void Main(String[] args)
{
new Sup3().Show();
}
}
Đầu ra:
200
Ở đây đầu ra là 200. Khi chúng ta gọi Show()
, Show()
hàm của lớp dẫn xuất được gọi. Nhưng chúng ta nên làm gì nếu chúng ta muốn gọi Show()
hàm của lớp cha? Kiểm tra chương trình 4 để biết giải pháp.
Chương trình 4
class Base
{
int a = 100;
void Show()
{
System.out.println(a);
}
}
class Sup4 extends Base
{
int a = 200;
void Show()
{
super.Show();
System.out.println(a);
}
public static void Main(String[] args)
{
new Sup4().Show();
}
}
Đầu ra:
100
200
Ở đây chúng ta nhận được hai đầu ra, 100 và 200. Khi Show()
hàm của lớp dẫn xuất được gọi, đầu tiên nó gọi Show()
hàm của lớp cha, bởi vì bên trong Show()
hàm của lớp dẫn xuất, chúng ta đã gọi Show()
hàm của lớp cha bằng cách đặt các super
từ khóa trước tên hàm.
super()
không phải là một từ khóa. Nó là một lời mời xây dựng. super
là một từ khóa và # 1 và # 2 chỉ có ý nghĩa với định nghĩa đó.
Nguồn bài viết: Java: Gọi super ()
Đúng. super(...)
sẽ gọi hàm tạo của siêu hạng.
Hình minh họa:
class Animal {
public Animal(String arg) {
System.out.println("Constructing an animal: " + arg);
}
}
class Dog extends Animal {
public Dog() {
super("From Dog constructor");
System.out.println("Constructing a dog.");
}
}
public class Test {
public static void main(String[] a) {
new Dog();
}
}
Bản in:
Constructing an animal: From Dog constructor
Constructing a dog.
super()
nó sẽ gọi hàm tạo của siêu lớp không có đối số. Tương tự, nó sẽ gọi hàm tạo 1 đối số nếu bạn thực hiện super(arg1)
, v.v.
super()
sẽ không phải là một cuộc gọi hợp lệ.
Là super () được sử dụng để gọi hàm tạo cha?
Đúng.
Xin giải thích về Super ().
super()
là một cách sử dụng đặc biệt của super
từ khóa mà bạn gọi là hàm tạo cha không tham số. Nói chung, super
từ khóa có thể được sử dụng để gọi các phương thức được ghi đè, truy cập các trường ẩn hoặc gọi hàm tạo của lớp cha.
Đây là hướng dẫn chính thức
super()
được sử dụng để gọi hàm tạo cha, super.myMethod()
được sử dụng để gọi một phương thức được ghi đè.
Gọi siêu xây dựng không có đối số chỉ là một sự lãng phí không gian màn hình và thời gian lập trình viên. Trình biên dịch tạo chính xác cùng một mã, cho dù bạn có viết nó hay không.
class Explicit() {
Explicit() {
super();
}
}
class Implicit {
Implicit() {
}
}
Tôi đã thấy tất cả các câu trả lời. Nhưng mọi người đều quên đề cập đến một điểm rất quan trọng:
super () nên được gọi hoặc sử dụng trong dòng đầu tiên của hàm tạo.
Chỉ siêu (); một mình sẽ gọi hàm tạo mặc định, nếu nó tồn tại của lớp cha của lớp. Nhưng bạn phải tự viết công cụ xây dựng mặc định. Nếu bạn không Java sẽ tạo một cái cho bạn mà không cần triển khai, hãy lưu super (); , đề cập đến Đối tượng siêu lớp phổ quát và bạn không thể gọi nó trong một lớp con.
public class Alien{
public Alien(){ //Default constructor is written out by user
/** Implementation not shown…**/
}
}
public class WeirdAlien extends Alien{
public WeirdAlien(){
super(); //calls the default constructor in Alien.
}
}
Tôi muốn chia sẻ với các mã bất cứ điều gì tôi hiểu.
Siêu từ khóa trong java là một biến tham chiếu được sử dụng để tham chiếu các đối tượng lớp cha. Nó được sử dụng chủ yếu trong các bối cảnh sau: -
1. Sử dụng siêu với các biến:
class Vehicle
{
int maxSpeed = 120;
}
/* sub class Car extending vehicle */
class Car extends Vehicle
{
int maxSpeed = 180;
void display()
{
/* print maxSpeed of base class (vehicle) */
System.out.println("Maximum Speed: " + super.maxSpeed);
}
}
/* Driver program to test */
class Test
{
public static void main(String[] args)
{
Car small = new Car();
small.display();
}
}
Đầu ra: -
Maximum Speed: 120
/* Base class Person */
class Person
{
void message()
{
System.out.println("This is person class");
}
}
/* Subclass Student */
class Student extends Person
{
void message()
{
System.out.println("This is student class");
}
// Note that display() is only in Student class
void display()
{
// will invoke or call current class message() method
message();
// will invoke or call parent class message() method
super.message();
}
}
/* Driver program to test */
class Test
{
public static void main(String args[])
{
Student s = new Student();
// calling display() of Student
s.display();
}
}
Đầu ra: -
This is student class
This is person class
3. Sử dụng siêu với các nhà xây dựng:
class Person
{
Person()
{
System.out.println("Person class Constructor");
}
}
/* subclass Student extending the Person class */
class Student extends Person
{
Student()
{
// invoke or call parent class constructor
super();
System.out.println("Student class Constructor");
}
}
/* Driver program to test*/
class Test
{
public static void main(String[] args)
{
Student s = new Student();
}
}
Đầu ra: -
Person class Constructor
Student class Constructor
Con
constructor Trong một constructor, bạn có thể sử dụng nó mà không có dấu chấm để gọi một constructor khác. super
gọi một hàm tạo trong lớp cha; this
gọi một hàm tạo trong lớp này:
public MyClass(int a) {
this(a, 5); // Here, I call another one of this class's constructors.
}
public MyClass(int a, int b) {
super(a, b); // Then, I call one of the superclass's constructors.
}
super
là hữu ích nếu siêu lớp cần tự khởi tạo. this
rất hữu ích khi cho phép bạn viết tất cả các mã khởi tạo cứng chỉ một lần trong một trong các hàm tạo và gọi nó từ tất cả các hàm tạo khác, dễ viết hơn nhiều.
Phương thức
Trong bất kỳ phương thức nào, bạn có thể sử dụng nó với dấu chấm để gọi phương thức khác. super.method()
gọi một phương thức trong siêu lớp; this.method()
gọi một phương thức trong lớp này:
public String toString() {
int hp = this.hitpoints(); // Calls the hitpoints method in this class
// for this object.
String name = super.name(); // Calls the name method in the superclass
// for this object.
return "[" + name + ": " + hp + " HP]";
}
super
là hữu ích trong một kịch bản nhất định: nếu lớp của bạn có cùng phương thức với siêu lớp của bạn, Java sẽ cho rằng bạn muốn cái đó trong lớp của bạn; super
thay vào đó, cho phép bạn yêu cầu phương thức của lớp cha. this
chỉ hữu ích như một cách để làm cho mã của bạn dễ đọc hơn.
Các siêu từ khóa có thể được sử dụng để gọi constructor lớp cha và để đề cập đến một thành viên của lớp cha
Khi bạn gọi super () với các đối số phù hợp, chúng tôi thực sự gọi Hộp xây dựng , khởi tạo các biến chiều rộng , chiều cao và chiều sâu , gọi nó bằng cách sử dụng các giá trị của các tham số tương ứng. Bạn chỉ còn lại để khởi tạo trọng lượng giá trị gia tăng của nó. Nếu cần, bạn có thể thực hiện bây giờ các biến lớp Box là private . Đặt trong các trường của công cụ sửa đổi riêng của lớp Box và đảm bảo rằng bạn có thể truy cập chúng mà không gặp vấn đề gì.
Tại siêu lớp có thể là một số hàm tạo phiên bản quá tải, vì vậy bạn có thể gọi phương thức super () với các tham số khác nhau. Chương trình sẽ thực hiện hàm tạo phù hợp với các đối số đã chỉ định.
public class Box {
int width;
int height;
int depth;
Box(int w, int h, int d) {
width = w;
height = h;
depth = d;
}
public static void main(String[] args){
HeavyBox heavy = new HeavyBox(12, 32, 23, 13);
}
}
class HeavyBox extends Box {
int weight;
HeavyBox(int w, int h, int d, int m) {
//call the superclass constructor
super(w, h, d);
weight = m;
}
}
siêu là một từ khóa. Nó được sử dụng bên trong một định nghĩa phương thức lớp con để gọi một phương thức được định nghĩa trong lớp cha. Các phương thức riêng của siêu lớp không thể được gọi. Chỉ các phương thức công khai và được bảo vệ có thể được gọi bằng siêu từ khóa. Nó cũng được sử dụng bởi các hàm tạo của lớp để gọi các hàm tạo của lớp cha của nó.
Kiểm tra ở đây để giải thích thêm.
Như đã nêu, bên trong hàm tạo mặc định có một siêu ẩn () được gọi trên dòng đầu tiên của hàm tạo.
Super () này tự động gọi một chuỗi các hàm tạo bắt đầu ở đầu phân cấp lớp và di chuyển xuống cấu trúc phân cấp.
Nếu có nhiều hơn hai lớp trong hệ thống phân cấp lớp của chương trình, hàm tạo mặc định của lớp trên cùng sẽ được gọi đầu tiên .
Đây là một ví dụ về điều này:
class A {
A() {
System.out.println("Constructor A");
}
}
class B extends A{
public B() {
System.out.println("Constructor B");
}
}
class C extends B{
public C() {
System.out.println("Constructor C");
}
public static void main(String[] args) {
C c1 = new C();
}
}
Ở trên sẽ xuất ra:
Constructor A
Constructor B
Constructor C