Sobes.tech
Middle

პროგრამირების ენაში რა სახის შიდა კლასები არსებობს?

sobes.tech AI

პასუხი AI-სგან

Java- ში შიდა კლასები:

  1. სტატიკური შიდა კლასები (Static Nested Classes): მოპყრობენ როგორც ჩვეულებრივ სტატიკურ წევრებს კლასში. არ აქვთ წვდომა გარეგანი კლასის ნესტატიკ წევრებზე. შექმნილია გარეგანი კლასის ინстанციის გარეშე.

    public class Outer {
        private static String staticMsg = "სტატიკური შეტყობინება";
        private String instanceMsg = "ინსტანციის შეტყობინება";
    
        static class StaticNested {
            void displayStatic() {
                // წვდომა გარეგანი კლასის სტატიკურ წევრებზე
                System.out.println(staticMsg);
                // არ აქვს წვდომა გარეგანი კლასის ნესტატიკ წევრებზე
                // System.out.println(instanceMsg); // კომპილაციის შეცდომა
            }
        }
    }
    
  2. შიდა კლასები (Inner Classes): დაკავშირებულია გარეგანი კლასის ინстанციასთან. აქვთ სრული წვდომა ყველა (სტატიკურ და ნესტატიკ) წევრზე, მათ შორის პირადზე. შეიძლება იყოს private, protected, package-private ან public.

    public class Outer {
        private static String staticMsg = "სტატიკური შეტყობინება";
        private String instanceMsg = "ინსტანციის შეტყობინება";
    
        class Inner {
            void display() {
                // წვდომა სტატიკურ და ნესტატიკ წევრებზე
                System.out.println(staticMsg);
                System.out.println(instanceMsg);
            }
        }
    }
    
  3. ლოკალური კლასები (Local Classes): გამოაცხადება ბლოკის შიგნით (მეთოდი, კონსტრუქტორი ან სტატიკური ინიციალიზატორი). ხელმისაწვდომია მხოლოდ ამ ბლოკში. შეიძლება მიმართოს final ან ეფექტურად final ლოკალურ ცვლადებს და პარამეტრებს, ასევე ყველა გარეგანი წევრს.

    public class Outer {
        private String instanceMsg = "ინსტანციის შეტყობინება";
    
        void methodWithLocalClass() {
            final String localVar = "ლოკალური ცვლადი"; // ან ეფექტურად final
    
            class Local {
                void display() {
                    System.out.println(instanceMsg);
                    System.out.println(localVar);
                }
            }
    
            Local localObj = new Local();
            localObj.display();
        }
    }
    
  4. ანონიმური კლასები (Anonymous Classes): არიან სახელწოდების გარეშე ლოკალური კლასები. გამოიყენება ერთდროულად კლასის გამოცხადებისა და ინстанციის შექმნისთვის, რომელიც ან რეალიზებს ინტერფეისს, ან განავრცობს კლასს. სასარგებლოა პატარა, ერთჯერადი ობიექტების შესაქმნელად.

    public class Outer {
        void methodWithAnonymousClass() {
            // ანონიმური კლასი, რომელიც რეალიზებს Runnable ინტერფეისს
            Runnable myRunnable = new Runnable() {
                @Override
                public void run() {
                    System.out.println("მიმდინარეობს ანონიმურ კლასიდან");
                }
            };
            new Thread(myRunnable).start();
    
            // ანონიმური კლასი, რომელიც განავრცობს Thread კლასს
            Thread myThread = new Thread() {
                @Override
                public void run() {
                    System.out.println("მიმდინარეობს ანონიმურ კლასი, რომელიც განავრცობს Thread-ს");
                }
            };
            myThread.start();
        }
    }
    

შიდა კლასების ტიპების შედარება:

ტიპი განცხადების ადგილი წვდომა გარეგანი კლასის წევრებზე საჭიროა გარეგანი კლასის ინстанცია შექმნას მოდიფიკატორები
სტატიკური შიდა კლასი კლასის შიგნით, static-ით მხოლოდ სტატიკურებზე არა ყველა
შიდა კლასი (Inner) კლასის შიგნით (არა სტატიკური) ყველა (სტატიკური და არა-სტატიკური) დიახ ყველა
ლოკალური კლასი ბლოკის შიგნით (მეთოდი, კონსტრუქტორი, ინიციალიზატორი) ყველა გარეგანი წევრი + final ან ეფექტური final ლოკალური ცვლადები დიახ არა