. دعونا نحلل مقتطف رمز وينفجر في الأسباب الأساسية لهذه الظاهرة. ضع في اعتبارك الكود التالي:
سلسلة خاصة السلسلة العامة foo () { يحاول { s = "dev" ؛ العودة s ؛ } أخيراً { s = "تجاوز المتغير s" ؛ System.out.println ("الدخول في Block أخيرًا") ؛ } } الفراغ الثابت العام الرئيسي (سلسلة [] xyz) { اختبار OBJ = اختبار جديد () ؛ system.out.println (obj.foo ()) ؛ } }عند تنفيذها ، يطبع الكود "إدخال في Block أخيرًا" ولكنه يعيد "Dev." وذلك لأن قيمة الإرجاع يتم تحديدها من خلال تنفيذ عبارة الإرجاع في كتلة المحاولة. يحدث التغيير الذي تم إجراؤه إلى "S" في الكتلة أخيرًا بعد الانتهاء من كتلة المحاولة وبالتالي لا ينعكس في قيمة الإرجاع.
من المهم ملاحظة أن هذا ينطبق على التغييرات في قيمة 's' نفسها ، لا تتغير في مراجع الكائن. إذا كانت "S" مرجعًا إلى كائن قابل للتغيير وتم تغيير محتوياته في الكتلة أخيرًا ، فستكون هذه التغييرات مرئية في قيمة الإرجاع.
public class Test { private String s; public String foo() { try { s = "dev"; return s; } finally { s = "override variable s"; System.out.println("Entry in finally Block"); } } public static void main(String[] xyz) { Test obj = new Test(); System.out.println(obj.foo()); } }
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3