জাভাতে ক্লাস ভেরিয়েবলগুলি ওভাররাইড করার কোনও উপায় আছে কি?


161
class Dad
{
    protected static String me = "dad";

    public void printMe()
    {
        System.out.println(me);
    }
}

class Son extends Dad
{
    protected static String me = "son";
}

public void doIt()
{
    new Son().printMe();
}

ফাংশনটি এটি "বাবা" মুদ্রণ করবে। এটিকে "পুত্র" প্রিন্ট করার কোনও উপায় আছে কি?


111
আপনি যদি কোনও সুরক্ষিত স্ট্যাটিক দেখেন তবে চালান।
টম হাটিন - ২

23
@ টমহাউটিন-ট্যাকলাইন আমার অজ্ঞতা ক্ষমা করে দিয়েছে, তবে কেন একটি সুরক্ষিত স্ট্যাটিকটিকে নীচু করা হয়? আমি গুগল করার চেষ্টা করেছি কিন্তু এর সুস্পষ্ট উত্তর খুঁজে পাচ্ছি না। ধন্যবাদ
টনি চ্যান

উত্তর:


68

হ্যাঁ. তবে ভেরিয়েবলটি সম্পর্কিত হিসাবে এটি ওভাররাইট হয় (ভেরিয়েবলকে নতুন মান প্রদান করা হয় the ফাংশনটিতে নতুন সংজ্ঞা দেওয়া ওভাররাইড)।Just don't declare the variable but initialize (change) in the constructor or static block.

অভিভাবক শ্রেণীর ব্লকগুলিতে ব্যবহার করার সময় মানটি প্রতিফলিত হবে

যদি ভেরিয়েবলটি স্থিতিশীল হয় তবে স্ট্যাটিক ব্লকের সাহায্যে সূচনা করার সময় মানটি পরিবর্তন করুন,

class Son extends Dad {
    static { 
       me = 'son'; 
    }
}

অন্যথায় কনস্ট্রাক্টর পরিবর্তন।

আপনি যে কোনও ব্লকে পরে মানটিও পরিবর্তন করতে পারেন। এটি সুপার ক্লাসে প্রতিফলিত হবে


10
আমি মনে করি উত্তরের পাঠযোগ্যতার জন্য উত্তরের কিছু কোড থাকা উচিত। সোনার বাস্তবায়নটি কেবল এতে পরিবর্তন করুন class Son extends Dad { static { me = 'son' } }
ক্লাসিও মেন্ডেস

97

সংক্ষেপে, না, শ্রেণি ভেরিয়েবলকে ওভাররাইড করার কোনও উপায় নেই।

আপনি জাভাতে ক্লাসের ভেরিয়েবলগুলিকে আড়াল করবেন না। ওভাররাইডিং উদাহরণ পদ্ধতিগুলির জন্য। লুকানো ওভাররাইডের থেকে আলাদা।

আপনি যে উদাহরণ দিয়েছেন, ক্লাস সোনে 'আমি' নামের সাথে ক্লাস ভেরিয়েবল ঘোষণা করে আপনি ক্লাস ভেরিয়েবলটি লুকিয়ে রাখেন এটি একই নাম 'আমার' দিয়ে তার সুপারক্লাস বাবা থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হবে। এইভাবে কোনও ভেরিয়েবলটি লুকিয়ে রাখলে সুপারক্লাস বাবা-তে শ্রেণি ভেরিয়েবল 'আমি' এর মান প্রভাবিত করে না।

আপনার প্রশ্নের দ্বিতীয় অংশের জন্য, কীভাবে এটি "পুত্র" প্রিন্ট করা যায়, আমি কনস্ট্রাক্টরের মাধ্যমে মানটি সেট করব। যদিও নীচের কোডটি আপনার মূল প্রশ্নটি থেকে বিস্তৃত হয়েছে, আমি এটিকে কিছু লিখব;

public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public void printName() {
        System.out.println(name);
    }
}

জেএলএস বিভাগ 8.3 - মাঠের ঘোষণাগুলিতে লুকিয়ে থাকার বিষয়ে আরও অনেক বিস্তারিত জানায়


1
উত্পন্ন ক্লাসে একটি স্ট্যাটিক ব্লক থাকার মাধ্যমে ওভাররাইড করা সম্ভব
সিডাগ্রাল

1
@ সিদ্দাগ্রল: আপনি কি বিস্তারিত বলতে পারবেন?
মিস্টার_আর_আমস_ডি

ওপির কোন ক্লাসের Personএই উদাহরণটি প্রতিস্থাপন করা হবে?
n611x007

1
@naxa Sonএবং Dadউত্তরাধিকার সূত্রে প্রাপ্ত হওয়ার কথা Person, তারপরে তাদের নির্মাতাদের কল করুন super("Son or Dad");
পানজিরসিসিস

জাভাতে যেমন ভেরিয়েবলগুলি লুকানো ভাল বা খারাপ বলে বিবেচিত হয়?
পানজিরসিসিস

31

হ্যাঁ, কেবল printMe()পদ্ধতিটি ওভাররাইড করুন :

class Son extends Dad {
        public static final String me = "son";

        @Override
        public void printMe() {
                System.out.println(me);
        }
}

আপনি যে লাইব্রেরিটি ব্যবহার করছেন তা যদি printMe()পদ্ধতি না থাকে , বা এমনকি সেই পদ্ধতিটি এটি স্ট্যাটিক পদ্ধতি হয় তবে কী হবে?
ভেঙ্কট সুধীর রেড্ডি এডামা

1
এটিকে আরও বাস্তব জীবনের উদাহরণ হিসাবে দেখানোর জন্য আপনি বিবেচনা করতে পারেন যে "মুদ্রণযোগ্য" পদ্ধতিটি আপনার পক্ষে পুনরাবৃত্তি করতে চান না এমন যুক্তিযুক্ত একটি জটিল কাজ হতে পারে। এই উদাহরণে, আপনি কেবল ব্যক্তির নাম পরিবর্তন করতে চান, যুক্তিটি এটি মুদ্রণ করে না not আপনার "getName" নামক একটি পদ্ধতি তৈরি করা উচিত যা আপনি "পুত্র" ফেরত দিতে ওভাররাইড করবেন এবং মুদ্রণটির পদ্ধতিটি মুদ্রণের অংশ হিসাবে getName পদ্ধতিকে অনুরোধ করবে।
রিং করুন

17

আপনি একটি গিটার তৈরি করতে পারেন এবং তারপরে সেই গেটরকে ওভাররাইড করতে পারেন। এটি বিশেষভাবে কার্যকর যদি আপনি যে পরিবর্তনশীলটিকে ওভাররাইড করে চলেছেন তা নিজেই একটি উপ-শ্রেণী হয়। আপনার সুপার ক্লাসের একজন Objectসদস্য আছে তা কল্পনা করুন তবে আপনার সাব-ক্লাসে এটি এখন আরও একটি সংজ্ঞাযুক্ত Integer

class Dad
{
        private static final String me = "dad";

        protected String getMe() {
            return me;
        }

        public void printMe()
        {
                System.out.println(getMe());
        }
}

class Son extends Dad
{
        private static final String me = "son";

        @Override
        protected String getMe() {
            return me;
        }
}

public void doIt()
{
        new Son().printMe(); //Prints "son"
}

11

আপনি যদি ওভাররাইড করতে যাচ্ছেন তবে আমি এই স্থির রাখার কোনও বৈধ কারণ দেখতে পাচ্ছি না। আমি বিমূর্তি ব্যবহারের পরামর্শ দেব (উদাহরণ কোড দেখুন)। :

     public interface Person {
        public abstract String getName();
       //this will be different for each person, so no need to make it concrete
        public abstract void setName(String name);
    }

এখন আমরা বাবাকে যুক্ত করতে পারি:

public class Dad implements Person {

    private String name;

    public Dad(String name) {
        setName(name);
    }

    @Override
    public final String getName() {
    return name;
    }

    @Override
    public final void setName(String name) {
        this.name = name;
    }
}

ছেলেটি:

public class Son implements Person {

    private String name;

    public Son(String name) {
        setName(name);
    }

    @Override
    public final String getName() {
        return name;
    }

    @Override
    public final void setName(String name) {
        this.name = name;
    }
}

এবং বাবা একটি সুন্দর মহিলার সাথে দেখা:

public class StepMom implements Person {

    private String name;

    public StepMom(String name) {
        setName(name);
    }

    @Override
    public final String getName() {
        return name;
    }

    @Override
    public final void setName(String name) {
        this.name = name;
    }
}

দেখে মনে হচ্ছে আমাদের একটি পরিবার আছে, আসুন তাদের নাম বিশ্বকে জানান:

public class ConsoleGUI {

    public static void main(String[] args) {
        List<Person> family = new ArrayList<Person>();
        family.add(new Son("Tommy"));
        family.add(new StepMom("Nancy"));
        family.add(new Dad("Dad"));
        for (Person person : family) {
            //using the getName vs printName lets the caller, in this case the
            //ConsoleGUI determine versus being forced to output through the console. 
            System.out.print(person.getName() + " ");
            System.err.print(person.getName() + " ");
            JOptionPane.showMessageDialog(null, person.getName());
    }
}

}

সিস্টেম.আউট আউটপুট: টমি ন্যান্সি ড্যাড সিস্টেম.অর
উপরের মত একই (কেবল লাল ফন্ট রয়েছে)
জোপ আউটপুট:
টমি তারপর
ন্যান্সি তারপরে
বাবা


1
ওপি স্ট্যাটিক্সের অ্যাক্সেস পরিবর্তন সম্পর্কে ছিল। সুতরাং "আমি" একটি জেনেরিক "বাবা" বা "পুত্র" ছিল - এমন কিছু যা প্রতিটি বাবা বা ছেলের জন্য তৈরি করতে প্রয়োজন হয় না এবং তাই এটি একটি স্ট্যাটিক।
রিচিএইচএইচ

হ্যাঁ, আপনার অধিকার, আমি দেখতে পাইনি যে এটি অচল ছিল। হাহাহা, আমার কোডটির প্রায় 100 টি কম লাইনে আমার উত্তর পরিবর্তন করবে, আমি যদি কিছুটা উত্তর দিই তবে।
শীর্ষস্থানীয়দের

6

এটি একটি ডিজাইনের ত্রুটির মতো দেখাচ্ছে।

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


1
এই সম্পর্কে ভুল কি? যদি 'আমি' সদস্যের ভেরিয়েবলটি আপনার ডিজাইনে অতিমাত্রায় যোগ্য বলে মনে করা হয়, তবে প্যাট্রিকের সঠিক সমাধান
চিই

আসলে, প্রতিটি মূল্য হিসাবে যদি আমার মান একই হয় তবে কেবল 'স্ট্যাটিক' অপসারণ করা ঠিক হবে। সূচনাটি কনস্ট্রাক্টরে থাকতে হবে না।
নাট পার্সনস

ঠিক আছে, যদিও প্রযুক্তিগতভাবে (বাইটকোডে) আমি মনে করি এটি প্রায় একই ;-)
প্যাট্রিক কর্নেলিসসেন

4

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

class Dad
  {
    static String me = "dad";

    public void printMe ()
      {
        java.lang.reflect.Field field = this.getClass ().getDeclaredField ("me");
        System.out.println (field.get (null));
      }
  }

খুব আকর্ষণীয়, জাভা.লং.আরফ্লেক্ট হাহ? ... +1
nckbrz

3
class Dad
{
    protected static String me = "dad";

    public void printMe()
    {
        System.out.println(me);
    }
}

class Son extends Dad
{
    protected static String _me = me = "son";
}

public void doIt()
{
    new Son().printMe();
}

... "ছেলে" প্রিন্ট করবে


এটি কি মূল প্রশ্নের মতো নয়?
করলি ব্রিগম্যান

কেন আপনি ব্যাখ্যা করবেন? (আপনার উত্তরে)
মিস্টার_আর_ম্রিএস_ডি

3

https://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html

একে হিডিং ফিল্ডস বলা হয়

উপরের লিঙ্ক থেকে

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


1
একটি সম্ভাব্য সমাধানের একটি লিঙ্ক সর্বদা স্বাগত, তবে দয়া করে লিঙ্কটির চারপাশে প্রসঙ্গটি যুক্ত করুন যাতে আপনার সহ ব্যবহারকারীদের এটি কী এবং কেন আছে তা কিছুটা ধারণা থাকতে পারে। টার্গেট সাইটটি যদি অ্যাক্সেসযোগ্য না হয় বা স্থায়ীভাবে অফলাইনে চলে যায় তবে সর্বদা গুরুত্বপূর্ণ লিঙ্কের সর্বাধিক প্রাসঙ্গিক অংশটি উদ্ধৃত করুন। বিবেচনায় রাখুন যে কোনও বাহ্যিক সাইটের লিঙ্কের চেয়ে সবেমাত্র বেশি হওয়া একটি সম্ভাব্য কারণ কেন এবং কীভাবে কিছু উত্তর মুছে ফেলা হয়?
ফেলিক্সএসএফডি

2

শুধুমাত্র ওভাররাইড করে printMe():

class Son extends Dad 
{
    public void printMe() 
    {
        System.out.println("son");
    }
}

রেফারেন্স meমধ্যে Dad.printMeস্ট্যাটিক মাঠে পদ্ধতি পরোক্ষভাবে পয়েন্ট Dad.meতাই এক উপায় বা অন্য আপনি পরিবর্তন করছি কি printMeকাজ করেন Son...


2

আপনি কোনও শ্রেণিতে ভেরিয়েবলগুলি ওভাররাইড করতে পারবেন না। আপনি কেবলমাত্র পদ্ধতিগুলিকে ওভাররাইড করতে পারেন। আপনার ভেরিয়েবলগুলি ব্যক্তিগত রাখতে হবে অন্যথায় আপনি প্রচুর সমস্যা পেতে পারেন।


আপনি কোনও স্ট্যাটিকস ওভাররাইড করতে পারবেন না।
টম হাটিন - ২

(বা কমপক্ষে এটির কোনও অর্থ হয় না, আইএফএসউইউআইএম।)
টম হাটিন - ২

সঠিক, আপনি স্ট্যাটিকস ওভাররাইড করতে পারবেন না। আপনি এগুলি ছায়াতে পারেন বা কিছু লোক আমাকে মাস্কিং বলে।
ডেল

2

এটি প্রকৃতপক্ষে 'বাবা' মুদ্রণ করে, কারণ ক্ষেত্রটি ওভাররাইড করা হয়নি তবে গোপন। এটি 'পুত্র' প্রিন্ট করার জন্য তিনটি পন্থা রয়েছে:

পন্থা 1: ওভাররাইড প্রিন্টমে

class Dad
{
    protected static String me = "dad";

    public void printMe()
    {
        System.out.println(me);
    }
}

class Son extends Dad
{
    protected static String me = "son";

    @override
    public void printMe()
    {
        System.out.println(me);
    }
}

public void doIt()
{
    new Son().printMe();
}

পদ্ধতির 2: ক্ষেত্রটি আড়াল করবেন না এবং এটি নির্মাণকারীতে আরম্ভ করবেন না

class Dad
{
    protected static String me = "dad";

    public void printMe()
    {
        System.out.println(me);
    }
}

class Son extends Dad
{
    public Son()
    {
        me = "son";
    }
}

public void doIt()
{
    new Son().printMe();
}

পদ্ধতির 3: কনস্ট্রাক্টরের কোনও ক্ষেত্রকে আরম্ভ করার জন্য স্থির মানটি ব্যবহার করুন

class Dad
{
    private static String meInit = "Dad";

    protected String me;

    public Dad() 
    {
       me = meInit;
    }

    public void printMe()
    {
        System.out.println(me);
    }
}

class Son extends Dad
{
    private static String meInit = "son";

    public Son()
    {
        me = meInit;
    }

}

public void doIt()
{
    new Son().printMe();
}

2

চলকগুলি ওভাররাইন্ডিংয়ে অংশ নেয় না। কেবল পদ্ধতিগুলিই করে। রানটাইমের সময় একটি মেথড কল সমাধান করা হয়, অর্থাত, কোনও পদ্ধতি কল করার সিদ্ধান্ত রানটাইমে নেওয়া হয়, তবে ভেরিয়েবলগুলি কেবল সংকলনের সময় সিদ্ধান্ত নেওয়া হয়। সুতরাং যে পরিবর্তনশীল বলা হয় যার রেফারেন্স কলিং জন্য ব্যবহৃত হয় এবং রানটাইম অবজেক্টের জন্য নয়।

নিম্নলিখিত স্নিপেট এক নজরে দেখুন:

package com.demo;

class Bike {
  int max_speed = 90;
  public void disp_speed() {
    System.out.println("Inside bike");
 }
}

public class Honda_bikes extends Bike {
  int max_speed = 150;
  public void disp_speed() {
    System.out.println("Inside Honda");
}

public static void main(String[] args) {
    Honda_bikes obj1 = new Honda_bikes();
    Bike obj2 = new Honda_bikes();
    Bike obj3 = new Bike();

    obj1.disp_speed();
    obj2.disp_speed();
    obj3.disp_speed();

    System.out.println("Max_Speed = " + obj1.max_speed);
    System.out.println("Max_Speed = " + obj2.max_speed);
    System.out.println("Max_Speed = " + obj3.max_speed);
  }

}

আপনি যখন কোডটি চালাবেন, কনসোলটি প্রদর্শিত হবে:

Inside Honda
Inside Honda
Inside bike

Max_Speed = 150
Max_Speed = 90
Max_Speed = 90

0

অবশ্যই ব্যক্তিগত বৈশিষ্ট্যগুলি ব্যবহার করা, এবং গেটার এবং সেটটারগুলি করণীয় হিসাবে প্রস্তাবিত জিনিস হবে তবে আমি নিম্নলিখিতটি পরীক্ষা করেছি এবং এটি কাজ করে ... কোডটিতে মন্তব্য দেখুন

class Dad
{
    protected static String me = "dad";

    public void printMe()
    {
        System.out.println(me);
    }
}

class Son extends Dad
{
    protected static String me = "son";

    /* 
    Adding Method printMe() to this class, outputs son 
    even though Attribute me from class Dad can apparently not be overridden
    */

    public void printMe()
    {
        System.out.println(me);
    }
}

class Tester
{
    public static void main(String[] arg)
    {
        new Son().printMe();
    }
}

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


1
এই ক্ষেত্রে আপনি সুপার ক্লাস থেকে চলকটি "লুকিয়ে" রাখছেন। এটি ওভাররাইডের থেকে পৃথক এবং উত্তরাধিকারের সাথে কোনও সম্পর্ক নেই। অন্যান্য ক্লাসগুলি একটি পরিবর্তনশীল বা অন্যটি দেখতে পাবে যেগুলি বেস-শ্রেণি বা উপ-শ্রেণীর রেফারেন্স করেছে এবং যেটি তারা দেখছে তা সংকলনের সময় স্থির করা হয়েছে কিনা তার উপর নির্ভর করে। আপনি যদি সাব ক্লাসে "আমি" নামটি অন্য কোনও কিছুতে পরিবর্তন করেন তবে আপনি একই প্রভাব পাবেন। বেশিরভাগ আইডিই এবং কোড বৈধকরণ সরঞ্জামগুলি (ফাইন্ডবگز ইত্যাদি) আপনাকে সতর্ক করবে যখন আপনি যখন ভেরিয়েবলগুলি আড়াল করেন তবে এটি সাধারণত আপনি যা করতে চান তা নয়।
অটোমেটেড

আপনি একা কোডিংয়ের দৃষ্টিকোণ থেকে প্রোগ্রামিংয়ের দিকে তাকাচ্ছেন। যা ভাল, কোড তবে আপনি চান সেই ক্ষেত্রে। যদি আপনি কোনও দলের সদস্যের দৃষ্টিকোণ থেকে কোডিংয়ের দিকে নজর দেন, তবে নিয়মগুলি স্পষ্ট হয়ে যায় যেমন ক্ষেত্রগুলি কেন অতিরিক্ত পরিমাণে চালানো যায় না ইত্যাদি। আমি আপনাকে একটি বক্তব্য দিতে পারলাম কেন, তবে যদি আপনি এটি কোনও দলের সদস্যের দৃষ্টিকোণ থেকে দেখছেন না, তবে আপনি আমার পয়েন্টগুলি অবৈধ হিসাবে দেখবেন এবং অবৈধ যুক্তিগুলি আমার দিকে ফিরিয়ে দেবেন।
nckbrz

0

আপনি যখন সাব-ক্লাসে সহজেই পুনরায় নিয়োগ করতে পারেন তখন কেন আপনি ভেরিয়েবলগুলিকে ওভাররাইড করতে চান।

ভাষা নকশাটি ব্যবহার করার জন্য আমি এই প্যাটার্নটি অনুসরণ করি। আপনার কাঠামোর একটি ভারী সার্ভিস ক্লাস রয়েছে যেখানে একাধিক উত্সযুক্ত অ্যাপ্লিকেশনগুলিতে বিভিন্ন স্বাদে ব্যবহার করা দরকার এমন একটি ক্ষেত্রে ধরে নিন that সেই ক্ষেত্রে, সুপার বর্গ যুক্তিকে কনফিগার করার সর্বোত্তম উপায়টি হল তার 'সংজ্ঞায়িত' ভেরিয়েবলগুলি পুনরায় নিয়োগ করা।

public interface ExtensibleService{
void init();
}

public class WeightyLogicService implements ExtensibleService{
    private String directoryPath="c:\hello";

    public void doLogic(){
         //never forget to call init() before invocation or build safeguards
         init();
       //some logic goes here
   }

   public void init(){}    

}

public class WeightyLogicService_myAdaptation extends WeightyLogicService {
   @Override
   public void init(){
    directoryPath="c:\my_hello";
   }

}

0

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

পুত্র বাবাকে মানব প্রসারিত করে

নীচের কোডে, আমরা মানব, বাবা এবং পুত্র অবজেক্টগুলির একটি অ্যারে নিয়ে পুনরাবৃত্তি করার চেষ্টা করি, তবে এটি কলিং অবজেক্টের ধরণ হিউম্যান হিসাবে সমস্ত ক্ষেত্রে হিউম্যান ক্লাসের মান মুদ্রণ করে।

    class Human
{
    static String me = "human";

    public void printMe()
    {
        System.out.println(me);
    }
}
class Dad extends Human
{
    static String me = "dad";

}

class Son extends Dad
{
    static String me = "son";
}


public class ClassVariables {
    public static void main(String[] abc)   {
        Human[] humans = new Human[3];
        humans[0] = new Human();
        humans[1] = new Dad();
        humans[2] = new Son();
        for(Human human: humans)   {
            System.out.println(human.me);        // prints human for all objects
        }
    }
}

ছাপবে

  • মানবীয়
  • মানবীয়
  • মানবীয়

ক্লাস ভেরিয়েবলগুলির কোনও ওভাররাইডিং নেই।

যদি আমরা এর প্যারেন্ট বর্গের একটি রেফারেন্স ভেরিয়েবল থেকে প্রকৃত অবজেক্টের বর্গ ভেরিয়েবলটি অ্যাক্সেস করতে চাই তবে আমাদের স্পষ্টতই এটির জন্য প্যারেন্ট রেফারেন্স (হিউম্যান অবজেক্ট) এর টাইপ করে সংকলককে বলতে হবে।

    System.out.println(((Dad)humans[1]).me);        // prints dad

    System.out.println(((Son)humans[2]).me);        // prints son

ছাপবে

  • বাবা
  • পুত্র

কীভাবে এই প্রশ্নের অংশ: - ইতিমধ্যে পরামর্শ দেওয়া হয়েছে সোনার ক্লাসে প্রিন্টমে () পদ্ধতিটি ওভাররাইড করুন, তারপরে কল করার জন্য

Son().printMe();

বাবার ক্লাস ভেরিয়েবল "আমি" লুকানো থাকবে কারণ "আমি" (সোনার ক্লাসে) এর নিকটতম ঘোষণাপত্র (সন শ্রেণি প্রিন্টমে () পদ্ধতি থেকে) অগ্রাধিকার পাবে।


0

সাব ক্লাস কনস্ট্রাক্টরে সুনির্দিষ্টভাবে কল করুন ari

public abstract class Beverage {

int cost;


int getCost() {

    return cost;

}

}`

public class Coffee extends Beverage {


int cost = 10;
Coffee(){
    super.cost = cost;
}


}`

public class Driver {

public static void main(String[] args) {

    Beverage coffee = new Coffee();

    System.out.println(coffee.getCost());

}

}

আউটপুট 10।

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