Loading...

Класс ичиндеги Класстар (Вложенные классы)

 

Класстар уяланган(Вложенные) болушу мүмкүн, башкача айтканда, аларды башка класстардын ичинде аныктоого болот. Уюшкан класстардын өзгөчө учуру ички класстар (ички класс) болуп саналат. Мисалы, Person классы бар, анын ичинде Account классы аныкталган:

public class Program{

     

    public static void main(String[] args) {

            

        Person tom = new Person("Tom", "qwerty");

        tom.displayPerson();

        tom.account.displayAccount();

    }

}

class Person{

    

    private String name;

    Account account;

 

    Person(String name, String password){

        this.name = name;

        account = new Account(password);

    }

    public void displayPerson(){

        System.out.printf("Person \t Name: %s \t Password: %s \n", name, account.password);

    }

 

    public class Account{

        private String password;

        

        Account(String pass){

            this.password = pass;

        }

        void displayAccount(){

            System.out.printf("Account Login: %s \t Password: %s \n", Person.this.name, password);

        }

    }

}

Ички класс өзүн кадимки класс сыяктуу алып жүрөт, бирок анын объектилери сырткы класстын ичинде гана түзүлүшү мүмкүн.

 

Ички класс сырткы класстын бардык талааларына, анын ичинде жеке өзгөрткүч менен купуя болгондорго кире алат. Ошо сыяктуу эле, тышкы класс ички класстын бардык мүчөлөрүнө, анын ичинде жеке модификациялоочу менен талааларга жана методдорго кире алат.

 

Ички класстан тышкы класстын объектисине шилтемени outer_class.this туюнтмасы аркылуу алууга болот, мисалы, Person.this.

Ички класстардын объекттери ички класстар аныкталган класста гана түзүлүшү мүмкүн. Башка тышкы класстарда ички класстын объектилерин түзүү мүмкүн эмес.

 

Ички класстардын дагы бир өзгөчөлүгү, алар ар кандай контекстте, анын ичинде методдун ичинде жана ал тургай циклде жарыяланышы мүмкүн:

public class Program{

     

    public static void main(String[] args) {

            

        Person tom = new Person("Tom");

        tom.setAccount("qwerty");

    }

}

class Person{

    

    private String name;

 

    Person(String name){

        this.name = name;

    }

    

    public void setAccount (String password){

        

        class Account{

            

            void display(){

                System.out.printf("Account Login: %s \t Password: %s \n", name, password);

            }

        }

        Account account = new Account();

        account.display();

    }

}

Статикалык башка класстардын ичинде аныкталган класстар

Ички класстардан тышкары статикалык башка класстардын ичинде аныкталган класстар да болушу мүмкүн. Статикалык башка класстардын ичинде аныкталган класстар сырткы класстын ичинде кээ бир татаал маалыматты жашырууга мүмкүндүк берет:

class Math{

 

    public static class Factorial{

    

        private int result;

        private int key;

        

        public Factorial(int number, int x){

             

            result=number;

            key = x;

        }

        

        public int getResult(){

            return result;

        }

        

        public int getKey(){

            return key;

        }

    }

    

    public static Factorial getFactorial(int x){

    

        int result=1;

        for (int i = 1; i <= x; i++){

        

            result *= i;

        }

        return new Factorial(result, x);

    }

}

Бул жерде фактордук эсептөө жөнүндө маалыматтарды сактоо үчүн уя класс аныкталган. Негизги аракеттер уяланган класстын объектисин кайтарган getFactorial ыкмасы менен аткарылат. Эми биз класстарды негизги методдо колдонобуз:

public static void main(String[] args) {

        

    Math.Factorial fact = Math.getFactorial(6);

    System.out.printf("%d санынын факториалы%d га барабар \n", fact.getKey(), fact.getResult());

}