Loading...

Методдун параметрине объекттерди берүү

 

Примитивдүү типтеги маалыматтар сыяктуу класс объектилери методдорго берилиши мүмкүн. Бирок, бул учурда бир өзгөчөлүк бар – объекттерди өткөрүүдө маани катары бул объект жайгашкан эстутумдагы аймакка шилтеменин көчүрмөсү берилет. Келгиле, кичинекей бир мисалды карап көрөлү. Бизде төмөнкү Person классы бар дейли:

public class Program{

     

    public static void main(String[] args) {

            

        Person kate = new Person("Kate");

        System.out.println(kate.getName());     // Kate

        changeName(kate);

        System.out.println(kate.getName());     // Alice

    }

    static void changeName(Person p){

        p.setName("Alice");

    }

}

class Person{

    

    private String name;

 

    Person(String name){

        this.name = name;

    }

    public void setName(String name){

        this.name = name;

    }

    public String getName(){

    

        return this.name;

    }

}

Бул жерде Person объекти аты өзгөртүлүп жаткан changeName ыкмасына өткөрүлүп берилет. Метод Person объектиси жайгашкан эстутум аймагына шилтеменин көчүрмөсү өткөрүлө тургандыктан, kate өзгөрмөсү жана changeName ыкмасынын p параметри эстутумдагы бир эле объектти көрсөтөт. Ошондуктан, ыкма аткарылгандан кийин, методго өткөрүлүп берилген kate объектинин аты "Кейт" дегенден "Алиса" болуп өзгөрөт.

 

Бул ишти башка учурдан айырмалоо керек:

public class Program{

     

    public static void main(String[] args) {

            

        Person kate = new Person("Kate");

        System.out.println(kate.getName());     // Kate

        changePerson(kate);

        System.out.println(kate.getName());     // Kate - изменения не произошло

                                                // kate хранит ссылку на старый объект

    }

    static void changePerson(Person p){

        p = new Person("Alice");    // p указывает на новый объект

        p.setName("Ann");

    }

    static void changeName(Person p){

        p.setName("Alice");

    }

}

class Person{

    

    private String name;

 

    Person(String name){

        this.name = name;

    }

    public void setName(String name){

        this.name = name;

    }

    public String getName(){

    

        return this.name;

    }

}

ChangePerson ыкмасына Person объектисине шилтеменин көчүрмөсү да өткөрүлүп берилет. Бирок, методдун өзүндө биз объекттин жеке баалуулуктарын өзгөртпөйбүз, бирок конструктор жана жаңы оператор аркылуу объектти кайра түзөбүз. Натыйжада, жаңы Person объектисинин эс тутумунда жаңы орун бөлүнөт жана бул объектке шилтеме p параметрине ыйгарылат:

 

static void changePerson(Person p){

    p = new Person("Alice");    // p указывает на новый объект

    p.setName("Ann");           // изменяется новый объект

}

 

Башкача айтканда, жаңы Person объектисин жараткандан кийин, p параметри жана негизги ыкмадагы kate өзгөрмөсү ар кандай объекттерге шилтемелерди сактайт. Методго өткөрүлүп берилген kate өзгөрмөсү эс тутумда эски объектке шилтемени сактап кала берет. Ошондуктан анын баасы өзгөрбөйт.