وجود 2 متغيرات بنفس الاسم في الفصل الذي يمتد فئة أخرى في جافا

StackOverflow https://stackoverflow.com/questions/772663

سؤال

فيما يلي جزء من التعليمات البرمجية الخاصة بي للمشروع:

public class Body extends Point{
    public double x, y, mass;

    public Body() {
        x = y = mass = 0;
    }

    public Body(double x, double y, double mass) {
        this.mass = mass;
        this.x = x;
        this.y = y;
    }
}

public class Point {
    public double x;
    public double y;

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }
}

أدركت بسرعة أن القيام بذلك سيخلق اثنين المتغيرات داخل فئة الجسم تسمى X واثنين من المتغيرات الأخرى في الجسم يسمى y. كيف يكون هذا ممكنا، ولماذا على الأرض هل تسمح جافا بذلك؟

أفترض أن هذا هو رمز الجسم الصحيح من الجسم:

public class Body extends Point{
    public double mass;

    public Body() {
        super();
        mass = 0;
    }

    public Body(double x, double y, double mass) {
        super(x,y);
        this.mass = mass;
    }
}

شكرا على وقتك

هل كانت مفيدة؟

المحلول

بمعنى ما، أنت تتجاوز مجالات الطبقة الفائقة. ولكن من الأسهل بكثير أن تفعل بطريق الخطأ لأنه لا يوجد تحميل لحقول (لديك متغير واحد فقط من اسم معين، والنوع لا يهم). يشار إلى ذلك باسم "الاختباء" المتغير أو "التظليل". لذلك، أنت صحيح، سوف ينتهي بك الأمر مع حقلين بنفس الاسم.

مثالك الثاني هو الصحيح. إنها موروثة من الطبقة الفائقة ولأنها لم يتم الإعلان عنها خاصة، فهي مرئية في الفئة الفرعية. من الممارسات السيئة عموما أن تشير مباشرة إلى حقول فائقة من الدرجة، وما لم يكن هناك سبب وجيه، فيجب أن أعلن أنها خاصة. مثال الخاص بك لاستدعاء منشئ السوبر هو أفضل نهج.

أيضا، إذا قمت بإخفاء حقل مع آخر من نفس الاسم، فلا يزال بإمكانك الرجوع إليها باسم Super.x، Super.y، مقابل هذا ..x.y.y، يجب عليك تجنب هذا الموقف إذا كان ذلك ممكنا.

نصائح أخرى

نعم، سيكون لديك متغيرين، مع يختبئ الآخر. من المنطقي السماح لها لسببين:

  1. لنفترض أنك حصلت على فئة أساسية Base وفئة مشتقة Derived الذي مؤلف Base ليس لديه فكرة عنه. يجب أن مؤلف Base لا تتمكن أبدا من إضافة أي حقول، فقط لأن فئة مشتقة ربما مشاركة الحقول؟ أو ينبغي Derived التوقف عن تجميع عندما التغيير إلى Base لا يؤثر في الواقع على صحة؟
  2. يجب أن تكون الحقول الخاصة بك دائما ما تكون خاصة تقريبا، وعندها لا تهم ما إذا كانت الأسماء مكررة أم لا - لن يعرف "الجانب" عن متغيرات الآخر.

بالإضافة إلى ما قاله الآخرون: Body أ Pointب رقم، Body لديه موقف خاصية من النوع Point. وبعد وبالتالي Body ربما لا ينبغي أن تمتد Point. وبعد إذا تخلصت من الميراث (التنفيذ)، فأنت تتخلص من الكثير من المشاكل. هذا واستخدام private (ليس protected!) و final بحرية.

أدركت بسرعة أن القيام بذلك سيؤدي إلى إنشاء متغيرين داخل فئة الجسم المسماة X واثنين من المتغيرات الأخرى في الجسم يسمى y. كيف يكون هذا ممكنا، ولماذا على الأرض هل تسمح جافا بذلك؟

في الواقع لا، أنت لا تخلق متغيرين بنفس الاسم، من الواضح أن مترجم يجب ألا لا يسمح بذلك.

ما أنت نكون القيام به هو تظليل المتغيرات الحالية المعرفة كما x و y, وهذا يعني أن Body.x و Body.y تتداخل بشكل أساسي أسماء Point.x ونقطة، مما يجعل محركين الأخيرين يتعذر الوصول إليه تماما من فئة الجسم (رابط إلى تعريف مواصفات لغة Java ل "التظليل").

يترامح باسم التظليل بشكل عام كممارسة سيئة وسبب البق، وإذا قمت بتحويل تحذيرات جافاك المترجم، فسوف يحذرك المحول البرمجي من هذا الأمر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top