সুপার () জাভা


222

হয় super()পিতা বা মাতা কন্সট্রাকটর কল করতেন? দয়া করে ব্যাখ্যা করুন super()


1
আরও নির্দিষ্ট হতে হবে বা কেবল ডকুমেন্টেশন পড়তে হবে ...
মনু

সুপার () কলের সাথে সম্পর্কিত এই উত্তরটিও পরীক্ষা করে দেখুন। stackoverflow.com/questions/34349164/…
বিশ্রান্ত

এখানে ব্যাখ্যা করা হয়েছে: জাভা: কলিং সুপার ()
আইওউব

উত্তর:


267

super() কোনও যুক্তি ছাড়াই প্যারেন্ট কনস্ট্রাক্টরকে কল করে।

এটি যুক্তি দিয়েও ব্যবহার করা যেতে পারে। Ie super(argument1)এবং এটি সেই কনস্ট্রাক্টরকে কল করবে যা ধরণের 1 পরামিতি গ্রহণ করে argument1(যদি উপস্থিত থাকে)।

এছাড়াও এটি পিতামাতার কাছ থেকে পদ্ধতি কল করতে ব্যবহার করা যেতে পারে। অর্থাতsuper.aMethod()

আরও তথ্য এবং টিউটোরিয়াল এখানে


9
দ্রষ্টব্য: প্রথম ক্ষেত্রে, প্যারেন্ট ক্লাসে অবশ্যই কোনও যুক্তি নির্মাণকারীর ব্যর্থতা থাকতে হবে যা সংকলনের ত্রুটি ফেলবে।
কেএনইউ

নীট: পিতামাতার / সন্তানের পরিভাষা শ্রেণি শ্রেণিবিন্যাসের পক্ষে খুব ভাল নয়। (একটি শিশু বাবা হয় না ।)
আইয়ুব

সুপার ব্যবহার করা যেতে পারে সেখানে কি কোনও বিধিনিষেধ রয়েছে?
অ্যারন ফ্র্যাঙ্ক

2
@VivekChavda, নিশ্চিত করুন একটি শিশু পারেন একটি পিতা বা মাতা হতে, ঠিক একজন ছাত্র একজন শিক্ষক হতে পারে, ইত্যাদি কিন্তু আমি মনে করি আপনি প্রাণী তুলনায় পার্থক্য বুঝতে -> উদাহরণস্বরূপ কুকুর। একটি কুকুর অগত্যা একটি প্রাণী। মাতাপিতা / শিশুর সাধারণত হয় একটি আছে সম্পর্ক ( "একটি পিতা বা মাতা টি শিশু") করার সময় একটি প্রাণী / কুকুর একটি হল "একটি হল" সম্পর্ক। দেখুন iioo.be/2016/06/29/a-child-is-not-always-a-parent.html
আইয়ুব

2
@ অ্যারোনফ্র্যাঙ্ক, "যেখানে সুপার ব্যবহার করা যেতে পারে তাতে কি কোনও বিধিনিষেধ রয়েছে?" - হ্যাঁ, super(...)কেবল কোনও নির্মাণকারীর প্রথম বিবৃতি হিসাবে ব্যবহার করা যেতে পারে।
আইয়ুব

154

কিছু ঘটনা:

  1. super() তাত্ক্ষণিক পিতামাতাকে কল করতে ব্যবহৃত হয়।
  2. super() উদাহরণ সদস্যদের সাথে ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ, ভেরিয়েবল এবং উদাহরণ পদ্ধতি।
  3. super() প্যারেন্ট ক্লাসের কনস্ট্রাক্টরকে কল করতে কনস্ট্রাক্টরের মধ্যে ব্যবহার করা যেতে পারে।

ঠিক আছে, এখন এর পয়েন্টগুলি কার্যত প্রয়োগ করা যাক super()

প্রোগ্রাম 1 এবং 2 এর মধ্যে পার্থক্যটি দেখুন Here এখানে, প্রোগ্রাম 2 super()জাভাতে আমাদের প্রথম বিবৃতি প্রমাণ করে ।

প্রোগ্রাম 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();
    }
}

আউটপুট:

200
200

এখন প্রোগ্রাম 2 পরীক্ষা করে দেখুন এবং প্রধান পার্থক্যটি বের করার চেষ্টা করুন।

প্রোগ্রাম 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();
    }
}

আউটপুট:

100
200

প্রোগ্রাম 1 এ, আউটপুটটি কেবল উত্পন্ন শ্রেণীর ছিল। এটি বেস ক্লাস বা অভিভাবক শ্রেণির না কারও ভেরিয়েবল মুদ্রণ করতে পারে। তবে প্রোগ্রাম 2-এ, আমরা এর আউটপুট প্রিন্ট করার সময় super()ভেরিয়েবলের সাথে ব্যবহার করেছি a, এবং aউত্পন্ন শ্রেণীর ভেরিয়েবলের মান মুদ্রণের পরিবর্তে , এটি aবেস শ্রেণীর ভেরিয়েবলের মান মুদ্রণ করে । সুতরাং এটি প্রমাণ করে যে super()তাত্ক্ষণিক পিতামাতাকে কল করতে ব্যবহৃত হয়।

ঠিক আছে, এখন প্রোগ্রাম 3 এবং প্রোগ্রাম 4 এর মধ্যে পার্থক্যটি পরীক্ষা করে দেখুন।

প্রোগ্রাম 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();
    }
}

আউটপুট:

200

এখানে আউটপুট 200. যখন আমরা বলা হয় Show(), Show()উদ্ভূত ক্লাসের ফাংশন বলা হয়। কিন্তু আমরা Show()পিতামাত্ত শ্রেণীর ফাংশনটি বলতে চাইলে আমাদের কী করা উচিত ? সমাধানের জন্য প্রোগ্রাম 4 পরীক্ষা করে দেখুন।

প্রোগ্রাম 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();
    }
}

আউটপুট:

100
200

এখানে আমরা দুটি আউটপুট পাচ্ছি, 100 এবং 200. যখন Show()উদ্ভূত শ্রেণীর ক্রিয়াকলাপটি শুরু হয়, তখন এটি প্রথমে Show()পিতামাত্ত শ্রেণীর ফাংশনটিকে ডাকে , কারণ Show()ডেরাইভেড শ্রেণীর ফাংশনের অভ্যন্তরে আমরা পিতামাত্ত শ্রেণীর Show()ফাংশনটিকে ডেকে আছি superসামনে ফাংশনের নাম শব্দ।


4
আপনি কেন আপনার সোর্সকোড উদাহরণগুলি ইনডেন্ট করেন নি? একটি নির্দিষ্ট কারণ আছে?
এরিকবওয়ার্ক

না এরিকব, আমি সুপারের ব্যবহার জানতে চাই ()। পরের দিন কেবল আমি যাচ্ছি
মোহন

আমার বেস ক্লাসে আমি কন্সট্রাক্টরকে এক, দুই, ... যুক্তি দিয়ে ওভারলোড করি
মোহন

তবে আমার উদ্ভূত শ্রেণিতে আমি কোনও যুক্তি ছাড়াই সুপার () ব্যবহার করি। তারপরে কী হবে যদি এটি স্বয়ংক্রিয়ভাবে কোনও বেস শ্রেণির একটি ডিফল্ট কনস্ট্রাক্টরকে কল করে
মোহন

2
super()একটি কীওয়ার্ড নয়। এটি একটি নির্মাণকারীর প্রার্থনা। superএকটি কীওয়ার্ড, এবং # 1 এবং # 2 কেবলমাত্র সেই সংজ্ঞা দিয়েই বোঝায়।
লার্নের মারকুইস

37

উত্স নিবন্ধ: জাভা: কলিং সুপার ()


হ্যাঁ. super(...)সুপার-ক্লাসের কনস্ট্রাক্টরকে অনুরোধ করবে।

চিত্রণ:

এখানে চিত্র বর্ণনা লিখুন


একা দাঁড়ানো উদাহরণ:

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();
    }
}

ছাপে:

Constructing an animal: From Dog constructor
Constructing a dog.

আমার বেস ক্লাসে আমি কন্সট্রাক্টরকে এক, দুই, ... দিয়ে যুক্ত করেছি, আমার উত্পন্ন ক্লাসে আমি আর্গুমেন্ট ছাড়াই সুপার () ব্যবহার করি। তারপরে কী হবে যদি এটি স্বয়ংক্রিয়ভাবে কোনও বেস শ্রেণির একটি ডিফল্ট নির্মাতা কল করে
মোহন

হ্যাঁ. আপনি যদি super()এটি কল করেন তবে এটি সুপার-ক্লাসের নির্মাতাকে অনুরোধ করবে যাতে কোনও যুক্তি নেই। একইভাবে, এটি যদি আপনি করেন তবে 1 টি-যুক্তিযুক্ত নির্মাণকারীকে অনুরোধ করবে super(arg1)এবং আরও।
আইয়ুব

বেস ক্লাসে কোনও যুক্তি ব্যতীত যদি কনস্ট্রাক্টর না থাকত তবে ডেরাইভড ক্লাসটি সুপার () বললে কী হয়।
মোহন

1
কিছুই নেই। এটি সংকলন করবে না। আপনি যদি কোনও নির্মাণকারী নিজেই সরবরাহ করেন তবে স্বয়ংক্রিয় / ডিফল্ট / নো-আর্গুমেন্ট-কনস্ট্রাক্টর উত্পন্ন super()হবে না , সুতরাং এটি কোনও বৈধ কল হবে না।
আইয়ুব

29

সুপার () পিতামাতাদের কনস্ট্রাক্টর কল করতে ব্যবহৃত হয়?

হ্যাঁ.

প্লিজ সুপার () সম্পর্কে ব্যাখ্যা করে।

super()কীওয়ার্ডের বিশেষ ব্যবহার superযেখানে আপনি প্যারামিটারলেস প্যারেন্ট কনস্ট্রাক্টরকে কল করেন। সাধারণভাবে, superকীওয়ার্ডটি ওভাররাইড পদ্ধতিতে কল করতে, লুকানো ক্ষেত্রগুলিতে অ্যাক্সেস করতে বা সুপারক্লাসের নির্মাতাকে ডাকতে ব্যবহার করা যেতে পারে।

এখানে সরকারী টিউটোরিয়াল


5
super()প্যারেন্ট কনস্ট্রাক্টরকে কল করতে ব্যবহৃত হয়, super.myMethod()একটি ওভাররাইড পদ্ধতিতে কল করতে ব্যবহৃত হয়।
সান প্যাট্রিক ফ্লয়েড

2
@ সায়ানাইজার বা সুপারক্লাসের অন্য কোনও পদ্ধতি (স্ট্যাটিক্স সহ) এর সুযোগ যদি থাকে। সুপার আপনার বেস ক্লাসের কেবল একটি রেফারেন্স।
atamanroman

3
আমি মনে করি না সুপার () বেস ক্লাস পদ্ধতিতে কল করতে ব্যবহৃত হয়। আপনি যদিও সুপার.মোথড () ব্যবহার করতে পারেন।
ধীররাজ জোশী

@ সানাইজার, @ ধীরাজ: আপনার মতামতের জন্য ধন্যবাদ, আমি আমার উত্তরটি মানিয়ে নিয়েছি
হেইনজি

7

নো-আর্গুমেন্টগুলি সুপার কনস্ট্রাক্টরকে কল করা কেবল পর্দার স্থান এবং প্রোগ্রামার সময়ের অপচয়। সংকলক হুবহু একই কোড উত্পন্ন করে, আপনি এটি লেখেন বা না লিখুন।

class Explicit() {
    Explicit() {
        super();
    }
}

class Implicit {
    Implicit() {
    }
}

আমি এটি কয়েকটি ক্লাসে ব্যবহার করে দেখেছি, উদ্দেশ্য কী তা নিশ্চিত ছিল না। আপনার উত্তর সহায়ক।
ইপ্রশান্ত

6

হ্যাঁ, super()(লোয়ারকেস) পিতামাতা শ্রেণীর একজন কনস্ট্রাক্টরকে কল করে। আপনি যুক্তিগুলি অন্তর্ভুক্ত করতে পারেন:super(foo, bar)

একটি superকীওয়ার্ডও রয়েছে, যা আপনি সুপারক্লাসের একটি পদ্ধতিতে পদ্ধতিতে ব্যবহার করতে পারেন

মধ্যে "জাভা সুপার" ফলাফলের জন্য একটি দ্রুত গুগল এই


4

ঐটা ঠিক. সুপার প্যারেন্ট কনস্ট্রাক্টরকে কল করতে ব্যবহৃত হয়। সুতরাং ধরুন আপনার মত একটি কোড ব্লক আছে

class A{
    int n;
    public A(int x){
        n = x;
    }
}

class B extends A{
    int m;
    public B(int x, int y){
        super(x);
        m = y;
    }
}

তারপরে আপনি সদস্য ভেরিয়েবল n এর জন্য একটি মান নির্ধারণ করতে পারেন।


2

আমি সব উত্তর দেখেছি। তবে প্রত্যেকে একটি অত্যন্ত গুরুত্বপূর্ণ বিষয় উল্লেখ করতে ভুলে গিয়েছিল:

সুপার () কনস্ট্রাক্টরের প্রথম লাইনে কল করা বা ব্যবহার করা উচিত।


1

শুধু সুপার (); এটি ক্লাসের সুপারক্লাসের সাথে উপস্থিত থাকলে কেবলমাত্র ডিফল্ট কনস্ট্রাক্টরকে কল করবে। তবে আপনাকে অবশ্যই স্পষ্টভাবে ডিফল্ট কনস্ট্রাক্টর লিখতে হবে। আপনি যদি জাভা না করেন তবে কোনও বাস্তবায়ন ছাড়াই এটি আপনার জন্য তৈরি করবে, সুপার () সংরক্ষণ করুন; , সর্বজনীন সুপারক্লাস অবজেক্টকে উল্লেখ করে এবং আপনি এটি একটি সাবক্লাসে কল করতে পারবেন না।

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.
   }

}

কোন যুক্তি ছাড়াই ।
লার্নের মারকুইস

1

উদাহরণস্বরূপ, সেলেনিয়াম অটোমেশনে আপনার একটি পৃষ্ঠাঅবজেক্ট রয়েছে যা এর পিতামাতার নির্মাতাকে এভাবে ব্যবহার করতে পারে:

public class DeveloperSteps extends ScenarioSteps {

public DeveloperSteps(Pages pages) {
    super(pages);
}........

1

আমি যা বুঝি কোডগুলির সাথে ভাগ করতে চাই।

জাভাতে সুপার কীওয়ার্ড হল একটি রেফারেন্স ভেরিয়েবল যা পিতামাত্ত শ্রেণীর অবজেক্টগুলিকে উল্লেখ করতে ব্যবহৃত হয়। এটি মূলত নিম্নলিখিত প্রসঙ্গে ব্যবহৃত হয়: -

1. ভেরিয়েবল সহ সুপারের ব্যবহার:

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(); 
    } 
} 

আউটপুট: -

Maximum Speed: 120
  1. পদ্ধতিগুলির সাথে সুপারের ব্যবহার:
/* 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(); 
    } 
}

আউটপুট: -

This is student class
This is person class

৩. নির্মাণকারীদের সাথে সুপারের ব্যবহার:

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(); 
    } 
} 

আউটপুট: -

Person class Constructor
Student class Constructor

0

কনস্ট্রাক্টর কনস্ট্রাক্টর
এ আপনি বিন্দু ছাড়াই অন্য কনস্ট্রাক্টরকে কল করতে পারবেন। superসুপারক্লাসে একটি কনস্ট্রাক্টরকে কল করে; thisএই শ্রেণিতে একজন কনস্ট্রাক্টরকে কল করে:

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সুপারক্লাসটি নিজেকে আরম্ভ করার প্রয়োজন হলে দরকারী। thisআপনাকে সমস্ত হার্ড ইনিশিয়েলশন কোডটি কেবল একবার নির্মাণকারীর মধ্যে একবারে লেখার অনুমতি দেওয়ার জন্য এবং অন্য সমস্ত, সহজেই লেখার থেকে সহজে লেখার জন্য এটি কল করার জন্য দরকারী।

পদ্ধতিগুলি
যে কোনও পদ্ধতিতে, আপনি অন্য কোনও পদ্ধতিতে কল করতে এটি বিন্দুর সাহায্যে ব্যবহার করতে পারেন। super.method()সুপারক্লাসে একটি পদ্ধতি কল করে; this.method()এই শ্রেণিতে একটি পদ্ধতি কল করে:

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নির্দিষ্ট দৃশ্যে কার্যকর: আপনার ক্লাসে যদি আপনার সুপারক্লাসের মতো একই পদ্ধতি থাকে তবে জাভা ধরে নিবে যে আপনি আপনার ক্লাসের একটি চান; superপরিবর্তে আপনাকে সুপারক্লাসের পদ্ধতি জিজ্ঞাসা করতে দেয়। thisআপনার কোডটি আরও পঠনযোগ্য করার উপায় হিসাবে কেবল কার্যকর।


0

সুপার শব্দ সুপারক্লাস কন্সট্রাকটর ডাকতে এবং সুপারক্লাস সদস্য নির্দেশ করতে ব্যবহার করা যেতে পারে

আপনি যখন সঠিক আর্গুমেন্ট সহ সুপার () কল করেন, আমরা আসলে কনস্ট্রাক্টর বক্সকে কল করি যা ভেরিয়েবলের প্রস্থ , উচ্চতা এবং গভীরতা সূচনা করে, সংশ্লিষ্ট পরামিতিগুলির মান ব্যবহার করে এটি উল্লেখ করা হয়। আপনি কেবল এর মান যুক্ত ওজন আরম্ভ করার জন্য রয়েছেন। প্রয়োজনে, আপনি এখন ব্যক্তিগত হিসাবে শ্রেণি ভেরিয়েবল বক্স করতে পারেন । বক্স শ্রেণীর বেসরকারী সংশোধকগুলির ক্ষেত্রগুলিতে লিখুন এবং নিশ্চিত করুন যে কোনও সমস্যা ছাড়াই আপনি এগুলি অ্যাক্সেস করতে পারবেন।

সুপারক্লাসে বেশ কয়েকটি ওভারলোড হওয়া সংস্করণ নির্মাতা হতে পারে, যাতে আপনি বিভিন্ন পরামিতি সহ পদ্ধতিটিকে সুপার () বলতে পারেন । প্রোগ্রামটি নির্ধারকটি সম্পাদন করবে যা নির্দিষ্ট যুক্তিগুলির সাথে মেলে।

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;
    }

}

0

সুপার একটি কীওয়ার্ড। এটি একটি সুপার-ক্লাসে সংজ্ঞায়িত একটি পদ্ধতি কল করতে একটি উপ-শ্রেণীর পদ্ধতি সংজ্ঞায়নের অভ্যন্তরে ব্যবহৃত হয়। সুপারক্লাসের ব্যক্তিগত পদ্ধতিগুলি কল করা যায় না। সুপার কীওয়ার্ড দ্বারা কেবল সর্বজনীন এবং সুরক্ষিত পদ্ধতি কল করা যেতে পারে। এটি ক্লাস কনস্ট্রাক্টররাও এর প্যারেন্ট ক্লাসের কনস্ট্রাক্টরদের ডাকতে ব্যবহার করে।

আরও ব্যাখ্যার জন্য এখানে চেক করুন


0

যেমন বলা হয়েছে, ডিফল্ট কনস্ট্রাক্টরের ভিতরে কনস্ট্রাক্টরের প্রথম লাইনে একটি অন্তর্নিহিত সুপার () বলা হয় ।

এই সুপার () স্বয়ংক্রিয়ভাবে নির্মাণ শ্রেণীর শ্রেণীর শ্রেণিবিন্যাসের শীর্ষে শুরু করে একটি শৃঙ্খলা কল করে এবং শ্রেণিবিন্যাসের নীচে চলে যায়।

প্রোগ্রামের শ্রেণিবিন্যাসে যদি আরও দুটি ক্লাস থাকে তবে শীর্ষ শ্রেণীর ডিফল্ট কনস্ট্রাক্টরকে প্রথমে ডাকা হত ।

এখানে এর উদাহরণ দেওয়া হল:

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();
    }
} 

উপরের আউটপুট হবে:

Constructor A
Constructor B
Constructor C
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.