উত্তরাধিকার: সুপারক্লাস থেকে কোডটি কি কার্যত * অনুলিপি করা হয়েছে * সাবক্লাসে, অথবা এটি সাবক্লাস * দ্বারা রেফারেল করা আছে?


10

ক্লাস ক্লাসের Subএকটি সাবক্লাস Sup। এটি ব্যবহারিকভাবে কী বোঝায়? বা অন্য কথায়, "উত্তরাধিকার" এর ব্যবহারিক অর্থ কী?

বিকল্প 1: এসপি থেকে কোডটি কার্যত সাবকে অনুলিপি করা হয়েছে। (ইন হিসাবে 'কপি-পেস্ট', কিন্তু কপি করা কোড ছাড়া চাক্ষুষরূপে উপশ্রেণী দেখা)।

উদাহরণ: methodA()মূলত সুপারিতে একটি পদ্ধতি। সাব সুপারকে প্রসারিত করে, তাই methodA()(কার্যত) সাবকে অনুলিপি করা হয়। এখন সাব একটি নাম পদ্ধতি আছে methodA()কোডের প্রতিটি লাইনেই এটি সুপারের অনুরূপ methodA(), তবে পুরোপুরি সাবের অন্তর্গত - এবং সুপারের উপর নির্ভর করে না বা কোনওভাবেই সুপারের সাথে সম্পর্কিত নয়।

বিকল্প 2: এসপি থেকে কোডটি আসলে সাবটিতে অনুলিপি করা হয়নি। এটি এখনও কেবল সুপারক্লাসে। তবে সেই কোডটি সাবক্লাসের মাধ্যমে অ্যাক্সেস করা যায় এবং সাবক্লাসটি ব্যবহার করতে পারে।

উদাহরণ: methodA()সুপারিতে একটি পদ্ধতি। উপ Sup প্রসারিত, তাই এখন methodA()তাই মত সাব মাধ্যমে অ্যাক্সেস করা যেতে পারে: subInstance.methodA()। কিন্তু এটি আসলে methodA()সুপারক্লাসে প্রার্থনা করবে । যার অর্থ হ'ল মেথডএ () সাবক্লাস দ্বারা ডাকা হলেও, সুপারক্লাসের প্রসঙ্গে কাজ করবে।

প্রশ্ন: দুটি উপায়গুলির মধ্যে কোনটি আসলে কীভাবে কাজ করে? যদি এগুলির কেউ না হয় তবে দয়া করে বর্ণনা করুন যে এই জিনিসগুলি আসলে কীভাবে কাজ করে।


এটি নিজের জন্য পরীক্ষা করা সহজ - কোডটি লিখুন, ক্লাসের ফাইলগুলি পরীক্ষা করুন (এমনকি একটি চেকসামও এটি করবে), সুপার ক্লাসটি পরিবর্তন করুন, আবার সংকলন করুন, আবার ক্লাসের ফাইলগুলি দেখুন। আপনি জেভিএম স্পেসিফিকেশনের জাভা ভার্চুয়াল মেশিনের সংকলন (অধ্যায় 3.7) বিশেষত বুঝতে সহায়তা করতে পারে।

@ মিশেলটি " ভার্চুয়াল অনুলিপি" হ'ল মূলশব্দ । এছাড়াও কোডটি আক্ষরিক অনুলিপি করা হলেও, এটি কেবল ক্লাস লোডিংয়ের পরে ঘটতে পারে।

@ ডেলানান এটি কৌতূহলজনক হবে যদি হটস্পট (বা অন্যান্য রানটাইম অপ্টিমাইজার) কোনও পর্যায়ে কোডটি ইনলাইন করে, তবে এটি জেভিএমের একটি বাস্তবায়নের বিবরণে পরিণত হয় যা এক জেভিএম থেকে অন্য জেফের থেকে পৃথক হতে পারে এবং তাই সঠিক উত্তর দেওয়া যায় না। সর্বোত্তম যেটি করা যায় তা হ'ল সংকলিত বাইটকোড (এবং ইনভোকেস স্পেশাল ওপোড ব্যবহার যা আসলে কী ঘটে তা বর্ণনা করে)

উত্তর:


13

বিকল্প 2।

বাইটকোডটি রানটাইমগুলিতে গতিশীলভাবে উল্লেখ করা হয়: এই কারণেই, লিংকেজএরিয়ারগুলি ঘটে।

উদাহরণস্বরূপ, ধরে নিন আপনি দুটি ক্লাস সংকলন করেছেন:

public class Parent {
  public void doSomething(String x) { ... }
}

public class Child extends Parent {
  @Override
  public void doSomething(String x) {
    super.doSomething(x);
    ...
  }
}

এখন শিশু শ্রেণীর সংশোধন বা সংশোধন না করে পিতামাত্ত শ্রেণীর সংশোধন ও পুনরায় সংকলন করুন :

public class Parent {
  public void doSomething(Collection<?> x) { ... }
}

অবশেষে, এমন একটি প্রোগ্রাম চালান যা শিশু শ্রেণি ব্যবহার করে। আপনি একটি নুশমথোডেরর পাবেন :

যদি অ্যাপ্লিকেশন কোনও শ্রেণীর নির্দিষ্ট পদ্ধতিতে কল করতে চেষ্টা করে তবে তা ফেলে দেওয়া হয় (স্থিতিশীল বা উদাহরণস্বরূপ), এবং সেই শ্রেণীর আর সেই পদ্ধতির কোনও সংজ্ঞা নেই।

সাধারণত, এই ত্রুটিটি সংকলক দ্বারা ধরা পড়ে; এই ত্রুটিটি কেবল রান সময়ে ঘটতে পারে যদি কোনও শ্রেণির সংজ্ঞা অসম্পূর্ণভাবে পরিবর্তিত হয়।


7

দুটি সহজ ক্লাস দিয়ে শুরু করা যাক:

package com.michaelt.so.supers;

public class Sup {
    int methodA(int a, int b) {
        return a + b;
    }
}

এবং তারপর

package com.michaelt.so.supers;

public class Sub extends Sup {
    @Override
    int methodA(int a, int b) {
        return super.methodA(a, b);
    }
}

পদ্ধতিটি সংকলন করে এবং বাইট কোডটি দেখে একটি পায়:

  methodA(II)I
   L0
    LINENUMBER 6 L0
    ALOAD 0
    ILOAD 1
    ILOAD 2
    INVOKESPECIAL com/michaelt/so/supers/Sup.methodA (II)I
    IRETURN
   L1
    LOCALVARIABLE this Lcom/michaelt/so/supers/Sub; L0 L1 0
    LOCALVARIABLE a I L0 L1 1
    LOCALVARIABLE b I L0 L1 2
    MAXSTACK = 3
    MAXLOCALS = 3

এবং আপনি সেখানে সরাসরি আমন্ত্রণমূলক পদ্ধতি সহ দেখতে পাচ্ছেন এটি সুপার ক্লাস পদ্ধতিA () এর বিপরীতে রয়েছে।

Invokespecial opcode নিম্নলিখিত যুক্তিবিজ্ঞান আছে:

  • যদি সিতে সমাধান নামক পদ্ধতির মতো একই নাম এবং বর্ণনাকারী সহ কোনও উদাহরণ পদ্ধতির জন্য কোনও ঘোষণা থাকে, তবে এই পদ্ধতিটি চালু করা হবে। দেখার পদ্ধতিটি সমাপ্ত হয়।
  • অন্যথায়, যদি সি এর একটি সুপারক্লাস থাকে, তবে একই বর্ণন পদ্ধতিটি সি এর সরাসরি সুপারক্লাস ব্যবহার করে পুনরাবৃত্তভাবে সঞ্চালিত হয় oked
  • অন্যথায়, একটি বিমূর্তমঠোডার উত্থাপিত হয়।

এই ক্ষেত্রে, তার ক্লাসে একই নাম এবং বর্ণনাকারীর কোনও উদাহরণ পদ্ধতি নেই তাই প্রথম বুলেটটি আগুন নেবে না। তবে দ্বিতীয় বুলেটটি এটি করবে - একটি সুপারক্লাস রয়েছে এবং এটি সুপারের পদ্ধতিটি আহ্বান করে।

সংকলকটি এটিকে ইনলাইন করে না এবং ক্লাসে সুপের উত্সের কোনও অনুলিপি নেই।

তবে গল্পটি এখনও শেষ হয়নি। এটি কেবল সংকলিত কোড। কোডটি JVM- এ আঘাত করলে হটস্পট জড়িত হতে পারে।

দুর্ভাগ্যক্রমে, আমি এ সম্পর্কে তেমন কিছুই জানি না, তাই আমি এই বিষয়ে কর্তৃত্বের কাছে আবেদন করব এবং জাভাতে ইনলাইনিংয়ে যাব যেখানে বলা হয় যে হটস্পট পদ্ধতিগুলি (এমনকি চূড়ান্ত নয় এমন চূড়ান্ত পদ্ধতি) ইনলাইন করতে পারে।

যাওয়া দস্তাবেজ কার্যকরভাবে Sup methodA থেকে কোড (কপি) উপ methodA মধ্যে () - এটি একটি বিশেষ পদ্ধতি কল পরিবর্তে করছেন যে প্রতিটি সময় অনুসন্ধান, এই তথ্য inlined করা যেতে পারে একটি গরম স্পট হয় তাহলে উল্লেখ করা হয়েছে।

অ্যাপ্লিকেশনটি কীভাবে আচরণ করছে এবং পারফরম্যান্সকে গতি বাড়ানোর জন্য কী কী অপ্টিমাইজেশন করা প্রয়োজন তার উপর ভিত্তি করে এটি রানটাইমে, মেমোরিতে করা হয়।

হটস্পট ইন্টারনালস যেমন ওপেনজেডিকে-তে বলা হয়েছে "পদ্ধতিগুলি প্রায়শই ইনলাইন করা হয় Stat স্ট্যাটিক, বেসরকারী, চূড়ান্ত এবং / অথবা" বিশেষ "অনুরোধগুলি ইনলাইন করা সহজ" "

আপনি যদি জেভিএমের বিকল্পগুলি খনন করেন তবে আপনি একটি বিকল্প পাবেন -XX:MaxInlineSize=35(35 টি ডিফল্ট হবেন ) যা সর্বাধিক সংখ্যক বাইট যা অন্তর্নিহিত হতে পারে। আমি উল্লেখ করব যে এই কারণেই জাভা প্রচুর পরিমাণে ছোট্ট পদ্ধতি পছন্দ করতে পছন্দ করে - কারণ সেগুলি সহজেই ইনলাইন করা যায়। সেই ছোট পদ্ধতি হয়ে দ্রুত যখন তারা আরো কারণ তারা বলা হয় করতে inlined হবে না। এবং যখন কেউ এই সংখ্যাটি নিয়ে খেলতে পারে এবং এটি আরও বড় করে তুলতে পারে তখন এটি অন্যান্য অপ্টিমাইজেশানগুলি কম কার্যকর হতে পারে। (সম্পর্কিত এসও প্রশ্ন: হটস্পট জেআইটি ইনলাইনিং স্ট্র্যাটেজি যা হটস্পট করছে যে ইনলাইনিংয়ের অভ্যন্তরীণ স্থানে উঁকি দেওয়ার জন্য অন্যান্য বেশ কয়েকটি বিকল্প দেখায়)।

সুতরাং, না - সংকলনের সময় কোডটি অন্তর্ভুক্ত নয়। এবং হ্যাঁ - পারফরম্যান্স অপটিমাইজেশন এটির ওয়্যারেন্ট হলে কোডটি রানটাইমের সময় খুব ভালভাবে ইনলাইন করা যেতে পারে।

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


0

কোডটি অনুলিপি করা হয়নি, এটি রেফারেন্সের মাধ্যমে অ্যাক্সেস করা হয়েছে:

  • সাবক্লাস তার পদ্ধতি এবং সুপারক্লাসের উল্লেখ করে
  • সুপারক্লাস তার পদ্ধতি উল্লেখ করে

সংকলকগণ মেমরিতে এটি কীভাবে উপস্থাপিত / সম্পাদিত হয় তা অনুকূল করতে পারে তবে এটি মূলত কাঠামো

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